@shenghuabi/knowledge 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/embedding/embedding.service.d.ts +4 -0
  2. package/embedding/index.d.ts +2 -0
  3. package/embedding/type.d.ts +12 -0
  4. package/embedding.mjs +61 -0
  5. package/embedding.mjs.map +7 -0
  6. package/file-parser/const.d.ts +20 -0
  7. package/file-parser/dict/dict-format/dsl/dsl-parse.service.d.ts +6 -0
  8. package/file-parser/dict/dict-format/dsl/dsl.format.d.ts +1 -0
  9. package/file-parser/dict/dict-format/mdict-parse.service.d.ts +20 -0
  10. package/file-parser/dict/dict-format/stardict-parse.service.d.ts +12 -0
  11. package/file-parser/dict/dict-format/yaml-parse.service.d.ts +25 -0
  12. package/file-parser/dict/dict.service.d.ts +10 -0
  13. package/file-parser/dict/index.d.ts +2 -0
  14. package/file-parser/dict/type.d.ts +24 -0
  15. package/file-parser/document-file-parser.service.d.ts +15 -0
  16. package/file-parser/document-loader/pdf-img.loader.d.ts +8 -0
  17. package/file-parser/document-loader/xlsx.loader.d.ts +6 -0
  18. package/file-parser/file-parser.service.d.ts +13 -0
  19. package/file-parser/index.d.ts +6 -0
  20. package/file-parser/text-analyse.d.ts +1 -0
  21. package/file-parser/text-parser.d.ts +3 -0
  22. package/file-parser/vl-parser/markdown.parser.d.ts +8 -0
  23. package/file-parser.mjs +850 -0
  24. package/file-parser.mjs.map +7 -0
  25. package/image/convert.d.ts +25 -0
  26. package/image/extract.d.ts +2 -0
  27. package/image/image-metadata.d.ts +2 -0
  28. package/image/index.d.ts +3 -0
  29. package/image.mjs +134 -0
  30. package/image.mjs.map +7 -0
  31. package/knowledge/article/article.knowledge.service.d.ts +53 -0
  32. package/knowledge/article/define/config.d.ts +60 -0
  33. package/knowledge/article/define/index.d.ts +2 -0
  34. package/knowledge/article/define/payload.d.ts +16 -0
  35. package/knowledge/article/index.d.ts +2 -0
  36. package/knowledge/common/common.knowledge.service.d.ts +240 -0
  37. package/knowledge/common/define/base.d.ts +7 -0
  38. package/knowledge/common/define/chunk.d.ts +14 -0
  39. package/knowledge/common/define/embedding.d.ts +5 -0
  40. package/knowledge/common/define/index.d.ts +3 -0
  41. package/knowledge/common/index.d.ts +1 -0
  42. package/knowledge/common/query.d.ts +7 -0
  43. package/knowledge/const.d.ts +95 -0
  44. package/knowledge/define/index.d.ts +245 -0
  45. package/knowledge/dict/define/config.d.ts +68 -0
  46. package/knowledge/dict/define/index.d.ts +1 -0
  47. package/knowledge/dict/dict.knowledge.service.d.ts +67 -0
  48. package/knowledge/graph/const.d.ts +20 -0
  49. package/knowledge/graph/define/config.d.ts +169 -0
  50. package/knowledge/graph/define/define.d.ts +402 -0
  51. package/knowledge/graph/define/index.d.ts +2 -0
  52. package/knowledge/graph/define/query.d.ts +14 -0
  53. package/knowledge/graph/graph.handle.service.d.ts +28 -0
  54. package/knowledge/graph/graph.knowledge.service.d.ts +40 -0
  55. package/knowledge/graph/graph.local.service.d.ts +85 -0
  56. package/knowledge/graph/graph.query.service.d.ts +160 -0
  57. package/knowledge/graph/graph.service.d.ts +24 -0
  58. package/knowledge/graph/graph.util.service.d.ts +31 -0
  59. package/knowledge/graph/type.d.ts +11 -0
  60. package/knowledge/graph/util/format-attr.d.ts +48 -0
  61. package/knowledge/graph/util/graph-util.d.ts +5 -0
  62. package/knowledge/graph/util.d.ts +1 -0
  63. package/knowledge/graph/vecotr-format.d.ts +11 -0
  64. package/knowledge/index.d.ts +17 -0
  65. package/knowledge/knowledge.manager.service.d.ts +42 -0
  66. package/knowledge/knowledge.util.service.d.ts +21 -0
  67. package/knowledge/normal/define/config.d.ts +60 -0
  68. package/knowledge/normal/define/index.d.ts +1 -0
  69. package/knowledge/normal/normal.knowledge.service.d.ts +49 -0
  70. package/knowledge/template.format.d.ts +6 -0
  71. package/knowledge/type.d.ts +28 -0
  72. package/knowledge.mjs +2856 -0
  73. package/knowledge.mjs.map +7 -0
  74. package/ocr/FileUtils.d.ts +4 -0
  75. package/ocr/ImageRaw.d.ts +11 -0
  76. package/ocr/index.d.ts +2 -0
  77. package/ocr/model-config.d.ts +8 -0
  78. package/ocr/ocr.d.ts +29 -0
  79. package/ocr.mjs +351 -0
  80. package/ocr.mjs.map +7 -0
  81. package/package.json +105 -0
  82. package/qdrant/index.d.ts +3 -0
  83. package/qdrant/qdrant-client.service.d.ts +396 -0
  84. package/qdrant/qdrant-server.service.d.ts +21 -0
  85. package/qdrant/type.d.ts +18 -0
  86. package/qdrant/util.d.ts +1 -0
  87. package/qdrant.mjs +274 -0
  88. package/qdrant.mjs.map +7 -0
  89. package/util/batch-queue.d.ts +6 -0
  90. package/util/cache-queue.d.ts +10 -0
  91. package/util/clone.d.ts +1 -0
  92. package/util/embedding-queue.d.ts +3 -0
  93. package/util/get-hash.d.ts +2 -0
  94. package/util/html-to-text/index.d.ts +5 -0
  95. package/util/index.d.ts +10 -0
  96. package/util/is-truthy.d.ts +1 -0
  97. package/util/log.service.d.ts +6 -0
  98. package/util/promise.d.ts +5 -0
  99. package/util/type.d.ts +1 -0
  100. package/util/uniq-object-key.d.ts +1 -0
  101. package/util.mjs +219 -0
  102. package/util.mjs.map +7 -0
  103. package/worker/custom-cache.d.ts +28 -0
  104. package/worker/ocr/index.d.ts +17 -0
  105. package/worker/ocr.mjs +75 -0
  106. package/worker/ocr.mjs.map +7 -0
  107. package/worker/reranker.mjs +180 -0
  108. package/worker/reranker.mjs.map +7 -0
  109. package/worker/set-transformers-config.d.ts +19 -0
  110. package/worker/text2vec/index.d.ts +9 -0
  111. package/worker/text2vec.mjs +194 -0
  112. package/worker/text2vec.mjs.map +7 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../packages/knowledge/knowledge.manager.service.ts", "../packages/knowledge/const.ts", "../packages/knowledge/dict/dict.knowledge.service.ts", "../packages/knowledge/template.format.ts", "../packages/knowledge/knowledge.util.service.ts", "../packages/knowledge/common/define/base.ts", "../packages/knowledge/normal/define/config.ts", "../packages/knowledge/common/define/embedding.ts", "../packages/knowledge/dict/define/config.ts", "../packages/knowledge/common/common.knowledge.service.ts", "../packages/knowledge/graph/graph.knowledge.service.ts", "../packages/knowledge/graph/const.ts", "../packages/knowledge/graph/vecotr-format.ts", "../packages/knowledge/normal/normal.knowledge.service.ts", "../packages/knowledge/graph/define/config.ts", "../packages/knowledge/graph/graph.util.service.ts", "../packages/knowledge/graph/define/define.ts", "../packages/knowledge/graph/util.ts", "../packages/knowledge/graph/graph.local.service.ts", "../packages/knowledge/graph/graph.handle.service.ts", "../packages/knowledge/graph/graph.service.ts", "../packages/knowledge/graph/graph.query.service.ts", "../packages/knowledge/graph/util/graph-util.ts", "../packages/knowledge/graph/util/format-attr.ts", "../packages/knowledge/graph/define/query.ts", "../packages/knowledge/article/article.knowledge.service.ts", "../packages/knowledge/article/define/payload.ts", "../packages/knowledge/article/define/config.ts", "../packages/knowledge/common/define/chunk.ts"],
4
+ "sourcesContent": ["import {\n createInjector,\n inject,\n Injector,\n RootStaticInjectOptions,\n} from 'static-injector';\nimport {\n ImportList,\n KnowledgeCollectionInput,\n KnowledgeConfig,\n KnowledgeType,\n} from './type';\nimport {\n ConfigToken,\n getActivateCollectionName,\n getGraphCollectionName,\n} from './const';\nimport { DictKnowledgeService } from './dict/dict.knowledge.service';\nimport { GraphKnolwdgeService } from './graph/graph.knowledge.service';\nimport type { Provider, R3Injector, Signal } from 'static-injector';\nimport { DictInput, FileParserService } from '@shenghuabi/knowledge/file-parser';\nimport { GraphHandleService } from './graph/graph.handle.service';\nimport { NormalKnowledgeService } from './normal/normal.knowledge.service';\nimport { GraphService } from './graph/graph.service';\nimport { GraphLocalService } from './graph/graph.local.service';\nimport { GraphKnowledgeUtilService } from './graph/graph.util.service';\nimport * as fs from 'fs/promises';\nimport { fileTypeFromBuffer } from 'file-type';\nimport path from 'path';\nimport { ArticleKnowledgeService } from './article';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { LogToken } from '@shenghuabi/knowledge/util';\n\nexport class KnowledgeManagerService extends RootStaticInjectOptions {\n #injector = inject(Injector);\n #fileParser = inject(FileParserService);\n\n #cacheMap = new Map<string, R3Injector>();\n #qdClient = inject(QdrantClientService);\n async getConfig(name: string): Promise<Signal<KnowledgeConfig>> {\n throw new Error('未实现');\n }\n\n protected async getInjector(name: string, extraProviders?: Provider[]) {\n let injector = this.#cacheMap.get(name);\n if (!injector) {\n const config = await this.getConfig(name);\n const CommonProviders: Array<Provider> = [\n { provide: ConfigToken, useValue: config },\n ...(extraProviders ?? []),\n ];\n switch (config().type) {\n case 'normal':\n injector = createInjector({\n providers: [NormalKnowledgeService, ...CommonProviders],\n parent: this.#injector,\n });\n break;\n case 'article':\n injector = createInjector({\n providers: [ArticleKnowledgeService, ...CommonProviders],\n parent: this.#injector,\n });\n break;\n case 'dict':\n injector = createInjector({\n providers: [DictKnowledgeService, ...CommonProviders],\n parent: this.#injector,\n });\n break;\n case 'normal-graph':\n injector = createInjector({\n providers: [\n GraphKnolwdgeService,\n GraphLocalService,\n GraphHandleService,\n GraphService,\n GraphKnowledgeUtilService,\n ...CommonProviders,\n ],\n parent: this.#injector,\n });\n break;\n default:\n throw '';\n }\n this.#cacheMap.set(name, injector);\n }\n return injector;\n }\n async #get(name: string) {\n const injector = await this.getInjector(name);\n const config = injector.get(ConfigToken);\n switch (config().type) {\n case 'normal':\n return injector.get(NormalKnowledgeService);\n case 'dict':\n return injector.get(DictKnowledgeService);\n case 'normal-graph':\n return injector.get(GraphKnolwdgeService);\n case 'article':\n return injector.get(ArticleKnowledgeService);\n default:\n throw new Error('');\n }\n }\n\n async create(name: string, collection: KnowledgeCollectionInput) {\n const instance = await this.#get(name);\n await instance.create(instance.formatCollection(collection));\n }\n /** 普通知识库和图谱知识库用 */\n async importFiles(\n name: string,\n filePathList: string[],\n signal?: AbortSignal,\n ) {\n const injector = await this.getInjector(name);\n const logService = injector.get(LogToken);\n const instance = (await this.#get(name)) as\n | NormalKnowledgeService\n | GraphKnolwdgeService;\n for (const filePath of filePathList) {\n if (signal?.aborted) {\n return;\n }\n const content = await fs.readFile(filePath);\n const list = await this.#fileParser.parse(filePath, content);\n for (const item of list) {\n if (signal?.aborted) {\n return;\n }\n logService.info(`正在导入 ${filePath}/${item.title}`);\n const content = item.content.trim();\n if (content) {\n await instance.insertItem(item.title, content, signal);\n } else {\n logService.warn(`内容为空 ${filePath}/${item.title}`);\n }\n }\n }\n }\n /** 字典专用 */\n async importDict(name: string, input: DictInput) {\n const instance = (await this.#get(name)) as DictKnowledgeService;\n return await instance.importDict(input);\n }\n async get(name: string) {\n return (await this.#get(name)) as\n | DictKnowledgeService\n | NormalKnowledgeService\n | GraphKnolwdgeService\n | ArticleKnowledgeService;\n }\n\n async importTextFile(\n name: string,\n dir: string,\n filePathList: string[],\n signal?: AbortSignal,\n ) {\n const injector = await this.getInjector(name);\n const logService = injector.get(LogToken);\n // 文件列表应该是相对的,需要工作空间的dir\n const instance = (await this.#get(name)) as ArticleKnowledgeService;\n for (const filePath of filePathList) {\n if (signal?.aborted) {\n return;\n }\n logService.info(`正在导入 ${filePath}`);\n const buffer = await fs.readFile(path.join(dir, filePath));\n const type = await fileTypeFromBuffer(buffer);\n if (type) {\n continue;\n }\n let content;\n try {\n content = buffer.toString();\n } catch (error) {\n continue;\n }\n await instance.insertItem(filePath, content);\n }\n }\n async deleteItem(name: string, fileName: string) {\n const instance = (await this.#get(name)) as\n | NormalKnowledgeService\n | GraphKnolwdgeService;\n await instance.deleteItem(fileName);\n }\n async updateItem(name: string, fileName: string, content: string) {\n const instance = (await this.#get(name)) as\n | NormalKnowledgeService\n | GraphKnolwdgeService;\n await instance.updateItem(fileName, content);\n }\n /** 通用接口 */\n async addCollection(name: string, collection: KnowledgeCollectionInput) {\n const instance = await this.#get(name);\n await instance.addCollection(instance.formatCollection(collection));\n }\n /** 通用接口 */\n async deleteCollection(name: string, collectionName: string) {\n const instance = await this.#get(name);\n return await instance.deleteCollection(collectionName);\n }\n async changeActivateCollection(name: string, collectionName: string) {\n const instance = await this.#get(name);\n await instance.changeActivateCollection(collectionName);\n }\n async destroy(name: string) {\n const instance = await this.#get(name);\n this.#cacheMap.delete(name);\n await instance.destroy();\n }\n async export(name: string) {\n const instance = await this.#get(name);\n return await instance.export();\n }\n async import(\n name: string,\n options: {\n snapshotList: ImportList;\n activateCollection: string;\n type: KnowledgeType;\n },\n ) {\n const logService = (await this.getInjector(name)).get(LogToken);\n for (const item of options.snapshotList) {\n logService.info(`正在导入 ${item.collection}`);\n await this.#qdClient.recoverSnapshot(item.collection, {\n location: item.filePath,\n priority: 'no_sync',\n checksum: item.checksum,\n });\n }\n await this.#qdClient.setActivateCollection(\n options.activateCollection,\n getActivateCollectionName(name),\n );\n if (options.type === 'normal-graph') {\n await this.#qdClient.setActivateCollection(\n getGraphCollectionName(options.activateCollection),\n getActivateCollectionName(getGraphCollectionName(name)),\n );\n }\n }\n async getGraph(name: string) {\n const injector = await this.getInjector(name);\n return injector.get(GraphService);\n }\n}\n", "import { InjectionToken, Signal } from 'static-injector';\nimport { KnowledgeConfig, OCR, Text2Vec, TextSplitter } from './type';\nexport function getGraphCollectionName(name: string) {\n return `[图谱]${name}-定义`;\n}\n/** 进行增加删除的永远是这个 */\nexport function getActivateCollectionName(name: string) {\n return `${name}[激活]`;\n}\n\nexport const DICT_PREFIX = '[字典]-';\n\nexport const Text2VecToken = new InjectionToken<Text2Vec>('text2vec');\n\n// 解析结果需要自动过滤空pageContent\nexport const TextSplitterToken = new InjectionToken<TextSplitter>(\n 'TextSplitter',\n);\n\nexport const ConfigToken = new InjectionToken<Signal<KnowledgeConfig>>(\n 'config',\n);\nexport const GetConfigToken = new InjectionToken<\n (name: string) => Promise<KnowledgeConfig>\n>('getConfig');\n\nexport const OCRToken = new InjectionToken<OCR>('OCR');\n\nexport const DirToken = new InjectionToken<Signal<string>>('dir');\n\nexport const ReRankerToken = new InjectionToken<{\n run: (text: {\n value: string;\n docs: string[];\n }) => Promise<{ index: number; score: any }[]>;\n getQueryRatio(): number;\n}>('reranker');\n", "import { computed, inject, Signal } from 'static-injector';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport {\n ConfigToken,\n DirToken,\n OCRToken,\n ReRankerToken,\n Text2VecToken,\n TextSplitterToken,\n} from '../const';\nimport { DictInput, DictService, WordItem } from '@shenghuabi/knowledge/file-parser';\nimport { v4 } from 'uuid';\nimport { promise as fastq } from 'fastq';\nimport {\n BatchQueue,\n CacheQueue,\n html2Text,\n isTruthy,\n LogToken,\n} from '@shenghuabi/knowledge/util';\nimport { entryFormat } from '../template.format';\nimport { createNormalizeVfs, path } from '@cyia/vfs2';\nimport { KnowledgeUtilService } from '../knowledge.util.service';\nimport {\n DictCollectionDefine,\n DictCollectionInlineType,\n DictKnowledgeConfigInline,\n} from './define/config';\nimport * as v from 'valibot';\nimport { CommonKnowledgeService } from '../common/common.knowledge.service';\nimport { QueryOptions } from '../common/query';\n\nexport class DictKnowledgeService extends CommonKnowledgeService {\n #text2vec = inject(Text2VecToken);\n #reranker = inject(ReRankerToken);\n\n #textSplitter = inject(TextSplitterToken);\n #ocr = inject(OCRToken, { optional: true }) || undefined;\n #config = inject<Signal<DictKnowledgeConfigInline>>(ConfigToken);\n #vfs = computed(() => createNormalizeVfs({ dir: this.#dir() }));\n #qdClient = inject(QdrantClientService);\n #dict = inject(DictService);\n #util = inject(KnowledgeUtilService);\n #dir = inject(DirToken);\n #log = inject(LogToken);\n formatCollection(input: any) {\n return v.parse(DictCollectionDefine, input);\n }\n async #createCollection(collection: DictCollectionInlineType) {\n const { exists } = await this.#qdClient.collectionExists(\n collection.collectionName,\n );\n if (exists) {\n throw new Error(`集合${collection.collectionName}已存在`);\n }\n await this.#qdClient.createCollection(collection.collectionName, {\n vectors: {\n chunk: {\n size: collection.size,\n distance: 'Cosine',\n on_disk: true,\n },\n word: {\n size: collection.size,\n distance: 'Cosine',\n on_disk: true,\n },\n },\n });\n await this.#qdClient.createPayloadKeywordIndex(\n collection.collectionName,\n 'word',\n );\n await this.#qdClient.createPayloadKeywordIndex(\n collection.collectionName,\n 'chunk',\n );\n await this.#qdClient.createPayloadKeywordIndex(\n collection.collectionName,\n 'content',\n );\n }\n /** 只创建这一次,剩下的都是插入或更新 */\n async create(collection: DictCollectionInlineType) {\n await this.#createCollection(collection);\n await this.#qdClient.setActivateCollection(\n this.#config().name,\n this.#config().activateName,\n );\n }\n async #getImportQueue(\n collection: DictCollectionInlineType,\n /** 是否要处理资源,主要是克隆用 */ assetHandle: boolean,\n ) {\n /** 资源文件夹 */\n const assetFolder = path.join(this.#dir(), 'assets');\n const contentBatchQueue = new BatchQueue((str: string[]) =>\n this.#text2vec(str, collection.collectionName),\n );\n let sum = 0;\n const updateCacheQueue = this.#util.updatePointsQueue<\n { word: number[]; chunk: number[] },\n Record<string, any>\n >(collection.collectionName);\n let updateError: Error | undefined;\n updateCacheQueue.queue.error((error) => {\n if (error) {\n updateError = error;\n updateCacheQueue.queue.killAndDrain();\n }\n });\n\n const importCacheQueue = new CacheQueue(\n fastq(async (wordList: WordItem[]) => {\n /** 数据预处理 */\n const preMergeList = (\n await Promise.all(\n wordList.map(async (entryItem) => {\n // 词条提取\n if (assetHandle) {\n if (this.#config().extractorWord) {\n this.#vfs().write(entryItem.word, entryItem.content);\n }\n }\n const formatedContent = assetHandle\n ? await this.#formatContent(entryItem, assetFolder, {\n useOcr: this.#config().useOcr,\n refReplace: true,\n })\n : (entryItem as any).formatedContent || entryItem.content;\n const splitContentList = (\n await this.#textSplitter(\n formatedContent,\n {\n ...entryItem,\n formatedContent,\n },\n collection.collectionName,\n )\n ).filter((item) => !!item.pageContent.trim());\n if (!splitContentList.length) {\n return undefined;\n }\n return {\n word: entryItem.word,\n contentList: splitContentList\n .map((item) => {\n const pageContent = item.pageContent.trim();\n const metadata = {\n ...item.metadata,\n chunk: pageContent,\n } as Record<string, any>;\n const embeddingChunk = entryFormat(\n metadata,\n this.#config().name,\n `${metadata['word']}\\n${pageContent}`,\n collection.embeddingTemplate?.entry,\n );\n if (!embeddingChunk) {\n this.#log.warn(\n `内容格式化后内容为空,跳过\\n${JSON.stringify({ payload: metadata, knowledge: this.#config().name, pageContent })}`,\n );\n return;\n }\n metadata['embeddingChunk'] = embeddingChunk;\n return {\n chunk: embeddingChunk,\n metadata: metadata,\n };\n })\n .filter(isTruthy),\n };\n }),\n )\n )\n .filter(isTruthy)\n .filter((item) => !!item.contentList.length);\n if (!preMergeList.length) {\n return;\n }\n const [wordVecResult, contentVecResult] = await Promise.all([\n this.#text2vec(\n preMergeList.map((item) => item.word),\n collection.collectionName,\n ),\n contentBatchQueue.then(\n Promise.all(\n preMergeList.flatMap((item) =>\n item.contentList.map((item) =>\n contentBatchQueue.push(item.chunk),\n ),\n ),\n ),\n ),\n ]);\n\n let startIndex = 0;\n\n for (let i = 0; i < preMergeList.length; i++) {\n const preData = preMergeList[i];\n const wordVector = wordVecResult[i];\n const endIndex = startIndex + preData.contentList.length;\n const extResult = contentVecResult.slice(startIndex, endIndex);\n startIndex = endIndex;\n extResult.forEach((item, j) => {\n updateCacheQueue.push({\n id: v4(),\n vector: {\n word: wordVector,\n chunk: extResult[j],\n },\n payload: preData.contentList[j].metadata,\n });\n });\n }\n\n sum += wordList.length;\n this.#log.info(`已导入 ${sum} 条`);\n }, 2),\n 256,\n );\n importCacheQueue.queue.error((error) => {\n if (error) {\n updateError = error;\n importCacheQueue.queue.killAndDrain();\n }\n });\n return {\n importQueue: importCacheQueue,\n getSum: () => sum,\n updateQueue: updateCacheQueue,\n getError() {\n return updateError;\n },\n };\n }\n async importDict(input: DictInput) {\n const collection = this.#config().collectionList[0];\n /** 知识库保存的名字 */\n return this.#dict\n .importDict(this.#config().name, this.#dir(), input)\n .then(async (generator) => {\n const { importQueue, getSum, updateQueue, getError } =\n await this.#getImportQueue(collection, true);\n\n for await (const item of generator) {\n importQueue.push(item);\n }\n importQueue.complete();\n await importQueue.queue.drained();\n updateQueue.complete();\n await updateQueue.queue.drained();\n const error = getError();\n if (error) {\n throw error;\n }\n return getSum();\n })\n .catch(async (rej) => {\n this.#log.error(`导入失败`, rej);\n // 导入失败自动销毁\n await this.destroy();\n throw rej;\n });\n }\n\n async #formatContent(\n wordItem: WordItem,\n assetFolder: string,\n options: {\n useOcr?: boolean;\n refReplace: boolean;\n },\n ) {\n const result = await html2Text(wordItem.htmlContent ?? wordItem.content, {\n useOcr: options.useOcr,\n ocrFn: this.#ocr,\n assetFolder: assetFolder,\n });\n return options.refReplace ? result.replaceAll(`~`, wordItem.word) : result;\n }\n\n async addCollection(collection: DictCollectionInlineType) {\n await this.#createCollection(collection);\n\n const { importQueue, updateQueue, getError } = await this.#getImportQueue(\n collection,\n false,\n );\n\n try {\n let offset: any;\n const activateCollectionName = this.#config().activateName;\n const wordSet = new Set<string>();\n do {\n const { points, next_page_offset } = await this.#qdClient.scroll(\n activateCollectionName,\n {\n limit: 5000,\n with_payload: true,\n offset: offset,\n },\n );\n for (const point of points) {\n // 跳过已存在的词条(因为没用实体文件,所以是需要id标记)\n const id = `${point.payload!['word']}|${point.payload!['formatedContent'] || point.payload!['content']}`;\n if (wordSet.has(id)) {\n continue;\n }\n wordSet.add(id);\n importQueue.push(point.payload as any);\n }\n offset = next_page_offset;\n } while (offset);\n importQueue.complete();\n await importQueue.queue.drained();\n updateQueue.complete();\n await updateQueue.queue.drained();\n const error = getError();\n if (error) {\n throw error;\n }\n } catch (error) {\n await this.#qdClient.deleteCollection(collection.collectionName);\n throw error;\n }\n\n await this.#qdClient.setActivateCollection(\n collection.collectionName,\n this.#config().activateName,\n );\n }\n\n async deleteCollection(collectionName: string) {\n const isActivate = this.#config().activateCollection === collectionName;\n if (isActivate) {\n return false;\n }\n const collection = this.#config().collectionList.find(\n (item) => item.collectionName === collectionName,\n )!;\n if (!collection) {\n return false;\n }\n await this.#qdClient.deleteCollection(collectionName);\n return true;\n }\n async changeActivateCollection(collectionName: string) {\n await this.#qdClient.setActivateCollection(\n collectionName,\n this.#config().activateName,\n );\n }\n export() {\n return this.#util.export(\n this.#config().collectionList.map(({ collectionName }) => collectionName),\n );\n }\n\n async destroy() {\n return this.#util.destroyKnowledge(\n this.#config().collectionList.map(({ collectionName }) => collectionName),\n this.#vfs(),\n );\n }\n\n async searchWord(text: string, options: QueryOptions) {\n const queryResult = await this.#qdClient.search(\n this.#config().activateName,\n {\n limit: options.limit\n ? options.limit * this.#reranker.getQueryRatio()\n : undefined,\n with_payload: true,\n with_vector: false,\n score_threshold: options.score,\n offset: options.offset,\n vector: {\n name: 'word',\n vector: await this.#text2vec(text, this.#config().activateCollection),\n },\n },\n );\n const resultList = await this.#reranker.run({\n value: text,\n docs: queryResult.map((item) => item.payload?.['word']! as string),\n });\n return resultList\n .slice(0, options?.limit)\n .map(({ index }) => queryResult[index]);\n }\n /** 当普通数据库用 */\n matchWord(text: string, options: { limit: number }) {\n return this.#qdClient.scroll(this.#config().activateName, {\n limit: options.limit,\n filter: {\n must: {\n key: 'word',\n match: {\n value: text,\n },\n },\n },\n with_payload: true,\n with_vector: false,\n });\n }\n}\n", "import hbs from 'handlebars';\n\nexport function interpolate(input: string, value: Record<string, any>) {\n return hbs.compile(input, { noEscape: true, preventIndent: true })(value, {\n allowProtoPropertiesByDefault: true,\n });\n}\n/** 词条格式化 */\nexport function entryFormat(\n payload: Record<string, any>,\n knowledge: string,\n defaultContent: string,\n embedingTemplate?: {\n value?: string;\n enable: boolean;\n },\n) {\n return embedingTemplate?.enable && embedingTemplate?.value\n ? interpolate(embedingTemplate.value, {\n ENTRY: { ...payload, knowledge },\n }).trim()\n : defaultContent;\n}\n", "import { inject, RootStaticInjectOptions } from 'static-injector';\nimport { QdrantClient } from '@qdrant/qdrant-js';\nimport { CacheQueue } from '@shenghuabi/knowledge/util';\nimport { promise as fastq } from 'fastq';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { NormalizeFs } from '@cyia/vfs2';\n\nexport class KnowledgeUtilService extends RootStaticInjectOptions {\n #qdClient = inject(QdrantClientService);\n\n multiDelete(list: string[], filter: Parameters<QdrantClient['delete']>[1]) {\n return Promise.all(list.map((item) => this.#qdClient.delete(item, filter)));\n }\n\n updatePointsQueue<\n Vector extends Record<string, number[]>,\n Payload extends Record<string, any>,\n >(collectionName: string) {\n return new CacheQueue(\n fastq(\n (\n list: {\n id: string | number;\n vector: Vector;\n payload: Payload;\n }[],\n ) =>\n this.#qdClient.upsert(collectionName, {\n wait: true,\n points: list,\n }),\n 8,\n ),\n 20,\n );\n }\n\n async destroyKnowledge(list: string[], vfs?: NormalizeFs) {\n await Promise.all(\n list.map((collectionName) =>\n this.#qdClient.deleteCollection(collectionName),\n ),\n );\n if (vfs && (await vfs.exists(''))) {\n await vfs.rm('', { recursive: true, force: true });\n }\n }\n export(list: string[]) {\n return Promise.all(\n list.map((collectionName) =>\n this.#qdClient.createSnapshot(collectionName).then((result) => ({\n ...result,\n collection: collectionName,\n })),\n ),\n );\n }\n}\n", "import * as v from 'valibot';\nexport const BaseKnowledgeConfig = v.object({\n /** 知识库名 */\n name: v.string(),\n activateCollection: v.string(),\n});\nexport type BaseKnowledgeConfigType = v.InferOutput<typeof BaseKnowledgeConfig>;\n", "import * as v from 'valibot';\nimport { EmbeddingTemplateDefine } from '../../common/define/embedding';\nimport { BaseKnowledgeConfig } from '../../common/define/base';\nimport { getActivateCollectionName } from '../../const';\nexport const NormalCollectionDefine = v.object({\n collectionName: v.string(),\n embeddingTemplate: v.optional(\n v.object({\n entry: v.optional(EmbeddingTemplateDefine),\n }),\n ),\n size: v.number(),\n});\n\nexport const NormalKnowledgeConfigDefine = v.pipe(\n v.object({\n ...BaseKnowledgeConfig.entries,\n type: v.optional(v.literal('normal'), 'normal'),\n collectionList: v.array(NormalCollectionDefine),\n }),\n v.transform((item) => ({\n ...item,\n /** 激活的普通知识库(文件切片) */\n activateName: getActivateCollectionName(item.name),\n })),\n);\n\nexport type NormalKnowledgeConfig = v.InferInput<\n typeof NormalKnowledgeConfigDefine\n>;\nexport type NormalKnowledgeConfigInline = v.InferOutput<\n typeof NormalKnowledgeConfigDefine\n>;\nexport type NormalCollectionInput = v.InferInput<typeof NormalCollectionDefine>;\nexport type NormalCollectionInlineType = v.InferOutput<\n typeof NormalCollectionDefine\n>;\n", "import * as v from 'valibot';\nexport const EmbeddingTemplateDefine = v.object({\n enable: v.boolean(),\n value: v.optional(v.string()),\n});\n", "import { BaseKnowledgeConfig } from '../../common/define/base';\nimport { getActivateCollectionName } from '../../const';\nimport { NormalCollectionDefine } from '../../normal/define/config';\nimport * as v from 'valibot';\n\nexport const DictCollectionDefine = NormalCollectionDefine;\n\nexport const DictKnowledgeConfigDefine = v.pipe(\n v.object({\n ...BaseKnowledgeConfig.entries,\n type: v.optional(v.literal('dict'), 'dict'),\n collectionList: v.array(DictCollectionDefine),\n /** 词条提取 */\n extractorWord: v.optional(v.boolean()),\n /** 图像识别 */\n useOcr: v.optional(v.boolean()),\n }),\n v.transform((item) => ({\n ...item,\n /** 激活的普通知识库(文件切片) */\n activateName: getActivateCollectionName(item.name),\n })),\n);\n\nexport type DictKnowledgeConfig = v.InferInput<\n typeof DictKnowledgeConfigDefine\n>;\nexport type DictKnowledgeConfigInline = v.InferOutput<\n typeof DictKnowledgeConfigDefine\n>;\nexport type DictCollectionInput = v.InferInput<typeof DictCollectionDefine>;\nexport type DictCollectionInlineType = v.InferOutput<\n typeof DictCollectionDefine\n>;\n", "import { inject, Signal } from 'static-injector';\nimport { ConfigToken, ReRankerToken, Text2VecToken } from '../const';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { BaseKnowledgeConfigType } from './define/base';\nimport { FilterOptions, QueryOptions } from './query';\n\nexport class CommonKnowledgeService {\n #qdClient = inject(QdrantClientService);\n #config =\n inject<Signal<BaseKnowledgeConfigType & { activateName: string }>>(\n ConfigToken,\n );\n #text2vec = inject(Text2VecToken);\n #reranker = inject(ReRankerToken);\n\n async searchChunk(\n text: string,\n filter?: FilterOptions,\n options?: QueryOptions,\n ) {\n const queryResult = await this.#qdClient.search(\n this.#config().activateName,\n {\n limit: options?.limit\n ? options.limit * this.#reranker.getQueryRatio()\n : undefined,\n filter,\n with_payload: true,\n with_vector: false,\n score_threshold: options?.score,\n offset: options?.offset,\n vector: {\n name: 'chunk',\n vector: await this.#text2vec(text, this.#config().activateCollection),\n },\n },\n );\n\n const resultList = await this.#reranker.run({\n value: text,\n docs: queryResult.map(\n (item) => item.payload?.['embeddingChunk']! as string,\n ),\n });\n return resultList\n .slice(0, options?.limit)\n .map(({ index }) => queryResult[index]);\n }\n getCollection() {\n return this.#qdClient.getCollection(this.#config().activateName);\n }\n}\n", "import { inject, Injector, Signal } from 'static-injector';\nimport { ConfigToken, getGraphCollectionName, Text2VecToken } from '../const';\nimport { KnowledgeUtilService } from '../knowledge.util.service';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { LogToken } from '@shenghuabi/knowledge/util';\nimport { promise as fastq } from 'fastq';\n\nimport { ContentParserToken } from './const';\nimport { entryFormat } from '../template.format';\nimport { edgeVectorString, nodeVectorString } from './vecotr-format';\nimport { v4 } from 'uuid';\nimport { NormalKnowledgeService } from '../normal/normal.knowledge.service';\nimport {\n GraphCollectionDefine,\n GraphCollectionInlineType,\n GraphKnowledgeConfigInline,\n} from './define/config';\nimport * as v from 'valibot';\nimport { GraphKnowledgeUtilService } from './graph.util.service';\nimport { GraphLocalService } from './graph.local.service';\nimport { FileChunkPayload } from '../common/define/chunk';\nimport { BatchQueue } from '@shenghuabi/knowledge/util';\n\nexport class GraphKnolwdgeService extends NormalKnowledgeService {\n #text2vec = inject(Text2VecToken);\n #config = inject<Signal<GraphKnowledgeConfigInline>>(ConfigToken);\n #util = inject(KnowledgeUtilService);\n #graphUtil = inject(GraphKnowledgeUtilService);\n #qdClient = inject(QdrantClientService);\n #channel = inject(LogToken);\n #injector = inject(Injector);\n #contentParser = inject(ContentParserToken);\n #graphLocal = inject(GraphLocalService);\n\n override formatCollection(input: any) {\n return v.parse(GraphCollectionDefine, input);\n }\n async #createCollection(collection: GraphCollectionInlineType) {\n const collectionName = getGraphCollectionName(collection.collectionName);\n this.#channel.info(`创建图集合:${collectionName}`);\n const { exists } = await this.#qdClient.collectionExists(collectionName);\n if (exists) {\n throw new Error(`集合${collectionName}已存在`);\n }\n await this.#qdClient.createCollection(collectionName, {\n vectors: {\n chunk: {\n size: collection.size,\n distance: 'Cosine',\n on_disk: true,\n },\n },\n });\n this.#channel.info(`创建图索引`);\n\n await this.#qdClient.createPayloadKeywordIndex(collectionName, 'kind');\n await this.#qdClient.createPayloadKeywordIndex(collectionName, 'fileName');\n await this.#qdClient.createPayloadKeywordIndex(collectionName, 'name');\n await this.#qdClient.createPayloadKeywordIndex(collectionName, 'source');\n await this.#qdClient.createPayloadKeywordIndex(collectionName, 'target');\n }\n override async create(collection: GraphCollectionInlineType) {\n await super.create(collection);\n await this.#createCollection(collection);\n await this.#qdClient.setActivateCollection(\n collection.graphCollectionName,\n this.#config().activateGraphName,\n );\n }\n\n /** 图谱知识库不允许改chunksize,因为改了后切片就不一样了,那么生成的关系一定也不一样了 */\n override async insertItem(\n fileName: string,\n content: string,\n signal?: AbortSignal,\n ) {\n const list = await this._insertItem(fileName, content);\n if (!list || !list.length) {\n return;\n }\n const result = list[0].map(({ payload }) => payload);\n\n await this.#insert(result as any, fileName, signal);\n }\n async #insert(\n chunkList: FileChunkPayload[],\n fileName: string,\n signal?: AbortSignal,\n ) {\n const countObj = {\n success: 0,\n error: 0,\n };\n const hasGraph = !!this.#graphLocal.getGraph();\n // 工作流如果执行失败应该全退出,防止不断执行\n const llmAsyncQueue = fastq(async (document: FileChunkPayload) => {\n if (signal?.aborted) {\n return;\n }\n /** 输入解析 */\n const extractData = await this.#contentParser.parse(document, signal);\n countObj.success++;\n\n const nodes = extractData.entity.map((item) => ({\n id: v4(),\n payload: {\n ...item,\n fileName,\n chunkId: document.hash,\n },\n }));\n const edges = extractData.entity_relation.map((item) => ({\n id: v4(),\n payload: {\n ...item,\n fileName,\n chunkId: document.hash,\n },\n }));\n const keywords = extractData.keyword.map((item) => ({\n id: v4(),\n payload: {\n keyword: item,\n chunkId: document.hash,\n fileName,\n },\n }));\n await this.#graphUtil.updateContext(async () => ({\n upsert: {\n nodes,\n edges,\n keywords,\n },\n }));\n // 更新图谱\n if (hasGraph) {\n this.#graphLocal.add({\n nodes: nodes.map((item) => ({ ...item.payload, id: item.id })),\n edges: edges.map((item) => ({ ...item.payload, id: item.id })),\n });\n }\n }, this.#config().maxChunkAsync);\n llmAsyncQueue.error((error, task) => {\n if (error) {\n countObj.error++;\n this.#channel.warn(`[${fileName}]解析失败:\\n${task.chunk}\\n`, error);\n }\n });\n for (const item of chunkList) {\n llmAsyncQueue.push(item);\n }\n await llmAsyncQueue.drained();\n if (signal?.aborted) {\n return this.deleteItem(fileName);\n }\n // 如果失败过多就删除\n if (chunkList.length === countObj.error) {\n await super.deleteItem(fileName);\n }\n }\n\n override async deleteItem(fileName: string) {\n await super.deleteItem(fileName);\n await this.#util.multiDelete(\n this.#config().collectionList.map((item) => item.graphCollectionName),\n {\n filter: {\n must: [{ key: 'fileName', match: { value: fileName } }],\n should: null,\n },\n },\n );\n }\n override async updateItem(fileName: string, content: string) {\n await this.deleteItem(fileName);\n await this.insertItem(fileName, content);\n }\n\n override async addCollection(collection: GraphCollectionInlineType) {\n const activateCollectionName = this.#config().activateGraphName;\n\n await super.addCollection(collection);\n await this.#createCollection(collection);\n\n /** 从激活的集合中获取数据(理论上数据都是同步的) */\n const newCollectionName = collection.graphCollectionName;\n const batchQueue = new BatchQueue((item: string[]) =>\n this.#text2vec(item, collection.collectionName),\n );\n const queue = this.#util.updatePointsQueue(newCollectionName);\n\n let queueError = undefined;\n queue.queue.error((err) => {\n if (err) {\n queueError = err;\n queue.queue.killAndDrain();\n }\n });\n let offset: any;\n do {\n const { points, next_page_offset } = await this.#qdClient.scroll(\n activateCollectionName,\n {\n limit: 5000,\n with_payload: true,\n with_vector: false,\n offset: offset,\n },\n );\n // const instance = await this.#batchExtract$.get(config.embedding);\n await batchQueue.then(\n Promise.all([\n Promise.all(\n points.map(async (point) => {\n let embeddingChunk: string;\n if (point.payload!['kind'] === 'node') {\n embeddingChunk = entryFormat(\n point.payload!,\n this.#config().name,\n nodeVectorString(point.payload as any),\n collection.embeddingTemplate?.node,\n );\n } else if (point.payload!['kind'] === 'edge') {\n embeddingChunk = entryFormat(\n point.payload!,\n this.#config().name,\n edgeVectorString(point.payload as any),\n collection.embeddingTemplate?.edge,\n );\n } else {\n embeddingChunk = point.payload!['keyword'] as any;\n }\n const vector = await batchQueue.push(embeddingChunk);\n queue.push({\n id: point.id,\n payload: {\n ...point.payload!,\n embeddingChunk: embeddingChunk,\n },\n vector: {\n chunk: vector,\n },\n });\n }),\n ),\n ]),\n );\n\n offset = next_page_offset;\n } while (offset);\n\n queue.complete();\n await queue.queue.drained();\n if (queueError) {\n await this.#qdClient.deleteCollection(collection.collectionName);\n await this.#qdClient.deleteCollection(collection.graphCollectionName);\n throw queueError;\n }\n await this.#qdClient.setActivateCollection(\n newCollectionName,\n this.#config().activateGraphName,\n );\n }\n override async deleteCollection(collectionName: string) {\n const result = await super.deleteCollection(collectionName);\n if (!result) {\n return result;\n }\n\n const collection = this.#config().collectionList.find(\n (item) => item.collectionName === collectionName,\n )!;\n await this.#qdClient.deleteCollection(collection.graphCollectionName);\n return true;\n }\n override async changeActivateCollection(collectionName: string) {\n await super.changeActivateCollection(collectionName);\n await this.#qdClient.setActivateCollection(\n getGraphCollectionName(collectionName),\n this.#config().activateGraphName,\n );\n }\n override export() {\n return this.#util.export(\n this.#config().collectionList.flatMap(\n ({ collectionName, graphCollectionName }) => [\n collectionName,\n graphCollectionName,\n ],\n ),\n );\n }\n\n override async destroy() {\n await super.destroy();\n return this.#util.destroyKnowledge(\n this.#config().collectionList.map(\n ({ graphCollectionName }) => graphCollectionName,\n ),\n );\n }\n}\n", "import { InjectionToken } from 'static-injector';\nimport { EntityExtractType } from './define/define';\nimport { FileChunkPayload } from '../common/define/chunk';\nexport type ContentParserFn = {\n parse: (\n item: FileChunkPayload,\n signal?: AbortSignal,\n ) => Promise<EntityExtractType>;\n};\nexport const ContentParserToken = new InjectionToken<ContentParserFn>(\n 'ContentParser',\n);\n\nexport interface QueryParams {\n lengthLimit: {\n chunk: number;\n node: number;\n nodeDescription: number;\n edge: number;\n };\n topK: number;\n}\nexport const QueryParamsToken = new InjectionToken<QueryParams>('QueryParams');\nexport type RagChatFn = (data: Record<string, any>) => Promise<string>;\n\nexport const RagChatToken = new InjectionToken<RagChatFn>('RagChat');\nexport const CHAT_INPUT = `$$INPUT$$`;\n", "export function edgeVectorString(options: {\n description: string;\n source: string;\n target: string;\n keywords?: string[];\n}) {\n return `${options.keywords?.join(',') ?? ''},${options.source},${options.target},${options.description}`;\n}\nexport function nodeVectorString(options: {\n type: string;\n name: string;\n description: string;\n}) {\n return `${options.name},${options.description}`;\n}\n", "import { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { computed, inject, Signal } from 'static-injector';\n\nimport { createNormalizeVfs } from '@cyia/vfs2';\nimport { promise as fastq } from 'fastq';\nimport { getHash, isTruthy, runInEmbeddingContext } from '@shenghuabi/knowledge/util';\nimport { LogToken } from '@shenghuabi/knowledge/util';\nimport {\n Text2VecToken,\n TextSplitterToken,\n ConfigToken,\n DirToken,\n} from '../const';\nimport { KnowledgeUtilService } from '../knowledge.util.service';\nimport { entryFormat } from '../template.format';\nimport {\n NormalCollectionDefine,\n NormalCollectionInlineType,\n NormalKnowledgeConfigInline,\n} from './define/config';\nimport * as v from 'valibot';\nimport { FileChunkPayload } from '../common/define/chunk';\nimport { CommonKnowledgeService } from '../common/common.knowledge.service';\n\nexport class NormalKnowledgeService extends CommonKnowledgeService {\n #text2vec = inject(Text2VecToken);\n #textSplitter = inject(TextSplitterToken);\n #config = inject<Signal<NormalKnowledgeConfigInline>>(ConfigToken);\n #util = inject(KnowledgeUtilService);\n #qdClient = inject(QdrantClientService);\n #channel = inject(LogToken);\n #vfs = computed(() => createNormalizeVfs({ dir: this.#dir() }));\n #dir = inject(DirToken);\n protected KeyWordIndex = ['fileName'];\n protected getPayload(fileName: string, content: string): Record<string, any> {\n return { fileName: fileName };\n }\n formatCollection(input: any) {\n return v.parse(NormalCollectionDefine, input);\n }\n protected async createCollection(collection: NormalCollectionInlineType) {\n this.#channel.info(\n `创建集合:${this.#config().name};嵌入长度:${collection.size}`,\n );\n const { exists } = await this.#qdClient.collectionExists(\n collection.collectionName,\n );\n if (exists) {\n throw new Error(`集合${collection.collectionName}已存在`);\n }\n await this.#qdClient.createCollection(collection.collectionName, {\n vectors: {\n chunk: {\n size: collection.size,\n distance: 'Cosine',\n on_disk: true,\n },\n },\n });\n this.#channel.info(`创建索引`);\n for (const keyword of this.KeyWordIndex) {\n await this.#qdClient.createPayloadKeywordIndex(\n collection.collectionName,\n keyword,\n );\n }\n }\n /** 创建知识库 */\n async create(collection: NormalCollectionInlineType) {\n this.#channel.info(`准备创建知识库:${this.#config().name}`);\n await this.createCollection(collection);\n await this.#qdClient.setActivateCollection(\n collection.collectionName,\n this.#config().activateName,\n );\n this.#channel.info(`创建完成:${this.#config().name}`);\n }\n\n async insertItemOnly(\n fileName: string,\n content: string,\n collectionList: NormalCollectionInlineType[],\n ) {\n return await runInEmbeddingContext(\n (t2v) =>\n Promise.all(\n collectionList.map(async (collectionItem) => {\n const chunkList = (\n await this.#textSplitter(\n content,\n this.getPayload(fileName, content),\n collectionItem.collectionName,\n )\n ).filter((item) => !!item.pageContent.trim());\n if (!chunkList.length) {\n return;\n }\n const points = await Promise.all(\n chunkList.map(async (item) => {\n const pageContent = item.pageContent.trim();\n const id = getHash(pageContent);\n const payload = {\n ...item.metadata,\n chunk: pageContent,\n hash: id,\n } as Record<string, any>;\n const embeddingChunk = entryFormat(\n payload,\n this.#config().name,\n pageContent,\n collectionItem.embeddingTemplate?.entry,\n );\n if (!embeddingChunk) {\n this.#channel.warn(\n `内容格式化后内容为空,跳过\\n${JSON.stringify({ payload, knowledge: this.#config().name, pageContent })}`,\n );\n return;\n }\n payload['embeddingChunk'] = embeddingChunk;\n return {\n id: id,\n vector: {\n chunk: await t2v(\n embeddingChunk,\n collectionItem.collectionName,\n ),\n },\n payload: payload as FileChunkPayload,\n };\n }),\n ).then((list) => list.filter(isTruthy));\n if (points.length) {\n await this.#qdClient.upsert(collectionItem.collectionName, {\n wait: true,\n points: points,\n });\n return points;\n }\n return;\n }),\n ).then((list) => list.filter(isTruthy)),\n this.#text2vec,\n );\n }\n\n protected async _insertItem(fileName: string, content: string) {\n if (await this.#vfs().exists(fileName)) {\n return false;\n }\n await this.#vfs().writeFile(fileName, content);\n return await this.insertItemOnly(\n fileName,\n content,\n this.#config().collectionList,\n );\n }\n async insertItem(fileName: string, content: string, signal?: AbortSignal) {\n await this._insertItem(fileName, content);\n }\n async deleteItem(fileName: string) {\n await this.#util.multiDelete(\n this.#config().collectionList.map((item) => item.collectionName),\n {\n filter: {\n must: [{ key: 'fileName', match: { value: fileName } }],\n should: null,\n },\n },\n );\n await this.#vfs().delete(fileName, { force: true });\n }\n async updateItem(fileName: string, content: string) {\n await this.deleteItem(fileName);\n await this.insertItem(fileName, content);\n }\n\n async addCollection(collection: NormalCollectionInlineType) {\n /** 保存文件,新创建的没有 */\n\n const list = (await this.#vfs().exists(''))\n ? await this.#vfs().readdir('')\n : [];\n await this.createCollection(collection);\n const queue = fastq(async (fileName: string) => {\n const content = await this.#vfs().readContent(fileName);\n if (typeof content !== 'string' || !content) {\n return;\n }\n await this.insertItemOnly(fileName, content, [collection]);\n }, 20);\n let queueError;\n queue.error((error) => {\n if (error) {\n queueError = error;\n queue.killAndDrain();\n }\n });\n try {\n for (const item of list) {\n queue.push(item);\n }\n await queue.drained();\n if (queueError) {\n throw queueError;\n }\n } catch (error) {\n await this.#qdClient.deleteCollection(collection.collectionName);\n throw error;\n }\n\n await this.#qdClient.setActivateCollection(\n collection.collectionName,\n this.#config().activateName,\n );\n }\n // 激活collection不可删除,所以这里不应该有删除切换的问题\n async deleteCollection(collectionName: string) {\n const isActivate = this.#config().activateCollection === collectionName;\n if (isActivate) {\n return false;\n }\n const collection = this.#config().collectionList.find(\n (item) => item.collectionName === collectionName,\n )!;\n if (!collection) {\n return false;\n }\n await this.#qdClient.deleteCollection(collectionName);\n return true;\n }\n async changeActivateCollection(collectionName: string) {\n await this.#qdClient.setActivateCollection(\n collectionName,\n this.#config().activateName,\n );\n }\n export() {\n return this.#util.export(\n this.#config().collectionList.map(({ collectionName }) => collectionName),\n );\n }\n\n async destroy() {\n return this.#util.destroyKnowledge(\n this.#config().collectionList.map(({ collectionName }) => collectionName),\n this.#vfs(),\n );\n }\n}\n", "import * as v from 'valibot';\nimport { EmbeddingTemplateDefine } from '../../common/define/embedding';\nimport { BaseKnowledgeConfig } from '../../common/define/base';\nimport { getActivateCollectionName, getGraphCollectionName } from '../../const';\nexport const GraphCollectionDefine = v.pipe(\n v.object({\n collectionName: v.string(),\n size: v.number(),\n embeddingTemplate: v.optional(\n v.object({\n entry: v.optional(EmbeddingTemplateDefine),\n node: v.optional(EmbeddingTemplateDefine),\n edge: v.optional(EmbeddingTemplateDefine),\n }),\n ),\n }),\n v.transform((collection) => ({\n ...collection,\n graphCollectionName: getGraphCollectionName(collection.collectionName),\n })),\n);\nexport const GraphKnowledgeConfigDefine = v.pipe(\n v.object({\n ...BaseKnowledgeConfig.entries,\n type: v.optional(v.literal('normal-graph'), 'normal-graph'),\n maxChunkAsync: v.number(),\n collectionList: v.array(GraphCollectionDefine),\n }),\n v.transform((input) => ({\n ...input,\n /** 激活的普通知识库(文件切片) */\n activateName: getActivateCollectionName(input.name),\n /** 激活的图数据库 */\n activateGraphName: getActivateCollectionName(\n getGraphCollectionName(input.name),\n ),\n })),\n);\n\nexport type GraphKnowledgeConfig = v.InferInput<\n typeof GraphKnowledgeConfigDefine\n>;\nexport type GraphKnowledgeConfigInline = v.InferOutput<\n typeof GraphKnowledgeConfigDefine\n>;\nexport type GraphCollectionInput = v.InferInput<typeof GraphCollectionDefine>;\nexport type GraphCollectionInlineType = v.InferOutput<\n typeof GraphCollectionDefine\n>;\n", "import { runInEmbeddingContext } from '@shenghuabi/knowledge/util';\nimport { inject, Signal } from 'static-injector';\nimport { ConfigToken, Text2VecToken } from '../const';\nimport { entryFormat } from '../template.format';\nimport { GraphKnowledgeConfigInline } from './define/config';\nimport { nodeVectorString, edgeVectorString } from './vecotr-format';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport {\n EdgePayloadNewDefine,\n KeywordPayloadNewDefine,\n NodePayloadNewDefine,\n} from './define/define';\nimport * as v from 'valibot';\nexport class GraphKnowledgeUtilService {\n #qdClient = inject(QdrantClientService);\n\n #config = inject<Signal<GraphKnowledgeConfigInline>>(ConfigToken);\n #text2vec = inject(Text2VecToken);\n updateContext(\n fn: () => Promise<{\n upsert?: {\n nodes?: { id: any; payload: any }[];\n edges?: { id: any; payload: any }[];\n keywords?: { id: any; payload: any }[];\n };\n delete?: {\n nodes?: { id: any }[] | { filter?: any };\n edges?:\n | {\n id: any;\n }[]\n | { filter?: any };\n };\n }>,\n ) {\n return runInEmbeddingContext(async (t2v) => {\n const result = await fn();\n const requstList = [];\n if (result.upsert) {\n requstList.push(\n this.#config().collectionList.map(\n async ({\n graphCollectionName,\n collectionName,\n embeddingTemplate,\n }) => {\n const list = [];\n if (result.upsert?.nodes?.length) {\n list.push(\n Promise.all(\n result.upsert?.nodes.map(async (item) => {\n const embeddingChunk = entryFormat(\n item.payload,\n this.#config().name,\n nodeVectorString(item.payload),\n embeddingTemplate?.node,\n );\n return {\n id: item.id,\n payload: v.parse(NodePayloadNewDefine, {\n ...item.payload,\n embeddingChunk,\n }),\n vector: {\n chunk: await t2v(embeddingChunk, collectionName),\n },\n };\n }),\n ).then((points) =>\n this.#qdClient.upsert(graphCollectionName, { points }),\n ),\n );\n }\n if (result.upsert?.edges?.length) {\n list.push(\n Promise.all(\n result.upsert?.edges.map(async (item) => {\n const embeddingChunk = entryFormat(\n item.payload,\n this.#config().name,\n edgeVectorString(item.payload),\n embeddingTemplate?.edge,\n );\n\n return {\n id: item.id,\n payload: v.parse(EdgePayloadNewDefine, {\n ...item.payload,\n embeddingChunk,\n }),\n vector: {\n chunk: await t2v(embeddingChunk, collectionName),\n },\n };\n }),\n ).then((points) =>\n this.#qdClient.upsert(graphCollectionName, { points }),\n ),\n );\n }\n if (result.upsert?.keywords?.length) {\n list.push(\n Promise.all(\n result.upsert?.keywords.map(async (item) => ({\n id: item.id,\n payload: v.parse(KeywordPayloadNewDefine, item.payload),\n vector: {\n chunk: await t2v(item.payload.keyword, collectionName),\n },\n })),\n ).then((points) =>\n this.#qdClient.upsert(graphCollectionName, { points }),\n ),\n );\n }\n return Promise.all(list);\n },\n ),\n );\n }\n if (result.delete) {\n requstList.push(\n this.#config().collectionList.map(\n async ({ graphCollectionName, collectionName }) => {\n await Promise.all(\n [result.delete?.nodes, result.delete?.edges].map(\n (deleteData) => {\n if (Array.isArray(deleteData)) {\n if (deleteData.length) {\n return this.#qdClient.delete(graphCollectionName, {\n points: deleteData.map((item) => item.id),\n });\n }\n } else if (deleteData) {\n return this.#qdClient.delete(graphCollectionName, {\n filter: deleteData.filter,\n });\n }\n },\n ),\n );\n },\n ),\n );\n }\n return Promise.all(requstList.flat());\n }, this.#text2vec);\n }\n}\n", "import { uniqBy } from 'lodash-es';\n\nimport * as v from 'valibot';\nimport { getEdgeName } from '../util';\nimport { v4 } from 'uuid';\n/** 提取的实体 */\nexport const ENTITY_DEFINE = v.object({\n name: v.string(),\n description: v.optional(v.string(), ''),\n /** 实体类型 */\n type: v.string(),\n});\n/** 联系 */\nexport const ENTITY_RELATION_DEFINE = v.object({\n source: v.string(),\n target: v.string(),\n description: v.optional(v.string(), ''),\n strength: v.optional(v.number(), 5),\n keywords: v.optional(\n v.union([\n v.pipe(\n v.string(),\n v.transform((str) => str.split(',').map((item) => item.trim())),\n ),\n v.array(v.string()),\n ]),\n ),\n});\n\n// 一个实体可能有多个重名的.\n/** 提取定义 */\nexport const EntityExtraDefine = v.object({\n entity: v.pipe(\n v.nullish(v.array(ENTITY_DEFINE), []),\n v.transform((list) =>\n uniqBy(\n (list || []).filter((item) => !!item.name && !!item.description),\n (item) => `${item.name}|${item.type}|${item.description}`,\n ),\n ),\n ),\n entity_relation: v.pipe(\n v.nullish(v.array(ENTITY_RELATION_DEFINE), []),\n v.transform((list) =>\n uniqBy(\n (list || []).filter(\n (item) => !!item.source && !!item.target && !!item.description,\n ),\n (item) => `${item.source}|${item.target}|${item.description}`,\n ),\n ),\n ),\n keyword: v.pipe(\n v.nullish(v.array(v.string()), []),\n v.transform((item) => item.map((item) => item.trim())),\n ),\n});\nexport type EntityExtractType = v.InferOutput<typeof EntityExtraDefine>;\n\nexport type NodeExtract = EntityExtractType['entity'][number];\n/** 完整的graph节点项 */\nexport const NodePayloadDefine = v.object({\n ...ENTITY_DEFINE.entries,\n kind: v.optional(v.literal('node'), 'node'),\n id: v.string(),\n chunkId: v.string(),\n fileName: v.string(),\n});\n\nexport const NodeItemDefine = v.pipe(\n v.omit(NodePayloadDefine, ['kind']),\n v.transform((data) => ({ ...data, kind: 'node' as const })),\n);\nexport const NodePayloadNewDefine = v.pipe(\n v.object({\n ...v.omit(NodePayloadDefine, ['id']).entries,\n embeddingChunk: v.string(),\n }),\n);\nexport const NodeItemNewDefine = v.pipe(\n v.object({\n ...v.omit(NodePayloadDefine, ['kind', 'id']).entries,\n id: v.optional(NodePayloadDefine.entries.id, () => v4()),\n }),\n v.transform((data) => ({ ...data, kind: 'node' as const })),\n);\nexport type NodeItemType = v.InferInput<typeof NodeItemDefine>;\nexport type NodeItemNewType = v.InferInput<typeof NodeItemNewDefine>;\n\nexport type EdgeExtract = EntityExtractType['entity_relation'][number];\nexport const EdgePayloadDefine = v.object({\n ...ENTITY_RELATION_DEFINE.entries,\n chunkId: v.string(),\n kind: v.optional(v.literal('edge'), 'edge'),\n name: v.string(),\n fileName: v.string(),\n id: v.string(),\n});\nexport const EdgeItemDefine = v.pipe(\n v.omit(EdgePayloadDefine, ['kind', 'name']),\n v.transform((data) => ({\n ...data,\n name: getEdgeName(data.source, data.target),\n kind: 'edge' as const,\n })),\n);\nexport const EdgePayloadNewDefine = v.pipe(\n v.object({\n ...v.omit(EdgePayloadDefine, ['name', 'id']).entries,\n embeddingChunk: v.string(),\n }),\n v.transform((data) => ({\n ...data,\n name: getEdgeName(data.source, data.target),\n })),\n);\nexport const EdgeItemNewDefine = v.pipe(\n v.object({\n ...v.omit(EdgePayloadDefine, ['kind', 'name', 'id']).entries,\n id: v.optional(NodePayloadDefine.entries.id, () => v4()),\n }),\n v.transform((data) => ({\n ...data,\n name: getEdgeName(data.source, data.target),\n kind: 'edge' as const,\n })),\n);\nexport type EdgePayload = v.InferOutput<typeof EdgePayloadDefine>;\nexport type EdgeItemType = v.InferInput<typeof EdgeItemDefine>;\nexport type EdgeItemNewType = v.InferInput<typeof EdgeItemNewDefine>;\nexport type EdgeQueryPayload = EdgePayload & { embeddingChunk: string };\n// export type EdgeAttr = {\n// list: EdgeItem[];\n// };\nexport interface RagExtraKeyword {\n high_level_keywords: string[];\n low_level_keywords: string[];\n}\n\nexport const KnowledgeGraphCreateDefine = v.object({\n fileName: v.string(),\n chunkId: v.string(),\n nodeList: v.optional(v.array(ENTITY_DEFINE), []),\n edgeList: v.optional(v.array(ENTITY_RELATION_DEFINE), []),\n});\n\nexport type KnowledgeGraphItemType = {\n nodes?: NodeItemNewType[];\n edges?: EdgeItemNewType[];\n};\n/** 属性分割,因为有一部分没id的 */\nexport type NodePayload = v.InferOutput<typeof NodePayloadDefine>;\nexport type NodeQueryPayload = NodePayload & { embeddingChunk: string };\nexport type GraphNodeAttr = {\n list: NodePayload[];\n name: string;\n};\nexport type GraphEdgeAttr = {\n list: EdgePayload[];\n name: string;\n source: string;\n target: string;\n};\n\nexport const KeywordPayloadNewDefine = v.pipe(\n v.object({\n kind: v.optional(v.literal('keyword'), 'keyword'),\n keyword: v.string(),\n chunkId: v.string(),\n fileName: v.string(),\n }),\n);\n", "export function getEdgeName(source: string, target: string) {\n return `${source},${target}`;\n}\n", "import { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { computed, inject, signal, Signal, untracked } from 'static-injector';\nimport { ConfigToken } from '../const';\nimport Graph from 'graphology';\nimport {\n EdgeItemNewDefine,\n EdgeItemNewType,\n EdgeItemType,\n EdgePayload,\n GraphEdgeAttr,\n GraphNodeAttr,\n KnowledgeGraphItemType,\n NodeItemNewDefine,\n NodeItemNewType,\n NodeItemType,\n NodePayload,\n} from './define/define';\nimport { Attributes } from 'graphology-types';\nimport * as v from 'valibot';\nimport { getEdgeName } from './util';\n\nimport { GraphKnowledgeConfigInline } from './define/config';\nimport { LogToken } from '@shenghuabi/knowledge/util';\n// 这个应该持久化,因为图初始化一次很麻烦\nexport class GraphLocalService {\n #qdClient = inject(QdrantClientService);\n #config = inject<Signal<GraphKnowledgeConfigInline>>(ConfigToken);\n #limit = 5000;\n #graph!: Graph<GraphNodeAttr, GraphEdgeAttr, Attributes>;\n #log = inject(LogToken);\n update$ = signal(0);\n graphExport$$ = computed(() => {\n this.update$();\n return this.#graph.export();\n });\n getGraph() {\n return this.#graph;\n }\n loadDataInitGraph$$ = computed(() => {\n this.initGraph();\n return untracked(() => this.loadingData());\n });\n /** 只初始化数据 */\n initGraph() {\n this.#graph = new Graph();\n return this.#graph;\n }\n #getEdgesFromSource(name: string) {\n try {\n return this.#graph.outEdges(name);\n } catch (error) {\n this.#log.warn(error);\n return [];\n }\n }\n #getEdgesFromTarget(name: string) {\n try {\n return this.#graph.inEdges(name);\n } catch (error) {\n this.#log.warn(error);\n return [];\n }\n }\n\n getTargetListFromSource(name: string) {\n return this.#graph.hasNode(name)\n ? this.#getEdgesFromSource(name).flatMap(\n (name) => this.#graph.getTargetAttributes(name).list,\n )\n : [];\n }\n edgeToNode(item: EdgeItemNewType, type: 'source' | 'target') {\n return {\n name: item[type],\n description: item.description,\n type: '未知',\n chunkId: item.chunkId,\n fileName: item.fileName,\n } as NodeItemNewType;\n }\n\n createOrUpdateNodeAttr(item: NodeItemNewType) {\n const payload = v.parse(NodeItemNewDefine, item);\n if (this.#graph.hasNode(payload.name)) {\n const obj = this.#graph.getNodeAttributes(payload.name);\n for (let index = 0; index < obj.list.length; index++) {\n const item = obj.list[index];\n if (item.id === payload.id) {\n obj.list[index] = payload;\n this.#graph.replaceNodeAttributes(payload.name, obj);\n return;\n }\n }\n obj.list.push(payload);\n this.#graph.replaceNodeAttributes(payload.name, obj);\n } else {\n this.#graph.addNode(payload.name, {\n list: [payload],\n name: payload.name,\n });\n }\n }\n // source/target可能不存在,需要临时节点\n createOrUpdateEdgeAttr(item: EdgeItemNewType) {\n const payload = v.parse(EdgeItemNewDefine, item);\n if (this.#graph.hasEdge(payload.name)) {\n const obj = this.#graph.getEdgeAttributes(payload.name);\n for (let index = 0; index < obj.list.length; index++) {\n const item = obj.list[index];\n if (item.id === payload.id) {\n obj.list[index] = payload;\n this.#graph.replaceEdgeAttributes(item.name, obj);\n return;\n }\n }\n obj.list.push(payload);\n this.#graph.replaceEdgeAttributes(payload.name, obj);\n } else {\n if (!this.#graph.hasNode(item.source)) {\n this.#graph.addNode(item.source, {\n list: [v.parse(NodeItemNewDefine, this.edgeToNode(item, 'source'))],\n name: item.source,\n });\n }\n if (!this.#graph.hasNode(item.target)) {\n this.#graph.addNode(item.target, {\n list: [v.parse(NodeItemNewDefine, this.edgeToNode(item, 'target'))],\n name: item.target,\n });\n }\n\n this.#graph.addEdgeWithKey(payload.name, item.source, item.target, {\n list: [payload],\n name: payload.name,\n source: payload.source,\n target: payload.target,\n });\n }\n }\n #deleteNodeAttr(payload: Pick<NodeItemType, 'id' | 'name'>) {\n if (this.#graph.hasNode(payload.name)) {\n const attr = this.#graph.getNodeAttributes(payload.name);\n const index = attr.list.findIndex((item) => item.id === payload.id);\n if (index !== -1) {\n attr.list.splice(index, 1);\n if (attr.list.length === 0) {\n this.#graph.dropNode(payload.name);\n } else {\n this.#graph.replaceNodeAttributes(payload.name, attr);\n }\n }\n }\n }\n\n #deleteEdgeAttr(item: Pick<EdgeItemType, 'id' | 'source' | 'target'>) {\n const name = getEdgeName(item.source, item.target);\n if (!this.#graph.hasEdge(name)) {\n return;\n }\n const attr = this.#graph.getEdgeAttributes(name);\n for (let index = 0; index < attr.list.length; index++) {\n const edgeItem = attr.list[index];\n if (edgeItem.id === item.id) {\n attr.list.splice(index, 1);\n if (attr.list.length === 0) {\n this.#graph.dropEdge(name);\n } else {\n this.#graph.replaceEdgeAttributes(name, attr);\n }\n return;\n }\n }\n }\n #updateGraph(payload: NodePayload | EdgePayload, update?: boolean) {\n if (payload.kind === 'node') {\n this.createOrUpdateNodeAttr(payload);\n } else if (payload.kind === 'edge') {\n this.createOrUpdateEdgeAttr(payload);\n }\n }\n async loadingData() {\n let offset: string | undefined;\n const [nodeList, edgeList] = await Promise.all(\n ['node', 'edge'].map(async (kind) => {\n const nodePoints = [];\n do {\n const { points, next_page_offset } = await this.#qdClient.scroll(\n this.#config().activateGraphName,\n {\n limit: this.#limit,\n filter: {\n must: {\n key: 'kind',\n match: {\n value: kind,\n },\n },\n },\n with_payload: true,\n offset: offset,\n },\n );\n nodePoints.push(() => {\n for (const item of points) {\n this.#updateGraph({ ...item.payload!, id: item.id } as any);\n }\n });\n offset = next_page_offset as any;\n } while (offset);\n return nodePoints;\n }),\n );\n nodeList.forEach((fn) => fn());\n edgeList.forEach((fn) => fn());\n }\n /** 一个节点分多个,需要删除原来的节点和边,然后插入\n * 拆分后的节点有可能是存在的\n */\n async splitNode(options: { node: string; list: string[] }) {\n const nodeAttr = this.#graph.getNodeAttributes(options.node);\n options.list.map((replaceNodeName) => {\n nodeAttr.list.forEach((item) => {\n this.createOrUpdateNodeAttr({ ...item, name: replaceNodeName });\n });\n });\n const sourceEdges = this.#getEdgesFromSource(options.node);\n const targetEdges = this.#getEdgesFromTarget(options.node);\n for (const edge of sourceEdges) {\n const attr = this.#graph.getEdgeAttributes(edge);\n for (const replaceNodeName of options.list) {\n attr.list.forEach((attrItem) => {\n this.createOrUpdateEdgeAttr({ ...attrItem, source: replaceNodeName });\n });\n }\n }\n for (const edge of targetEdges) {\n const attr = this.#graph.getEdgeAttributes(edge);\n for (const replaceNodeName of options.list) {\n attr.list.forEach((attrItem) => {\n this.createOrUpdateEdgeAttr({ ...attrItem, target: replaceNodeName });\n });\n }\n }\n\n this.#graph.dropNode(options.node);\n this.update$.update((a) => a + 1);\n }\n async mergeNode(options: { node: string; list: string[] }) {\n const sourceEdges = options.list.flatMap((item) =>\n this.#getEdgesFromSource(item),\n );\n const targetEdges = options.list.flatMap((item) =>\n this.#getEdgesFromTarget(item),\n );\n // 先插入节点,防止边创建\n options.list.forEach((node) => {\n const attr = this.#graph.getNodeAttributes(node);\n attr.list.forEach((item) => {\n this.createOrUpdateNodeAttr({ ...item, name: options.node });\n });\n });\n for (const edge of sourceEdges) {\n const data = this.#graph.getEdgeAttributes(edge);\n data.list.forEach((item) => {\n this.createOrUpdateEdgeAttr({ ...item, source: options.node });\n });\n }\n for (const edge of targetEdges) {\n const data = this.#graph.getEdgeAttributes(edge);\n data.list.forEach((item) => {\n this.createOrUpdateEdgeAttr({ ...item, target: options.node });\n });\n }\n\n options.list.forEach((item) => {\n this.#graph.dropNode(item);\n });\n this.update$.update((a) => a + 1);\n }\n\n async changeNodeDescription(payload: NodeItemType) {\n this.createOrUpdateNodeAttr(payload);\n this.update$.update((a) => a + 1);\n }\n\n async changeEdge(\n item: EdgeItemType,\n oldItem: Pick<EdgePayload, 'id' | 'source' | 'target'>,\n ) {\n this.createOrUpdateEdgeAttr(item);\n if (item.source !== oldItem.source || item.target !== oldItem.target) {\n this.#deleteEdgeAttr(oldItem);\n }\n this.update$.update((a) => a + 1);\n }\n async add(input: KnowledgeGraphItemType) {\n // 可能添加部分\n input.nodes?.forEach((item) => {\n this.createOrUpdateNodeAttr(item);\n });\n input.edges?.forEach((item) => {\n this.createOrUpdateEdgeAttr(item);\n });\n this.update$.update((a) => a + 1);\n }\n async deleteNodeItem(item: Pick<NodeItemType, 'id' | 'name'>) {\n this.#deleteNodeAttr(item);\n this.update$.update((a) => a + 1);\n }\n deleteEdgeItem(item: Pick<EdgeItemType, 'id' | 'source' | 'target'>) {\n this.#deleteEdgeAttr(item);\n this.update$.update((a) => a + 1);\n }\n deleteNode(name: string) {\n this.#graph.dropNode(name);\n this.update$.update((a) => a + 1);\n }\n /**\n * node=>edge\n * 确定最相似的chunk(第一位)\n * 获取传入节点的所有变\n */\n getEdgeByNode(nodes: NodePayload[]) {\n const repeatList = new Set();\n const list = [];\n for (const node of nodes) {\n for (const edgeName of [\n ...this.#graph.outEdges(node.name),\n ...this.#graph.inEdges(node.name),\n ]) {\n const key = `${edgeName}|${node.chunkId}`;\n if (repeatList.has(key)) {\n continue;\n }\n repeatList.add(key);\n list.push(\n ...this.#graph\n .getEdgeAttributes(edgeName)\n .list.filter((item) => item.chunkId === node.chunkId),\n );\n }\n }\n return list;\n }\n\n /**\n * 根据边查节点\n * 通过边上的chunkid,查找同在这个chunkid上的souce/target节点,权重为边\n */\n getNodeByEdge(edges: EdgePayload[]) {\n const repeatList = new Set();\n const list = [];\n for (const edge of edges) {\n for (const nodeName of [edge.source, edge.target]) {\n const key = `${nodeName}|${edge.chunkId}`;\n if (repeatList.has(key)) {\n continue;\n }\n repeatList.add(key);\n list.push(\n ...this.#graph\n .getNodeAttributes(nodeName)\n .list.filter((item) => item.chunkId === edge.chunkId),\n );\n }\n }\n return list;\n }\n getChunkEdgeByNode(node: Pick<NodeItemType, 'name' | 'chunkId'>) {\n const list = [];\n for (const edgeName of [\n ...this.#graph.outEdges(node.name),\n ...this.#graph.inEdges(node.name),\n ]) {\n const edgeAttr = this.#graph.getEdgeAttributes(edgeName);\n list.push(\n ...edgeAttr.list.filter((item) => node.chunkId === item.chunkId),\n );\n }\n return list;\n }\n}\n", "import { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { inject, Injector, Signal } from 'static-injector';\nimport { Text2VecToken, ConfigToken } from '../const';\nimport { KnowledgeUtilService } from '../knowledge.util.service';\nimport { v4 } from 'uuid';\nimport {\n NodeItemType,\n KnowledgeGraphItemType,\n EdgeItemType,\n EdgeItemDefine,\n NodeItemDefine,\n NodeItemNewDefine,\n EdgeItemNewDefine,\n} from './define/define';\nimport { getEdgeName } from './util';\nimport * as v from 'valibot';\nimport { GraphKnowledgeConfigInline } from './define/config';\nimport { GraphKnowledgeUtilService } from './graph.util.service';\nimport { isTruthy, LogToken } from '@shenghuabi/knowledge/util';\nconst MAX_LIMIT = 99999;\nconst FilterEdge = {\n key: 'kind',\n match: {\n value: 'edge',\n },\n};\nconst FilterNode = {\n key: 'kind',\n match: {\n value: 'node',\n },\n};\nexport class GraphHandleService {\n #text2vec = inject(Text2VecToken);\n #config = inject<Signal<GraphKnowledgeConfigInline>>(ConfigToken);\n #util = inject(KnowledgeUtilService);\n #qdClient = inject(QdrantClientService);\n #channel = inject(LogToken);\n #injector = inject(Injector);\n #graphUtil = inject(GraphKnowledgeUtilService);\n\n /** 拆分节点\n */\n async splitNode(options: { node: string; list: string[] }) {\n await this.#graphUtil.updateContext(async () => {\n const [{ points: nodes }, { points: edges }] = await Promise.all([\n this.#qdClient.scroll(this.#config().activateGraphName, {\n limit: MAX_LIMIT,\n filter: {\n must: [FilterNode, { key: 'name', match: { value: options.node } }],\n },\n with_payload: true,\n with_vector: false,\n }),\n this.#qdClient.scroll(this.#config().activateGraphName, {\n limit: MAX_LIMIT,\n filter: {\n must: [FilterEdge],\n should: [\n { key: 'source', match: { value: options.node } },\n { key: 'target', match: { value: options.node } },\n ],\n },\n with_payload: true,\n with_vector: false,\n }),\n ]);\n const [updateNodes, updateEdges] = await Promise.all([\n Promise.all(\n nodes.flatMap((node) =>\n options.list.map(async (nodeName) => {\n const payload = { ...node.payload!, name: nodeName } as any;\n return {\n payload: payload,\n id: v4(),\n };\n }),\n ),\n ),\n Promise.all(\n edges.flatMap((edge) =>\n options.list.map(async (nodeName) => {\n const payload =\n edge.payload!['source'] === options.node\n ? ({ ...edge.payload!, source: nodeName } as any)\n : ({ ...edge.payload!, target: nodeName } as any);\n payload['name'] = getEdgeName(\n payload['source'],\n payload['target'],\n );\n return {\n payload: payload,\n id: v4(),\n };\n }),\n ),\n ),\n ]);\n return {\n upsert: {\n nodes: updateNodes,\n edges: updateEdges,\n },\n delete: {\n nodes: nodes,\n edges: edges,\n },\n };\n });\n }\n /** 合并节点 */\n async mergeNode(options: { node: string; list: string[] }) {\n const listToObj = options.list.reduce(\n (obj, item) => {\n obj[item] = true;\n return obj;\n },\n {} as Record<string, boolean>,\n );\n await this.#graphUtil.updateContext(async () => {\n const [{ points: nodes }, { points: edges }] = await Promise.all([\n this.#qdClient.scroll(this.#config().activateGraphName, {\n limit: MAX_LIMIT,\n filter: {\n must: [FilterNode, { key: 'name', match: { any: options.list } }],\n },\n with_payload: true,\n with_vector: false,\n }),\n this.#qdClient.scroll(this.#config().activateGraphName, {\n limit: MAX_LIMIT,\n filter: {\n must: [FilterEdge],\n should: [\n { key: 'source', match: { any: options.list } },\n { key: 'target', match: { any: options.list } },\n ],\n },\n with_payload: true,\n with_vector: false,\n }),\n ]);\n const [updateNodes, updateEdges] = await Promise.all([\n Promise.all(\n nodes.map(async (node) => {\n const payload = { ...node.payload!, name: options.node } as any;\n return {\n payload: payload,\n id: v4(),\n };\n }),\n ),\n Promise.all(\n edges.map(async (edge) => {\n const hasSource = listToObj[edge.payload!['source'] as any];\n const hasTarget = listToObj[edge.payload!['target'] as any];\n if (hasSource && hasTarget) {\n return undefined;\n }\n const payload = hasSource\n ? ({ ...edge.payload!, source: options.node } as any)\n : ({ ...edge.payload!, target: options.node } as any);\n payload['name'] = getEdgeName(payload['source'], payload['target']);\n return {\n payload: payload,\n id: v4(),\n };\n }),\n ).then((list) => list.filter(isTruthy)),\n ]);\n return {\n upsert: {\n nodes: updateNodes,\n edges: updateEdges,\n },\n delete: {\n nodes: nodes,\n edges: edges,\n },\n };\n });\n }\n /** 虽然可以修改其他的,但是只允许修改描述 */\n async changeNodeDescription(item: NodeItemType) {\n const payload = v.parse(NodeItemDefine, item);\n const id = payload.id;\n delete (payload as any).id;\n await this.#graphUtil.updateContext(async () => ({\n upsert: {\n nodes: [\n {\n id,\n payload: payload,\n },\n ],\n },\n }));\n }\n /**\n * 修改边,如果关系修改了不需要改边 */\n async changeEdge(item: EdgeItemType) {\n const id = item.id;\n const payload = v.parse(EdgeItemDefine, item);\n delete (item as any).id;\n\n await this.#graphUtil.updateContext(async () => ({\n upsert: {\n edges: [\n {\n id,\n payload: payload,\n },\n ],\n },\n }));\n }\n /** 可以添加节点/边 */\n async addNodeItem(input: KnowledgeGraphItemType) {\n await this.#graphUtil.updateContext(async () => {\n const nodes = (input.nodes ?? []).map((node) => {\n const payload = v.parse(NodeItemNewDefine, node);\n return {\n id: v4(),\n payload: payload,\n };\n });\n const edges = (input.edges ?? []).map((edge) => {\n const payload = v.parse(EdgeItemNewDefine, edge);\n return {\n id: v4(),\n payload: payload,\n };\n });\n\n return {\n upsert: { nodes, edges },\n };\n });\n }\n /** 删除节点的一条 */\n async deleteNodeItem(item: Pick<NodeItemType, 'id' | 'name'>) {\n await this.#graphUtil.updateContext(async () => {\n const { points } = await this.#qdClient.scroll(\n this.#config().activateGraphName,\n {\n limit: 1,\n filter: {\n must: [FilterNode, { key: 'name', match: { value: item.name } }],\n },\n },\n );\n\n return {\n delete: {\n nodes: [item],\n edges:\n points.length === 1\n ? {\n filter: {\n must: [FilterEdge],\n should: [\n { key: 'source', match: { value: item.name } },\n { key: 'target', match: { value: item.name } },\n ],\n },\n }\n : [],\n },\n };\n });\n }\n /** 删除整个边(边不影响节点) */\n async deleteEdge(item: Pick<EdgeItemType, 'id' | 'source' | 'target'>) {\n await this.#graphUtil.updateContext(async () => ({\n delete: {\n edges: [item],\n },\n }));\n }\n /** 删除整个节点(对应边也删除) */\n async deleteNodeByName(name: string) {\n await this.#graphUtil.updateContext(async () => ({\n delete: {\n nodes: {\n filter: {\n must: [FilterNode, { key: 'name', match: { value: name } }],\n should: null,\n },\n },\n edges: {\n filter: {\n must: [FilterEdge],\n should: [\n { key: 'source', match: { value: name } },\n { key: 'target', match: { value: name } },\n ],\n },\n },\n },\n }));\n }\n}\n", "import { createInjector, inject, Injector } from 'static-injector';\nimport { GraphLocalService } from './graph.local.service';\nimport { GraphKnolwdgeService } from './graph.knowledge.service';\nimport { GraphHandleService } from './graph.handle.service';\nimport { GraphSplitNodeInput } from './type';\nimport {\n EdgeItemType,\n EdgePayload,\n KnowledgeGraphItemType,\n NodeItemType,\n} from './define/define';\nimport { GraphQueryService } from './graph.query.service';\nimport { QueryParams, QueryParamsToken } from './const';\n\nexport class GraphService {\n local = inject(GraphLocalService);\n #knowledge = inject(GraphHandleService);\n knowledge = inject(GraphKnolwdgeService);\n #injector = inject(Injector);\n graphExport$$ = this.local.graphExport$$;\n createQuery(queryParams: QueryParams) {\n return createInjector({\n providers: [\n GraphQueryService,\n { provide: QueryParamsToken, useValue: queryParams },\n ],\n parent: this.#injector,\n }).get(GraphQueryService);\n }\n loadDataInit$$ = this.local.loadDataInitGraph$$;\n initGraph() {\n return this.local.initGraph();\n }\n getGraph() {\n return this.local.getGraph();\n }\n async splitNode(options: GraphSplitNodeInput) {\n await this.local.splitNode(options);\n await this.#knowledge.splitNode(options);\n }\n async mergeNode(options: GraphSplitNodeInput) {\n await this.local.mergeNode(options);\n await this.#knowledge.mergeNode(options);\n }\n async changeNodeDescription(item: NodeItemType) {\n await this.local.changeNodeDescription(item);\n await this.#knowledge.changeNodeDescription(item);\n }\n async changeEdge(\n item: EdgeItemType,\n oldItem: Pick<EdgePayload, 'id' | 'source' | 'target'>,\n ) {\n await this.local.changeEdge(item, oldItem);\n await this.#knowledge.changeEdge(item);\n }\n async add(input: KnowledgeGraphItemType) {\n await this.local.add(input);\n await this.#knowledge.addNodeItem(input);\n }\n async deleteNodeItem(item: Pick<NodeItemType, 'id' | 'name'>) {\n await this.local.deleteNodeItem(item);\n await this.#knowledge.deleteNodeItem(item);\n }\n async deleteEdge(item: Pick<EdgeItemType, 'id' | 'source' | 'target'>) {\n await this.local.deleteEdgeItem(item);\n await this.#knowledge.deleteEdge(item);\n }\n async deleteNodeByName(name: string) {\n await this.local.deleteNode(name);\n await this.#knowledge.deleteNodeByName(name);\n }\n}\n", "import { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { inject, Signal } from 'static-injector';\nimport { QueryContext } from './type';\nimport { ConfigToken, ReRankerToken, Text2VecToken } from '../const';\nimport { GraphLocalService } from './graph.local.service';\nimport { QueryParamsToken } from './const';\nimport { differenceBy, uniqBy } from 'lodash-es';\nimport { getEdgeStrList, getNodeStrList } from './util/graph-util';\nimport {\n formatEdgeAttr2,\n FormatGraphEdgeAttr,\n FormatGraphNodeAttr,\n formatNodeAttr2,\n} from './util/format-attr';\nimport { FileChunkPayload } from '../common/define/chunk';\nimport { GraphKnowledgeConfigInline } from './define/config';\nimport { GraphRelationQueryDefine } from './define/query';\nimport * as v from 'valibot';\nimport { EdgeQueryPayload, NodeQueryPayload } from './define';\nexport class GraphQueryService {\n #qdClient = inject(QdrantClientService);\n #config = inject<Signal<GraphKnowledgeConfigInline>>(ConfigToken);\n #graphChange = inject(GraphLocalService);\n #queryParams = inject(QueryParamsToken);\n #text2vec = inject(Text2VecToken);\n #reranker = inject(ReRankerToken);\n\n /** 返回限制索引 */\n #listLimit<T>(\n list: T[],\n strListFn: (list: T, index: number) => string,\n limit: number,\n ) {\n let count = 0;\n const strList = list.map(strListFn);\n for (let i = 0; i < strList.length; i++) {\n const str = strList[i];\n count += str.length;\n if (count > limit) {\n return list.slice(0, i);\n }\n }\n return list;\n }\n #contextLimit<\n T extends { nodes: any[]; edges: any[]; chunks: FileChunkPayload[] },\n >(context: T): T {\n return {\n nodes: this.#listLimit(\n context.nodes,\n (item: any, i) => getNodeStrList(item, i).join('|'),\n this.#queryParams.lengthLimit.node,\n ),\n edges: this.#listLimit(\n context.edges,\n (item: any, i) => getEdgeStrList(item, i).join('|'),\n this.#queryParams.lengthLimit.edge,\n ),\n chunks: this.#listLimit(\n context.chunks,\n (list) => list.chunk,\n this.#queryParams.lengthLimit.chunk,\n ),\n } as any;\n }\n async #queryGraphCollection<T>(content: string, kind: 'node' | 'edge') {\n return this.#qdClient\n .search(this.#config().activateGraphName, {\n limit: this.#queryParams.topK * this.#reranker.getQueryRatio(),\n vector: {\n name: 'chunk',\n vector: await this.#text2vec(\n content,\n this.#config().activateCollection,\n ),\n },\n filter: {\n must: {\n key: 'kind',\n match: {\n value: kind,\n },\n },\n },\n with_payload: true,\n // with_lookup: true,\n })\n .then((item) =>\n item.map((item) => ({ ...item.payload, id: item.id }) as T),\n );\n }\n\n async #findChunkDataById(ids: string[]) {\n return this.#qdClient\n .retrieve(this.#config().activateName, { ids: ids, with_payload: true })\n .then((item) =>\n item.map(\n (item) =>\n ({\n ...item.payload,\n knowledge: this.#config().name,\n }) as any as FileChunkPayload,\n ),\n );\n }\n #getEdgeByNode(nodes: NodeQueryPayload[]) {\n const list = this.#graphChange.getEdgeByNode(nodes);\n return this.#qdClient\n .retrieve(this.#config().activateGraphName, {\n ids: list.map((item) => item.id),\n })\n .then((list) =>\n list.map(\n (item) => ({ ...item.payload, id: item.id }) as EdgeQueryPayload,\n ),\n );\n }\n #getNodeByEdge(edges: EdgeQueryPayload[]) {\n const list = this.#graphChange.getNodeByEdge(edges);\n return this.#qdClient\n .retrieve(this.#config().activateGraphName, {\n ids: list.map((item) => item.id),\n })\n .then((list) =>\n list.map(\n (item) => ({ ...item.payload, id: item.id }) as NodeQueryPayload,\n ),\n );\n }\n async #queryLocal(keywords: string) {\n /** 查询返回的节点组 */\n const nodeGroupResult = await this.#queryGraphCollection<NodeQueryPayload>(\n keywords,\n 'node',\n );\n const chunkResult = await this.#findChunkDataById(\n nodeGroupResult.map((item) => item.chunkId),\n );\n\n return {\n nodes: nodeGroupResult,\n edges: await this.#getEdgeByNode(nodeGroupResult),\n chunks: chunkResult,\n };\n }\n async #queryGlobal(keywords: string) {\n /** 查询返回的边组 */\n const edgeGroupResult = await this.#queryGraphCollection<EdgeQueryPayload>(\n keywords,\n 'edge',\n );\n const chunkResult = await this.#findChunkDataById(\n edgeGroupResult.map((item) => item!['chunkId']),\n );\n\n return {\n nodes: await this.#getNodeByEdge(edgeGroupResult),\n edges: edgeGroupResult,\n chunks: chunkResult,\n };\n }\n async query(params: { node?: string; edge?: string }, question: string) {\n params = v.parse(GraphRelationQueryDefine, params);\n\n await this.#graphChange.loadDataInitGraph$$();\n\n let context: QueryContext;\n if (params.node && params.edge) {\n const context1 = await this.#queryLocal(params.node!);\n const context2 = await this.#queryGlobal(params.edge!);\n // 先合并,然后在排序,然后在截取\n const ctx2NodeExtra = differenceBy(\n context2.nodes,\n context1.nodes,\n (item) => item.id,\n );\n\n const ctx1EdgeExtra = differenceBy(\n context1.edges,\n context2.edges,\n (item) => item.id,\n );\n\n // 其实可以保留前20%的结果,后80%排序\n context = {\n nodes: [...context1.nodes, ...ctx2NodeExtra],\n edges: [...context2.edges, ...ctx1EdgeExtra],\n chunks: uniqBy(\n [...context1.chunks, ...context2.chunks],\n (a) => a.chunk,\n ),\n };\n } else if (params.node) {\n context = await this.#queryLocal(params.node!);\n } else if (params.edge) {\n context = await this.#queryGlobal(params.edge!);\n } else {\n throw new Error('');\n }\n const nodeSortedList = await this.#reranker.run({\n value: question,\n docs: context.nodes.map((item) => item.embeddingChunk),\n });\n const nodeSorted = nodeSortedList\n .slice(0, Math.ceil(nodeSortedList.length * 0.3))\n .reduce(\n (obj, item) => {\n const data = context.nodes[item.index];\n obj[data.name] ??= [];\n obj[data.name].push({ data, score: item.score });\n return obj;\n },\n {} as Record<string, { data: NodeQueryPayload; score: number }[]>,\n );\n\n const edgeSortList = await this.#reranker.run({\n value: question,\n docs: context.edges.map((item) => item.embeddingChunk),\n });\n const edgeSorted = edgeSortList\n .slice(0, Math.ceil(nodeSortedList.length * 0.3))\n .reduce(\n (obj, item) => {\n const data = context.edges[item.index];\n obj[data.name] ??= [];\n obj[data.name].push({ data, score: item.score });\n return obj;\n },\n {} as Record<string, { data: EdgeQueryPayload; score: number }[]>,\n );\n\n return this.#contextLimit({\n nodes: Object.values(nodeSorted)\n .reduce((allList: FormatGraphNodeAttr[], list) => {\n let length = 0;\n const index = list.findIndex((value, index) => {\n length += value.data.description.length;\n return length > this.#queryParams.lengthLimit.nodeDescription;\n });\n allList.push(\n formatNodeAttr2(list.slice(0, index == -1 ? list.length : index)),\n );\n return allList;\n }, [])\n .sort((a, b) => b.degree - a.degree),\n edges: Object.values(edgeSorted)\n .reduce((allList, list) => {\n let length = 0;\n const index = list.findIndex((value) => {\n length += value.data.description.length;\n return length > this.#queryParams.lengthLimit.nodeDescription;\n });\n allList.push(\n formatEdgeAttr2(list.slice(0, index == -1 ? list.length : index)),\n );\n return allList;\n }, [] as FormatGraphEdgeAttr[])\n .sort((a, b) => b.degree - a.degree),\n chunks: (\n await this.#reranker.run({\n value: question,\n docs: context.chunks.map((item) => item.embeddingChunk),\n })\n ).map((item) => context.chunks[item.index]),\n });\n }\n\n async searchNode(str: string, selectedList: string[]) {\n await this.#graphChange.loadDataInitGraph$$();\n\n const limit = 20;\n const list: string[] = [];\n // todo trie?\n for (const nodeName of this.#graphChange.getGraph().nodes()) {\n if (!selectedList.includes(nodeName) && nodeName.includes(str)) {\n list.push(nodeName);\n if (limit === list.length) {\n return list;\n }\n }\n }\n\n return list;\n }\n\n async getFileNameList() {\n const result = await this.#qdClient.queryGroups(\n this.#config().activateName,\n {\n limit: 9999,\n group_by: 'fileName',\n group_size: 1,\n with_payload: [],\n },\n );\n return result.groups;\n }\n async getChunkContent(fileName: string) {\n const { points } = await this.#qdClient.query(this.#config().activateName, {\n limit: 9999,\n filter: {\n must: {\n key: 'fileName',\n match: { value: fileName },\n },\n },\n with_payload: true,\n });\n\n return points.map((item) => ({\n ...item,\n payload: {\n ...item.payload,\n knowledge: this.#config().name,\n } as FileChunkPayload & { knowledge: string },\n }));\n }\n\n async getGraphData() {\n await this.#graphChange.loadDataInitGraph$$();\n return this.#graphChange.getGraph().export();\n }\n\n async queryNode(list: string[], options: { nodeSizeLimit: number }) {\n return this.#qdClient\n .scroll(this.#config().activateGraphName, {\n limit: options.nodeSizeLimit,\n filter: {\n must: [\n {\n key: 'kind',\n match: {\n value: 'node',\n },\n },\n {\n key: 'name',\n match: {\n any: list,\n },\n },\n ],\n },\n with_payload: true,\n // with_lookup: true,\n })\n .then((item) => item.points);\n }\n\n async fuzzyQueryNode(\n content: string,\n options: {\n /** 限制多少个节点 */\n nodeLimit: number;\n /** 精度 */\n score: number;\n /** 限制每个节点多少信息 */\n nodeSizeLimit: number;\n },\n ) {\n return this.#qdClient\n .searchPointGroups(this.#config().activateGraphName, {\n limit: options.nodeLimit,\n score_threshold: options.score,\n vector: {\n name: 'chunk',\n vector: await this.#text2vec(\n content,\n this.#config().activateCollection,\n ),\n },\n group_by: 'name',\n group_size: options.nodeSizeLimit,\n filter: {\n must: {\n key: 'kind',\n match: {\n value: 'node',\n },\n },\n },\n with_payload: true,\n // with_lookup: true,\n })\n .then((item) => item.groups);\n }\n}\n", "import { QueryGraphEdgeAttr, QueryGraphNodeAttr } from './format-attr';\n\n/** 用来计算权重 */\nexport function sigmoid(z: number) {\n return 1 / (1 + Math.exp(-z));\n}\n\nexport function getNodeStrList(item: QueryGraphNodeAttr, index: number) {\n return [\n index + 1,\n item.name,\n item.type,\n item.list.map((item) => item.description).join(';'),\n (item.degree * 100).toFixed(0),\n ];\n}\nexport function getEdgeStrList(item: QueryGraphEdgeAttr, i: number) {\n return [\n i + 1,\n item.source,\n item.target,\n item.list.map((item) => item.description).join(';'),\n (item.degree * 100).toFixed(0),\n ];\n}\n", "import * as v from 'valibot';\nimport {\n EdgePayloadDefine,\n GraphNodeAttr,\n NodePayloadDefine,\n} from '../define/define';\nimport { countBy, maxBy } from 'lodash-es';\n\nexport function getNodeType(list: GraphNodeAttr['list']) {\n const data = countBy(list, (item) => item.type);\n delete data['未知'];\n return maxBy(Object.entries(data), (a) => a[1])?.[0] ?? '未知';\n}\n\nexport function formatNodeAttr2(list: { data: any; score: number }[]) {\n let allCount = 0;\n const attrList = list.map(({ data, score }) => {\n allCount += score;\n return v.parse(NodePayloadDefine, data);\n });\n const score = allCount / list.length;\n const data = countBy(attrList, (item) => item.type);\n delete data['未知'];\n const type = getNodeType(attrList);\n attrList.forEach((item) => {\n item.type = type;\n });\n return {\n list: attrList,\n name: attrList[0].name,\n type: getNodeType(attrList),\n degree: score,\n };\n}\n\nexport type FormatGraphNodeAttr = ReturnType<typeof formatNodeAttr2>;\nexport type QueryGraphNodeAttr = FormatGraphNodeAttr & { degree: number };\n\nexport function formatEdgeAttr2(list: { data: any; score: number }[]) {\n let allCount = 0;\n\n const attrList = list.map(({ data, score }) => {\n allCount += score;\n\n return v.parse(EdgePayloadDefine, data);\n });\n const score = allCount / list.length;\n\n return {\n list: attrList,\n name: attrList[0].name,\n source: attrList[0].source,\n target: attrList[0].target,\n degree: score,\n };\n}\nexport type FormatGraphEdgeAttr = ReturnType<typeof formatEdgeAttr2>;\nexport type QueryGraphEdgeAttr = FormatGraphEdgeAttr & { degree: number };\n", "import * as v from 'valibot';\nexport const GraphRelationQueryDefine = v.pipe(\n v.object({\n node: v.optional(v.string()),\n edge: v.optional(v.string()),\n }),\n v.forward(\n v.partialCheck(\n [['node'], ['edge']],\n (input) =>\n typeof input.node === 'string' || typeof input.edge === 'string',\n '节点或边必须存在一个',\n ),\n ['node'],\n ),\n);\n", "import { getHash } from '@shenghuabi/knowledge/util';\nimport {\n ConfigToken,\n DirToken,\n NormalKnowledgeConfigInline,\n NormalKnowledgeService,\n ReRankerToken,\n Text2VecToken,\n} from '..';\nimport { createNormalizeVfs, path } from '@cyia/vfs2';\nimport { computed, inject, Signal } from 'static-injector';\nimport { QdrantClientService } from '@shenghuabi/knowledge/qdrant';\nimport { FilterOptions, QueryOptions } from '../common/query';\nimport { KnowledgeUtilService } from '../knowledge.util.service';\nimport { ArticleCollectionInlineType } from './define';\nimport { promise as fastq } from 'fastq';\nimport { ArticlePayload, ArticlePayloadType } from './define/payload';\nimport * as v from 'valibot';\nexport class ArticleKnowledgeService extends NormalKnowledgeService {\n #text2vec = inject(Text2VecToken);\n #reranker = inject(ReRankerToken);\n #config = inject<Signal<NormalKnowledgeConfigInline>>(ConfigToken);\n #dir = inject(DirToken);\n #qdClient = inject(QdrantClientService);\n #util = inject(KnowledgeUtilService);\n #vfs = computed(() => createNormalizeVfs({ dir: this.#dir() }));\n\n protected override KeyWordIndex = ['fullName', 'dir', 'fileHash'];\n protected override getPayload(fileName: string, content: string) {\n return {\n fileHash: getHash(content),\n fullName: fileName,\n name: path.basename(fileName),\n dir: path.dirname(fileName),\n };\n }\n override async insertItem(fileName: string, content: string): Promise<void> {\n const { points } = await this.#qdClient.scroll(\n this.#config().activateName,\n {\n limit: 1,\n filter: {\n should: [\n { key: 'fileHash', match: { value: getHash(content) } },\n { key: 'fullName', match: { value: fileName } },\n ],\n },\n },\n );\n if (points.length) {\n return;\n }\n // 不需要生成实体文件,\n await this.insertItemOnly(fileName, content, this.#config().collectionList);\n }\n override async deleteItem(fileName: string) {\n await this.#util.multiDelete(\n this.#config().collectionList.map((item) => item.collectionName),\n {\n filter: {\n must: [{ key: 'fullName', match: { value: fileName } }],\n should: null,\n },\n },\n );\n }\n override async addCollection(collection: ArticleCollectionInlineType) {\n /** 保存文件,新创建的没有 */\n\n await this.createCollection(collection);\n\n try {\n const queue = fastq(async (payload: ArticlePayloadType) => {\n payload = v.parse(ArticlePayload, payload);\n\n const content = await this.#vfs().readContent(payload.fullName);\n if (!content) {\n return;\n }\n await this.insertItemOnly(payload.fullName, content, [collection]);\n }, 10);\n\n let offset: any;\n const wordSet = new Set<string>();\n let queueError;\n queue.error((error) => {\n if (error) {\n queueError = error;\n queue.killAndDrain();\n }\n });\n do {\n const { points, next_page_offset } = await this.#qdClient.scroll(\n this.#config().activateName,\n {\n limit: 5000,\n with_payload: true,\n offset: offset,\n },\n );\n for (const point of points) {\n // 跳过已存在的词条(因为没用实体文件,所以是需要id标记)\n const id = `${point.payload!['fileHash']}`;\n if (wordSet.has(id)) {\n continue;\n }\n wordSet.add(id);\n queue.push(point.payload as any);\n }\n offset = next_page_offset;\n } while (offset);\n await queue.drained();\n if (queueError) {\n throw queueError;\n }\n } catch (error) {\n await this.#qdClient.deleteCollection(collection.collectionName);\n throw error;\n }\n\n await this.#qdClient.setActivateCollection(\n collection.collectionName,\n this.#config().activateName,\n );\n }\n\n override destroy(): Promise<void> {\n return this.#util.destroyKnowledge(\n this.#config().collectionList.map(({ collectionName }) => collectionName),\n );\n }\n\n async searchGroupByChunk(\n text: string,\n options: QueryOptions & {\n group_size: number;\n limit: number;\n },\n filter?: FilterOptions,\n ) {\n const queryResult = await this.#qdClient.searchPointGroups(\n this.#config().activateName,\n {\n group_by: 'hash',\n filter,\n with_payload: true,\n with_vector: false,\n score_threshold: options?.score,\n vector: {\n name: 'chunk',\n vector: await this.#text2vec(text, this.#config().activateCollection),\n },\n group_size: options.group_size * this.#reranker.getQueryRatio(),\n limit: options.limit!,\n },\n );\n\n return Promise.all(\n queryResult.groups.map(async (item) => {\n const resultList = await this.#reranker.run({\n value: text,\n docs: item.hits.map(\n (item) => item.payload?.['embeddingChunk']! as string,\n ),\n });\n return {\n ...item,\n hits: resultList\n .slice(0, options.group_size)\n .map(({ index }) => item.hits[index]),\n };\n }),\n );\n }\n}\n", "import * as v from 'valibot';\nexport const ArticlePayload = v.object({\n fileHash: v.string(),\n fullName: v.string(),\n name: v.string(),\n dir: v.string(),\n chunk: v.string(),\n hash: v.string(),\n loc: v.custom<{ lines: { from: number; to: number } }>(Boolean),\n});\nexport type ArticlePayloadType = v.InferOutput<typeof ArticlePayload>;\n", "import * as v from 'valibot';\nimport { EmbeddingTemplateDefine } from '../../common/define/embedding';\nimport { BaseKnowledgeConfig } from '../../common/define/base';\nimport { getActivateCollectionName } from '../../const';\nexport const ArticleCollectionDefine = v.object({\n collectionName: v.string(),\n embeddingTemplate: v.optional(\n v.object({\n entry: v.optional(EmbeddingTemplateDefine),\n }),\n ),\n size: v.number(),\n});\n\nexport const ArticleKnowledgeConfigDefine = v.pipe(\n v.object({\n ...BaseKnowledgeConfig.entries,\n type: v.optional(v.literal('article'), 'article'),\n collectionList: v.array(ArticleCollectionDefine),\n }),\n v.transform((item) => ({\n ...item,\n /** 激活的普通知识库(文件切片) */\n activateName: getActivateCollectionName(item.name),\n })),\n);\n\nexport type ArticleKnowledgeConfig = v.InferInput<\n typeof ArticleKnowledgeConfigDefine\n>;\nexport type ArticleKnowledgeConfigInline = v.InferOutput<\n typeof ArticleKnowledgeConfigDefine\n>;\nexport type ArticleCollectionInput = v.InferInput<\n typeof ArticleCollectionDefine\n>;\nexport type ArticleCollectionInlineType = v.InferOutput<\n typeof ArticleCollectionDefine\n>;\n", "import * as v from 'valibot';\nexport const FileChunkPayloadDefine = v.object({\n chunk: v.string(),\n fileName: v.string(),\n loc: v.custom<{ lines: { from: number; to: number } }>(Boolean),\n hash: v.string(),\n embeddingChunk: v.string(),\n});\nexport type FileChunkPayload = v.InferOutput<typeof FileChunkPayloadDefine>;\n"],
5
+ "mappings": "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",
6
+ "names": ["createInjector", "inject", "Injector", "RootStaticInjectOptions", "inject", "QdrantClientService", "v4", "fastq", "CacheQueue", "v", "v", "v", "v", "inject", "QdrantClientService", "inject", "inject", "QdrantClientService", "CacheQueue", "fastq", "item", "v4", "inject", "QdrantClientService", "LogToken", "fastq", "InjectionToken", "v4", "QdrantClientService", "computed", "inject", "createNormalizeVfs", "fastq", "isTruthy", "LogToken", "v", "inject", "QdrantClientService", "LogToken", "computed", "createNormalizeVfs", "isTruthy", "signal", "fastq", "v", "v", "runInEmbeddingContext", "inject", "QdrantClientService", "v", "v4", "item", "v", "inject", "QdrantClientService", "runInEmbeddingContext", "QdrantClientService", "computed", "inject", "v", "LogToken", "inject", "QdrantClientService", "computed", "name", "item", "BatchQueue", "inject", "QdrantClientService", "LogToken", "signal", "fastq", "v4", "QdrantClientService", "inject", "Injector", "v4", "v", "isTruthy", "LogToken", "inject", "QdrantClientService", "Injector", "v4", "inject", "Injector", "QdrantClientService", "inject", "uniqBy", "item", "v", "data", "score", "v", "v", "inject", "QdrantClientService", "item", "list", "uniqBy", "index", "inject", "Injector", "path", "getHash", "createNormalizeVfs", "path", "computed", "inject", "QdrantClientService", "fastq", "v", "v", "inject", "QdrantClientService", "computed", "createNormalizeVfs", "getHash", "path", "fastq", "item", "v", "QdrantClientService", "LogToken", "RootStaticInjectOptions", "inject", "Injector", "createInjector", "signal", "content", "path", "v"]
7
+ }
@@ -0,0 +1,4 @@
1
+ import { FileUtilsBase } from '@gutenye/ocr-common';
2
+ export declare class FileUtils extends FileUtilsBase {
3
+ static read(filePath: string): Promise<string>;
4
+ }
@@ -0,0 +1,11 @@
1
+ import { ImageRawBase } from '@gutenye/ocr-common';
2
+ import type { ImageRawData, LineImage, SizeOption } from '@gutenye/ocr-common';
3
+ import sharp from 'sharp';
4
+ export declare class ImageRaw extends ImageRawBase {
5
+ #private;
6
+ static open(path: string): Promise<ImageRaw>;
7
+ constructor(imageRawData: ImageRawData);
8
+ write(path: string): Promise<sharp.OutputInfo>;
9
+ resize(size: SizeOption): Promise<this>;
10
+ drawBox(lineImages: LineImage[]): Promise<this>;
11
+ }
package/ocr/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './ocr';
2
+ export * from './model-config';
@@ -0,0 +1,8 @@
1
+ export declare const ModelConfig: {
2
+ label: string;
3
+ key: string;
4
+ det: string;
5
+ rec: string;
6
+ dict: string;
7
+ cls: string;
8
+ }[];
package/ocr/ocr.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ import BaseOcr, { ModelCreateOptions } from '@gutenye/ocr-common';
2
+ import * as v from 'valibot';
3
+ declare const ImageAdjustDefine: v.ObjectSchema<{
4
+ readonly padding: v.SchemaWithPipe<readonly [v.OptionalSchema<v.UnionSchema<[v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.TransformAction<number, {
5
+ top: number;
6
+ left: number;
7
+ right: number;
8
+ bottom: number;
9
+ }>]>, v.ObjectSchema<{
10
+ readonly left: v.NumberSchema<undefined>;
11
+ readonly right: v.NumberSchema<undefined>;
12
+ readonly top: v.NumberSchema<undefined>;
13
+ readonly bottom: v.NumberSchema<undefined>;
14
+ }, undefined>], undefined>, {
15
+ readonly top: 50;
16
+ readonly right: 50;
17
+ readonly left: 50;
18
+ readonly bottom: 50;
19
+ }>]>;
20
+ readonly maxSideLen: v.OptionalSchema<v.UnionSchema<[v.SchemaWithPipe<readonly [v.NumberSchema<undefined>]>], undefined>, 1920>;
21
+ }, undefined>;
22
+ export type ImageAdjustType = v.InferInput<typeof ImageAdjustDefine>;
23
+ declare function convert(this: BaseOcr, input: string | Uint8Array, options?: ImageAdjustType): Promise<import("@gutenye/ocr-common").Line[]>;
24
+ export declare class Ocr extends BaseOcr {
25
+ static create(options?: ModelCreateOptions): Promise<BaseOcr & {
26
+ convert: typeof convert;
27
+ }>;
28
+ }
29
+ export {};