From e2b270e705c167cefdf53c96b3977329f33698a8 Mon Sep 17 00:00:00 2001 From: "xiao12feng@outlook.com" Date: Sat, 20 Dec 2025 18:05:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96RAG=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93=E8=B0=83=E7=94=A8=E5=8A=9F=E8=83=BD=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E6=8E=A7=E5=88=B6=E5=8F=B0=E6=97=A5=E5=BF=97=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E5=92=8C=E4=B8=AA=E6=80=A7=E5=8C=96=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主要更改: 1. rag-python/app.py: - /api/rag-analyze 接口添加 similarity 字段 - 添加服务端控制台日志打印检索结果 2. PromptBuilder.java: - 增强角色设定,强调先共情后分析的风格 - 根据年龄自动添加关注点提示 - 根据职业自动添加相关压力源提示 - 增加参考资料长度限制 - 新增核心原则:个性化优先、具体化表达、共情式开头 - 建议分层:即时可行、短期调整、长期发展 3. comprehensive.vue: - 添加详细的浏览器控制台日志输出 - 显示检索到的知识库文件列表、相似度和内容预览 --- rag-python/app.py | 77 +++++ .../ddnai/system/rag/util/PromptBuilder.java | 269 +++++++++++++----- .../views/psychology/report/comprehensive.vue | 62 +++- 3 files changed, 332 insertions(+), 76 deletions(-) diff --git a/rag-python/app.py b/rag-python/app.py index e53154b9..2e952195 100644 --- a/rag-python/app.py +++ b/rag-python/app.py @@ -88,6 +88,11 @@ def search(): results = knowledge_service.search(query, top_k) + # 打印调试信息 + print(f"[Search] Query: {query[:50]}..., Results: {len(results)}") + for i, r in enumerate(results): + print(f" [{i+1}] filename: {r.get('filename')}, content_len: {len(r.get('content', ''))}") + return jsonify({ 'success': True, 'data': results @@ -131,6 +136,78 @@ def scan_folder(): except Exception as e: return jsonify({'success': False, 'error': str(e)}), 500 +@app.route('/api/rag-analyze', methods=['POST']) +def rag_analyze(): + """RAG增强的AI分析 - 结合知识库生成分析报告""" + try: + data = request.get_json() + report_content = data.get('reportContent', '') + report_title = data.get('reportTitle', '心理测评报告') + + if not report_content: + return jsonify({'success': False, 'error': '报告内容不能为空'}), 400 + + # 1. 从报告中提取关键词进行知识库检索 + # 提取纯文本(去除HTML标签) + import re + text_content = re.sub(r'<[^>]*>', '', report_content) + + # 提取关键信息用于检索 + query_keywords = [] + # 提取因子名称 + factor_matches = re.findall(r'([\u4e00-\u9fa5]+(?:焦虑|抑郁|压力|情绪|睡眠|躯体|认知|人格|心理)[\u4e00-\u9fa5]*)', text_content) + query_keywords.extend(factor_matches[:5]) + # 提取等级 + level_matches = re.findall(r'(正常|轻度|中度|重度|严重)', text_content) + query_keywords.extend(level_matches[:3]) + + query = ' '.join(set(query_keywords)) if query_keywords else '心理测评 分析 建议' + + # 2. 检索相关知识 + search_results = knowledge_service.search(query, top_k=5) + + # 3. 构建知识库上下文 + knowledge_context = "" + sources = [] + if search_results and len(search_results) > 0: + knowledge_parts = [] + for i, result in enumerate(search_results[:5]): + content = result.get('content', '') + filename = result.get('filename', '未知来源') + similarity = result.get('similarity', 0) + if content: + knowledge_parts.append(f"【参考资料{i+1}】({filename})\n{content[:500]}") + sources.append({ + 'filename': filename, + 'content': content[:200] + '...' if len(content) > 200 else content, + 'similarity': similarity + }) + knowledge_context = '\n\n'.join(knowledge_parts) + + # 打印调试信息到控制台 + print("=" * 50) + print("📚 RAG-Analyze 检索结果") + print("=" * 50) + print(f"查询关键词: {query}") + print(f"检索到文档数: {len(sources)}") + for i, s in enumerate(sources): + print(f" [{i+1}] {s['filename']} (相似度: {s.get('similarity', 0):.4f})") + print("=" * 50) + + # 4. 返回检索结果,让前端调用AI + return jsonify({ + 'success': True, + 'data': { + 'knowledgeContext': knowledge_context, + 'sources': sources, + 'query': query + } + }) + except Exception as e: + import traceback + traceback.print_exc() + return jsonify({'success': False, 'error': str(e)}), 500 + def init_service(): """初始化服务""" print("=" * 50) diff --git a/ry-xinli-system/src/main/java/com/ddnai/system/rag/util/PromptBuilder.java b/ry-xinli-system/src/main/java/com/ddnai/system/rag/util/PromptBuilder.java index 3892699b..1276a728 100644 --- a/ry-xinli-system/src/main/java/com/ddnai/system/rag/util/PromptBuilder.java +++ b/ry-xinli-system/src/main/java/com/ddnai/system/rag/util/PromptBuilder.java @@ -1,14 +1,15 @@ package com.ddnai.system.rag.util; import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONWriter; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; /** - * 提示词构建工? - * 构建发送给大模型的提示词,确保包含所有必要信? + * 提示词构建工具 + * 构建发送给大模型的提示词,确保包含所有必要信息 * * @author ddnai */ @@ -16,156 +17,282 @@ import java.util.Map; public class PromptBuilder { /** - * 构建报告生成提示? + * 构建报告生成提示词 * - * @param retrievedDocs 检索到的文? + * @param retrievedDocs 检索到的文档 * @param assessmentData 测评数据 * @param userProfile 用户档案 - * @return 提示? + * @return 提示词 */ public String buildReportPrompt(List> retrievedDocs, Map assessmentData, Map userProfile) { StringBuilder prompt = new StringBuilder(); - prompt.append("你是一位专业的监狱心理学专家。请基于以下专业知识和测评数据,生成详细的综合心理分析报告。\n\n"); + // 增强的角色设定 + prompt.append("# 角色设定\n"); + prompt.append("你是一位资深的临床心理学专家,拥有20年以上的心理评估和咨询经验。"); + prompt.append("你的分析风格是:先共情理解,再专业分析,最后给出具体可行的建议。"); + prompt.append("你善于根据来访者的年龄、性别、职业等背景信息,提供高度个性化的解读。\n\n"); - // 添加检索到的专业知? + // 添加检索到的专业知识 if (retrievedDocs != null && !retrievedDocs.isEmpty()) { - prompt.append("【专业知识参考】\n"); + prompt.append("# 专业知识库参考\n"); + prompt.append("以下是与本次测评相关的专业知识和案例,请在分析时参考并引用:\n\n"); for (int i = 0; i < retrievedDocs.size(); i++) { Map doc = retrievedDocs.get(i); String content = (String) doc.get("content"); - String filename = (String) doc.get("filename"); - Double similarity = (Double) doc.get("similarity"); + String filename = (String) doc.getOrDefault("filename", "参考资料"); - prompt.append(String.format("%d. 来源?s(相关度?.2f)\n", i + 1, filename, similarity)); - prompt.append(content).append("\n\n"); + if (content != null && !content.isEmpty()) { + prompt.append(String.format("## 参考资料%d(来源:%s)\n", i + 1, filename)); + // 增加参考资料长度限制 + if (content.length() > 1500) { + content = content.substring(0, 1500) + "..."; + } + prompt.append(content).append("\n\n"); + } } } - // 添加用户档案 + // 增强的用户档案分析 if (userProfile != null && !userProfile.isEmpty()) { - prompt.append("【用户档案】\n"); - prompt.append(JSON.toJSONString(userProfile)).append("\n\n"); + prompt.append("# 被测评人背景信息(重要!请务必结合这些信息进行个性化分析)\n"); + + Object age = userProfile.get("age"); + Object gender = userProfile.get("gender"); + Object education = userProfile.get("education"); + Object occupation = userProfile.get("occupation"); + + if (age != null) { + prompt.append("- 年龄:").append(age).append("岁"); + // 添加年龄段特征提示 + int ageInt = Integer.parseInt(age.toString()); + if (ageInt < 18) { + prompt.append("(青少年期,关注学业压力、同伴关系、身份认同)"); + } else if (ageInt < 30) { + prompt.append("(青年期,关注职业发展、亲密关系、自我实现)"); + } else if (ageInt < 50) { + prompt.append("(中年期,关注工作压力、家庭责任、健康关注)"); + } else { + prompt.append("(中老年期,关注退休适应、健康状况、人生意义)"); + } + prompt.append("\n"); + } + if (gender != null) { + prompt.append("- 性别:").append(gender).append("\n"); + } + if (education != null) { + prompt.append("- 学历:").append(education).append("\n"); + } + if (occupation != null) { + prompt.append("- 职业:").append(occupation); + // 添加职业相关提示 + String occStr = occupation.toString(); + if (occStr.contains("学生")) { + prompt.append("(关注学业压力、考试焦虑、人际关系)"); + } else if (occStr.contains("教师") || occStr.contains("医") || occStr.contains("护")) { + prompt.append("(关注职业倦怠、共情疲劳、工作压力)"); + } else if (occStr.contains("经理") || occStr.contains("主管") || occStr.contains("总")) { + prompt.append("(关注管理压力、决策焦虑、工作生活平衡)"); + } + prompt.append("\n"); + } + + // 添加其他可能的背景信息 + for (Map.Entry entry : userProfile.entrySet()) { + String key = entry.getKey(); + if (!key.equals("age") && !key.equals("gender") && !key.equals("education") && !key.equals("occupation")) { + prompt.append("- ").append(key).append(":").append(entry.getValue()).append("\n"); + } + } + prompt.append("\n"); } // 添加测评数据 if (assessmentData != null && !assessmentData.isEmpty()) { - prompt.append("【测评数据】\n"); - prompt.append(JSON.toJSONString(assessmentData)).append("\n\n"); + prompt.append("# 测评数据详情\n"); + prompt.append("```json\n"); + prompt.append(JSON.toJSONString(assessmentData, JSONWriter.Feature.PrettyFormat)).append("\n"); + prompt.append("```\n\n"); } - // 添加生成要求 - prompt.append("【生成要求】\n"); - prompt.append("请基于以上信息,生成一份专业的综合心理分析报告,报告应包括:\n"); - prompt.append("1. 综合评估:整体心理状态分析\n"); - prompt.append("2. 风险分析:潜在心理风险识别\n"); - prompt.append("3. 矫治建议:具体的心理干预和矫治方案\n"); - prompt.append("4. 关注要点:需要重点关注的心理问题\n\n"); - prompt.append("请确保报告内容专业、准确、具有可操作性,并引用相关的心理学理论支持你的分析。\n"); + // 增强的生成要求 + prompt.append("# 分析报告要求\n\n"); + prompt.append("请根据以上测评数据、专业知识和被测评人的背景信息,生成一份详细、专业、高度个性化的心理分析报告。\n\n"); + + prompt.append("## 核心原则\n"); + prompt.append("1. **个性化优先**:必须结合被测评人的年龄、性别、职业等信息进行分析,不能写通用内容\n"); + prompt.append("2. **具体化表达**:用具体的行为描述代替抽象术语,如\"您可能经常感到紧张,难以放松\"而非\"您有焦虑倾向\"\n"); + prompt.append("3. **共情式开头**:先表达对被测评人处境的理解,再进行分析\n"); + prompt.append("4. **可操作建议**:每条建议都要具体到可以立即执行的程度\n\n"); + + prompt.append("## 报告结构要求\n\n"); + + prompt.append("### 1. 开篇(100-150字)\n"); + prompt.append("- 以温和、支持的语气开始\n"); + prompt.append("- 结合被测评人的背景表达理解(如:\"作为一名XX岁的XX,您正面临...\")\n"); + prompt.append("- 简要概括测评结果的整体情况\n\n"); + + prompt.append("### 2. 详细分析(每个因子150-250字)\n"); + prompt.append("针对每个测评因子进行深入分析:\n"); + prompt.append("- 用通俗语言解释该因子得分的含义\n"); + prompt.append("- 描述被测评人可能正在经历的具体感受和表现\n"); + prompt.append("- 结合其年龄、职业等背景分析可能的原因\n"); + prompt.append("- 引用知识库中的专业内容支持分析\n"); + prompt.append("- 指出该因子与其他因子的关联(如有)\n\n"); + + prompt.append("### 3. 个性化建议(300-400字)\n"); + prompt.append("提供分层次的具体建议:\n"); + prompt.append("- **即时可行**(本周可以开始):3-4条简单、具体的行动\n"); + prompt.append("- **短期调整**(1-4周):需要培养的习惯或技能\n"); + prompt.append("- **长期发展**(1-3个月):持续关注的方向\n"); + prompt.append("- 每条建议都要说明具体做法,而非泛泛而谈\n"); + prompt.append("- 建议要符合被测评人的实际情况(年龄、职业等)\n\n"); + + prompt.append("### 4. 总结与鼓励(100-150字)\n"); + prompt.append("- 肯定被测评人的优势和资源\n"); + prompt.append("- 强调改变的可能性\n"); + prompt.append("- 说明何时需要寻求专业帮助\n"); + prompt.append("- 以积极、温暖的语气结束\n\n"); + + prompt.append("## 写作风格要求\n"); + prompt.append("- 使用第二人称\"您\",语气温和、专业、支持性\n"); + prompt.append("- 避免使用\"患者\"、\"症状\"等医学化标签\n"); + prompt.append("- 多用\"可能\"、\"也许\"等柔和表达,避免绝对化判断\n"); + prompt.append("- 分析要具体,避免\"注意休息\"、\"保持乐观\"等空洞建议\n"); + prompt.append("- 必须引用知识库中的专业内容来支持分析\n\n"); + + prompt.append("请开始生成报告:\n"); return prompt.toString(); } + /** - * 构建问答提示? + * 构建问答提示词 * * @param question 问题 - * @param retrievedDocs 检索到的文? - * @return 提示? + * @param retrievedDocs 检索到的文档 + * @return 提示词 */ public String buildQAPrompt(String question, List> retrievedDocs) { StringBuilder prompt = new StringBuilder(); - prompt.append("你是一位专业的心理学专家。请基于以下专业知识回答问题。\n\n"); + prompt.append("# 角色设定\n"); + prompt.append("你是一位专业的心理学顾问,能够基于专业知识回答心理健康相关问题。\n\n"); - // 添加检索到的专业知? + // 添加检索到的专业知识 if (retrievedDocs != null && !retrievedDocs.isEmpty()) { - prompt.append("【相关知识】\n"); + prompt.append("# 相关专业知识\n"); + prompt.append("以下是与问题相关的专业资料,请基于这些内容回答:\n\n"); for (int i = 0; i < retrievedDocs.size(); i++) { Map doc = retrievedDocs.get(i); String content = (String) doc.get("content"); - String filename = (String) doc.get("filename"); + String filename = (String) doc.getOrDefault("filename", "参考资料"); - prompt.append(String.format("%d. 来源?s\n", i + 1, filename)); - prompt.append(content).append("\n\n"); + if (content != null && !content.isEmpty()) { + prompt.append(String.format("## 资料%d(%s)\n", i + 1, filename)); + if (content.length() > 600) { + content = content.substring(0, 600) + "..."; + } + prompt.append(content).append("\n\n"); + } } } // 添加问题 - prompt.append("【问题】\n"); + prompt.append("# 用户问题\n"); prompt.append(question).append("\n\n"); // 添加回答要求 - prompt.append("【回答要求】\n"); - prompt.append("1. 请基于上述专业知识回答问题\n"); - prompt.append("2. 回答要准确、专业、易懂\n"); - prompt.append("3. 如果知识库中没有相关信息,请明确说明\n"); - prompt.append("4. 可以引用具体的理论或研究支持你的回答\n"); + prompt.append("# 回答要求\n"); + prompt.append("1. 基于上述专业知识回答,必须引用相关内容\n"); + prompt.append("2. 回答要准确、专业、易于理解\n"); + prompt.append("3. 如果知识库中没有直接相关的信息,请说明并给出一般性建议\n"); + prompt.append("4. 语气要温和、支持性\n"); + prompt.append("5. 如果问题涉及严重心理问题,建议寻求专业帮助\n\n"); + + prompt.append("请回答:\n"); return prompt.toString(); } /** - * 构建建议生成提示? + * 构建建议生成提示词 * * @param userProfile 用户档案 * @param assessmentData 测评数据 - * @param retrievedDocs 检索到的文? - * @return 提示? + * @param retrievedDocs 检索到的文档 + * @return 提示词 */ public String buildSuggestionPrompt(Map userProfile, Map assessmentData, List> retrievedDocs) { StringBuilder prompt = new StringBuilder(); - prompt.append("你是一位专业的监狱心理矫治专家。请基于以下信息,提供具体的心理矫治建议。\n\n"); + prompt.append("# 角色设定\n"); + prompt.append("你是一位经验丰富的心理咨询师,擅长制定个性化的心理健康改善方案。\n\n"); - // 添加检索到的专业知? + // 添加检索到的专业知识 if (retrievedDocs != null && !retrievedDocs.isEmpty()) { - prompt.append("【专业知识参考】\n"); + prompt.append("# 专业知识参考\n"); for (int i = 0; i < retrievedDocs.size(); i++) { Map doc = retrievedDocs.get(i); String content = (String) doc.get("content"); - String filename = (String) doc.get("filename"); + String filename = (String) doc.getOrDefault("filename", "参考资料"); - prompt.append(String.format("%d. 来源?s\n", i + 1, filename)); - prompt.append(content).append("\n\n"); + if (content != null && !content.isEmpty()) { + prompt.append(String.format("## %s\n", filename)); + if (content.length() > 500) { + content = content.substring(0, 500) + "..."; + } + prompt.append(content).append("\n\n"); + } } } // 添加用户档案 if (userProfile != null && !userProfile.isEmpty()) { - prompt.append("【用户档案】\n"); - prompt.append(JSON.toJSONString(userProfile)).append("\n\n"); + prompt.append("# 用户信息\n"); + prompt.append(JSON.toJSONString(userProfile, JSONWriter.Feature.PrettyFormat)).append("\n\n"); } // 添加测评数据 if (assessmentData != null && !assessmentData.isEmpty()) { - prompt.append("【测评数据】\n"); - prompt.append(JSON.toJSONString(assessmentData)).append("\n\n"); + prompt.append("# 测评结果\n"); + prompt.append(JSON.toJSONString(assessmentData, JSONWriter.Feature.PrettyFormat)).append("\n\n"); } // 添加生成要求 - prompt.append("【生成要求】\n"); - prompt.append("请提供以下方面的矫治建议:\n"); - prompt.append("1. 短期干预措施?-3个月)\n"); - prompt.append("2. 中期矫治计划?-6个月)\n"); - prompt.append("3. 长期发展目标?个月以上)\n"); - prompt.append("4. 具体的心理技术和方法\n"); - prompt.append("5. 需要注意的事项和风险点\n\n"); - prompt.append("建议应具体、可操作、符合监狱环境特点。\n"); + prompt.append("# 建议方案要求\n\n"); + prompt.append("请提供一份详细的个性化改善建议方案:\n\n"); + + prompt.append("## 1. 即时可行的建议(本周可以开始)\n"); + prompt.append("- 3-5条具体、简单、可立即执行的建议\n"); + prompt.append("- 每条建议说明具体做法和预期效果\n\n"); + + prompt.append("## 2. 短期改善计划(1-4周)\n"); + prompt.append("- 需要培养的习惯或技能\n"); + prompt.append("- 具体的练习方法和频率\n"); + prompt.append("- 可能遇到的困难和应对方法\n\n"); + + prompt.append("## 3. 长期发展建议(1-3个月)\n"); + prompt.append("- 需要持续关注的方面\n"); + prompt.append("- 推荐的学习资源或活动\n"); + prompt.append("- 何时需要寻求专业帮助\n\n"); + + prompt.append("## 4. 注意事项\n"); + prompt.append("- 需要避免的行为或思维模式\n"); + prompt.append("- 可能的风险信号\n\n"); + + prompt.append("请确保建议具体、实用、符合用户的实际情况。\n"); return prompt.toString(); } /** - * 构建简单的生成提示? - * - * @param systemPrompt 系统提示 - * @param userPrompt 用户提示 - * @return 提示? + * 构建简单的生成提示词 */ public String buildSimplePrompt(String systemPrompt, String userPrompt) { StringBuilder prompt = new StringBuilder(); @@ -182,11 +309,7 @@ public class PromptBuilder { } /** - * 验证提示词是否包含必要信? - * - * @param prompt 提示? - * @param requiredKeywords 必需的关键词 - * @return 是否包含所有必需关键? + * 验证提示词是否包含必要信息 */ public boolean validatePrompt(String prompt, List requiredKeywords) { if (prompt == null || prompt.isEmpty()) { @@ -208,10 +331,6 @@ public class PromptBuilder { /** * 截断过长的提示词 - * - * @param prompt 提示? - * @param maxLength 最大长? - * @return 截断后的提示? */ public String truncatePrompt(String prompt, int maxLength) { if (prompt == null || prompt.length() <= maxLength) { diff --git a/xinli-ui/src/views/psychology/report/comprehensive.vue b/xinli-ui/src/views/psychology/report/comprehensive.vue index d0f70607..986f7d8a 100644 --- a/xinli-ui/src/views/psychology/report/comprehensive.vue +++ b/xinli-ui/src/views/psychology/report/comprehensive.vue @@ -151,6 +151,7 @@ export default { generating: false, reportDialogVisible: false, comprehensiveReport: '', + ragSourcesForReport: [], // RAG知识库来源 // ========== Kimi API配置 ========== API_URL: 'https://api.moonshot.cn/v1/chat/completions', API_KEY: 'sk-U9fdriPxwBcrpWW0Ite3N0eVtX7VxnqqqYUIBAdWd1hgEA9m', @@ -721,10 +722,55 @@ export default { // Kimi API 调用方法 async callOLLAMA(prompt) { try { + // 1. 先调用RAG服务获取知识库上下文 + let knowledgeContext = ''; + let ragSources = []; + const RAG_API_URL = 'http://localhost:5000/api/rag-analyze'; + + try { + // 从prompt中提取关键信息用于RAG检索 + const ragResponse = await axios.post(RAG_API_URL, { + reportContent: prompt, + reportTitle: '综合心理评估' + }, { timeout: 10000 }); + + if (ragResponse.data && ragResponse.data.success) { + knowledgeContext = ragResponse.data.data.knowledgeContext || ''; + ragSources = ragResponse.data.data.sources || []; + + // ========== 在控制台打印完整的知识库引用信息 ========== + console.log('========================================'); + console.log('📚 RAG知识库检索结果'); + console.log('========================================'); + console.log('检索到的文档数量:', ragSources.length); + console.log(''); + console.log('📋 引用的知识库文件列表:'); + ragSources.forEach((source, index) => { + console.log(` ${index + 1}. 文件名: ${source.filename || '未知'}`); + console.log(` 相似度: ${source.similarity ? (source.similarity * 100).toFixed(2) + '%' : '未知'}`); + console.log(` 内容预览: ${source.content ? source.content.substring(0, 100) + '...' : '无内容'}`); + console.log(''); + }); + console.log('========================================'); + console.log('📝 知识库上下文长度:', knowledgeContext.length, '字符'); + console.log('========================================'); + // ========== 打印结束 ========== + } + } catch (ragErr) { + console.warn('RAG服务调用失败,将不使用知识库增强:', ragErr.message); + } + + // 2. 如果有知识库上下文,添加到prompt中 + let enhancedPrompt = prompt; + if (knowledgeContext) { + enhancedPrompt = prompt + '\n\n【专业知识库参考资料】\n' + knowledgeContext + '\n\n请结合以上专业心理学资料进行分析,使报告更加专业和有深度。'; + } + + // 3. 调用AI API const { data } = await axios.post(this.API_URL, { model: this.MODEL, messages: [ - { role: 'user', content: prompt } + { role: 'user', content: enhancedPrompt } ], temperature: 0.3, max_tokens: 8000, // 增加token数量以支持3000字以上的报告 @@ -742,6 +788,11 @@ export default { console.log('原始响应:', response) console.log('完整data:', data) + + // 4. 如果有知识库来源,添加参考资料说明 + if (ragSources && ragSources.length > 0) { + this.ragSourcesForReport = ragSources; + } // 清理响应内容 response = response @@ -854,6 +905,15 @@ export default { ⚠️ 此结果仅供参考,不可作为临床诊断的唯一标准

+ + ${this.ragSourcesForReport && this.ragSourcesForReport.length > 0 ? ` +
+

参考知识库资料

+
    + ${this.ragSourcesForReport.map(source => `
  • ${source.filename}
  • `).join('')} +
+
+ ` : ''} ` return reportHtml