diff --git a/backend/src/services/conversationService.ts b/backend/src/services/conversationService.ts index ab65c930..8a6d9ad8 100644 --- a/backend/src/services/conversationService.ts +++ b/backend/src/services/conversationService.ts @@ -141,6 +141,13 @@ export class ConversationService { userInput: string, knowledgeBaseContext?: string ): Promise { + console.log('🔧 [assembleContext] 开始组装上下文', { + conversationId, + agentId, + hasKnowledgeBaseContext: !!knowledgeBaseContext, + knowledgeBaseContextLength: knowledgeBaseContext?.length || 0 + }); + // 获取系统Prompt const systemPrompt = agentService.getSystemPrompt(agentId); @@ -161,6 +168,7 @@ export class ConversationService { // 判断是否是第一条消息 const isFirstMessage = historyMessages.length === 0; + console.log(`📜 [assembleContext] 历史消息数: ${historyMessages.length}, 是否首次: ${isFirstMessage}`); // 渲染用户Prompt let userPromptContent: string; @@ -172,12 +180,16 @@ export class ConversationService { userInput, knowledgeBaseContext, }); + console.log(`📝 [assembleContext] 首次消息,使用完整模板,长度: ${userPromptContent.length}`); } else { // 后续消息:只发送用户输入和知识库上下文(如果有) if (knowledgeBaseContext) { userPromptContent = `${userInput}\n\n## 参考文献(来自知识库)\n${knowledgeBaseContext}`; + console.log(`📝 [assembleContext] 后续消息+知识库,总长度: ${userPromptContent.length}`); + console.log(`📋 [assembleContext] userPromptContent预览:\n${userPromptContent.substring(0, 300)}...`); } else { userPromptContent = userInput; + console.log(`📝 [assembleContext] 后续消息,仅用户输入: ${userPromptContent}`); } } @@ -203,6 +215,7 @@ export class ConversationService { content: userPromptContent, }); + console.log(`✅ [assembleContext] 组装完成,消息总数: ${messages.length}`); return messages; } @@ -334,6 +347,7 @@ export class ConversationService { const conversation = await this.getConversationById(conversationId, userId); // 获取知识库上下文(如果有@知识库) + console.log('📚 [sendMessageStream] 开始处理知识库', { knowledgeBaseIds }); let knowledgeBaseContext = ''; if (knowledgeBaseIds && knowledgeBaseIds.length > 0) { const knowledgeResults: string[] = []; @@ -341,6 +355,7 @@ export class ConversationService { // 对每个知识库进行检索 for (const kbId of knowledgeBaseIds) { try { + console.log(`🔎 [sendMessageStream] 检索知识库 ${kbId}`); const searchResult = await knowledgeBaseService.searchKnowledgeBase( userId, kbId, @@ -348,6 +363,11 @@ export class ConversationService { 3 // 每个知识库返回3个最相关的段落 ); + console.log(`✅ [sendMessageStream] 检索结果`, { + kbId, + recordCount: searchResult.records?.length || 0 + }); + // 格式化检索结果 if (searchResult.records && searchResult.records.length > 0) { const kbInfo = await prisma.knowledgeBase.findUnique({ @@ -355,25 +375,34 @@ export class ConversationService { select: { name: true }, }); - knowledgeResults.push( - `【知识库:${kbInfo?.name || '未命名'}】\n` + + const formattedResult = `【知识库:${kbInfo?.name || '未命名'}】\n` + searchResult.records .map((record: any, index: number) => { const score = (record.score * 100).toFixed(1); return `${index + 1}. [相关度${score}%] ${record.segment.content}`; }) - .join('\n\n') - ); + .join('\n\n'); + + console.log(`📄 [sendMessageStream] 格式化结果长度: ${formattedResult.length} 字符`); + knowledgeResults.push(formattedResult); + } else { + console.warn(`⚠️ [sendMessageStream] 知识库 ${kbId} 没有检索到记录`); } } catch (error) { - console.error(`Failed to search knowledge base ${kbId}:`, error); + console.error(`❌ [sendMessageStream] 检索知识库失败 ${kbId}:`, error); // 检索失败不阻止对话,继续处理 } } if (knowledgeResults.length > 0) { knowledgeBaseContext = knowledgeResults.join('\n\n---\n\n'); + console.log(`💾 [sendMessageStream] 知识库上下文总长度: ${knowledgeBaseContext.length} 字符`); + console.log(`📋 [sendMessageStream] 知识库上下文预览:\n${knowledgeBaseContext.substring(0, 500)}...`); + } else { + console.warn('⚠️ [sendMessageStream] 没有构建任何知识库上下文'); } + } else { + console.log('ℹ️ [sendMessageStream] 未选择知识库'); } // 组装上下文 diff --git a/backend/src/services/knowledgeBaseService.ts b/backend/src/services/knowledgeBaseService.ts index bc10b9c9..3e7ee5d9 100644 --- a/backend/src/services/knowledgeBaseService.ts +++ b/backend/src/services/knowledgeBaseService.ts @@ -231,8 +231,6 @@ export async function searchKnowledgeBase( retrieval_model: { search_method: 'semantic_search', top_k: topK, - score_threshold_enabled: true, - score_threshold: 0.3, }, } );