From 4c4cc52c0774e81166f7e98c890c25382d50f233 Mon Sep 17 00:00:00 2001 From: one Date: Thu, 11 Sep 2025 19:05:17 +0800 Subject: [PATCH] fix: websearch rag concurrency (#10107) * fix(WebSearchService): serialize rag operations * refactor: improve a hint in websearch settings --- .../WebSearchSettings/BasicSettings.tsx | 4 +-- src/renderer/src/services/WebSearchService.ts | 27 ++++++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/renderer/src/pages/settings/WebSearchSettings/BasicSettings.tsx b/src/renderer/src/pages/settings/WebSearchSettings/BasicSettings.tsx index 79ac56237c..2f301ac957 100644 --- a/src/renderer/src/pages/settings/WebSearchSettings/BasicSettings.tsx +++ b/src/renderer/src/pages/settings/WebSearchSettings/BasicSettings.tsx @@ -11,7 +11,7 @@ import { SettingDivider, SettingGroup, SettingRow, SettingRowTitle, SettingTitle const BasicSettings: FC = () => { const { theme } = useTheme() - const { searchWithTime, maxResults } = useWebSearchSettings() + const { searchWithTime, maxResults, compressionConfig } = useWebSearchSettings() const dispatch = useAppDispatch() @@ -28,7 +28,7 @@ const BasicSettings: FC = () => { {t('settings.tool.websearch.search_max_result.label')} - {maxResults > 20 && ( + {maxResults > 20 && compressionConfig?.method === 'none' && ( diff --git a/src/renderer/src/services/WebSearchService.ts b/src/renderer/src/services/WebSearchService.ts index 46a00e812a..a7feca7267 100644 --- a/src/renderer/src/services/WebSearchService.ts +++ b/src/renderer/src/services/WebSearchService.ts @@ -283,6 +283,8 @@ class WebSearchService { // 2. 合并所有结果并按分数排序 const flatResults = allResults.flat().sort((a, b) => b.score - a.score) + logger.debug(`Found ${flatResults.length} result(s) in search base related to question(s): `, questions) + // 3. 去重,保留最高分的重复内容 const seen = new Set() const uniqueResults = flatResults.filter((item) => { @@ -293,6 +295,8 @@ class WebSearchService { return true }) + logger.debug(`Found ${uniqueResults.length} unique result(s) from search base after sorting and deduplication`) + // 4. 转换为引用格式 return await Promise.all( uniqueResults.map(async (result, index) => ({ @@ -327,12 +331,17 @@ class WebSearchService { Math.max(0, rawResults.length) * (config.documentCount ?? DEFAULT_WEBSEARCH_RAG_DOCUMENT_COUNT) const searchBase = await this.ensureSearchBase(config, totalDocumentCount, requestId) + logger.debug('Search base for RAG compression: ', searchBase) // 1. 清空知识库 - await window.api.knowledgeBase.reset(getKnowledgeBaseParams(searchBase)) + const baseParams = getKnowledgeBaseParams(searchBase) + await window.api.knowledgeBase.reset(baseParams) - // 2. 一次性添加所有搜索结果到知识库 - const addPromises = rawResults.map(async (result) => { + logger.debug('Search base parameters for RAG compression: ', baseParams) + + // 2. 顺序添加所有搜索结果到知识库 + // FIXME: 目前的知识库 add 不支持并发 + for (const result of rawResults) { const item: KnowledgeItem & { sourceUrl?: string } = { id: uuid(), type: 'note', @@ -347,10 +356,7 @@ class WebSearchService { base: getKnowledgeBaseParams(searchBase), item }) - }) - - // 等待所有结果添加完成 - await Promise.all(addPromises) + } // 3. 对知识库执行多问题搜索获取压缩结果 const references = await this.querySearchBase(questions, searchBase) @@ -475,6 +481,7 @@ class WebSearchService { // 统计成功完成的搜索数量 const successfulSearchCount = searchResults.filter((result) => result.status === 'fulfilled').length + logger.verbose(`Successful search count: ${successfulSearchCount}`) if (successfulSearchCount > 1) { await this.setWebSearchStatus( requestId, @@ -498,6 +505,12 @@ class WebSearchService { } }) + logger.verbose(`FulFilled search result count: ${finalResults.length}`) + logger.verbose( + 'FulFilled search result: ', + finalResults.map(({ title, url }) => ({ title, url })) + ) + // 如果没有搜索结果,直接返回空结果 if (finalResults.length === 0) { await this.setWebSearchStatus(requestId, { phase: 'default' })