|
1 | 1 | import { PromptFactory } from "./prompt.factory"; |
2 | 2 | import { IDB } from "./services/db/db.types"; |
3 | 3 | import { DBNode } from "./services/db/dbNode"; |
| 4 | +import { DevDocDBNode } from "./services/db/devDocDBNode"; |
4 | 5 | import { IEmbeddingModel } from "./services/embeddings/embeddings.types"; |
5 | 6 | import { ILLMModel } from "./services/llm/llm.types"; |
6 | 7 |
|
@@ -82,6 +83,75 @@ export namespace Query { |
82 | 83 | return results; |
83 | 84 | } |
84 | 85 |
|
| 86 | + /** |
| 87 | + * Retrieves an array of DevDocDBNodes from the specified vector query. |
| 88 | + * |
| 89 | + * @param {IDB} db - The IDB instance used for the query. |
| 90 | + * @param {string} indexName - The name of the index to query. |
| 91 | + * @param {number[]} vector - The vector used for the query. |
| 92 | + * @param {number} threshold - The minimum score threshold for the query results. |
| 93 | + * @returns {Promise<DevDocDBNode[]>} - A promise that resolves to an array of DevDocDBNodes that match the query criteria. |
| 94 | + */ |
| 95 | + export async function getDevDocDBNodesFromVectorQuery( |
| 96 | + db: IDB, |
| 97 | + indexName: string, |
| 98 | + vector: number[], |
| 99 | + threshold: number |
| 100 | + ): Promise<DevDocDBNode[]> { |
| 101 | + const result = await db.run( |
| 102 | + ` |
| 103 | + CALL db.index.vector.queryNodes("${indexName}", 2, $vector) |
| 104 | + YIELD node, score |
| 105 | + WHERE score >= ${threshold} |
| 106 | + WITH node, score |
| 107 | + OPTIONAL MATCH (node)-[r]->(relatedNode) |
| 108 | + RETURN node, COLLECT(relatedNode) AS relatedNodes, score |
| 109 | + ORDER BY score DESC |
| 110 | + `, |
| 111 | + { vector } |
| 112 | + ); |
| 113 | + if (!result.length) return []; |
| 114 | + |
| 115 | + const nodes: DevDocDBNode[] = []; |
| 116 | + const processRecord = (record: any) => { |
| 117 | + const data = record as DevDocDBNode; |
| 118 | + data.contentEmbeddings = []; |
| 119 | + nodes.push(data); |
| 120 | + }; |
| 121 | + // node |
| 122 | + processRecord(result[0]); |
| 123 | + // relatedNodes |
| 124 | + for (const record of (result as any)[1]) processRecord(record); |
| 125 | + |
| 126 | + return nodes; |
| 127 | + } |
| 128 | + |
| 129 | + /** |
| 130 | + * Retrieves an array of DevDocDBNodes from the provided query. |
| 131 | + * |
| 132 | + * @param {IDB} db - The IDB instance used for querying the database. |
| 133 | + * @param {IEmbeddingModel} embeddingModel - The embedding model used for generating query vectors. |
| 134 | + * @param {string} query - The query string used for searching the database. |
| 135 | + * @returns {Promise<DevDocDBNode[]>} - A promise that resolves to an array of DevDocDBNodes matching the query. |
| 136 | + */ |
| 137 | + export async function getDocsNodesFromQuery( |
| 138 | + db: IDB, |
| 139 | + embeddingModel: IEmbeddingModel, |
| 140 | + query: string |
| 141 | + ): Promise<DevDocDBNode[]> { |
| 142 | + const queryVector = await embeddingModel.generate(query); |
| 143 | + if (!queryVector) return []; |
| 144 | + |
| 145 | + const results: DevDocDBNode[] = await getDevDocDBNodesFromVectorQuery( |
| 146 | + db, |
| 147 | + "contentEmbeddings", |
| 148 | + queryVector, |
| 149 | + 0.7 |
| 150 | + ); |
| 151 | + |
| 152 | + return results; |
| 153 | + } |
| 154 | + |
85 | 155 | /** |
86 | 156 | * Retrieves database keywords from a given query using a language model. |
87 | 157 | * |
|
0 commit comments