feat: 增强工作流引擎的提示词构建逻辑

- 添加相似度检查以判断知识库结果的相关性,确保只有相关结果用于构建提示词
- 改进日志记录,提供关于相似度分数和结果处理的详细信息
- 优化无相关结果时的处理逻辑,直接回答用户问题
This commit is contained in:
eason 2026-01-23 14:36:49 +08:00
parent a73afd7f25
commit a61e710ff1
3 changed files with 39 additions and 16 deletions

Binary file not shown.

View File

@ -745,7 +745,18 @@ class WorkflowEngine:
# 构建提示词
if knowledge_base_results and len(knowledge_base_results) > 0:
# 有知识库结果构建RAG风格的提示词
# 检查知识库结果的相似度,判断是否相关
max_score = 0
for result in knowledge_base_results:
score = result.get('normalized_score', result.get('similarity_score', 0))
if score > max_score:
max_score = score
# 如果最高相似度分数很低低于0.5),认为结果不相关
is_relevant = max_score >= 0.5
if is_relevant:
# 有相关的知识库结果构建RAG风格的提示词
context_parts = []
for i, result in enumerate(knowledge_base_results[:5], 1): # 取前5个结果
content = result.get('content', '').strip()
@ -770,7 +781,11 @@ class WorkflowEngine:
- 即使文档没有直接定义也要基于文档中的相关内容进行解释和说明
- 如果文档中提到了相关概念政策法规等请基于这些内容进行回答
- 回答要准确详细有条理尽量引用文档中的具体内容"""
logger.info(f"自动构建RAG提示词包含 {len(knowledge_base_results)} 个知识库结果,用户问题: {user_query}")
logger.info(f"自动构建RAG提示词包含 {len(knowledge_base_results)} 个相关知识库结果(最高相似度: {max_score:.3f}),用户问题: {user_query}")
else:
# 知识库结果不相关,直接回答用户问题
logger.warning(f"知识库结果相似度较低(最高: {max_score:.3f}),认为不相关,将直接回答用户问题")
prompt_template = user_query or "请帮助我处理这个任务。"
elif user_query:
# 没有知识库结果,但有用户查询,构建简单提示词
prompt_template = user_query
@ -1164,9 +1179,17 @@ class WorkflowEngine:
logger.info(f"应用相似度阈值 {similarity_threshold} 后,剩余 {len(filtered_results)} 个结果")
# 如果过滤后结果为空,但原始结果不为空,返回所有结果并添加警告
# 如果过滤后结果为空,但原始结果不为空
if not filtered_results and results:
logger.warning(f"所有搜索结果都被相似度阈值 {similarity_threshold} 过滤,返回前 {min(len(results), top_k)} 个结果")
# 检查最高相似度分数
max_score = max([r.get('score', 0) for r in all_results]) if all_results else 0
# 如果最高分数仍然很低低于阈值的50%),说明结果完全不相关,返回空结果
if max_score < similarity_threshold * 0.5:
logger.warning(f"所有搜索结果相似度都很低(最高: {max_score:.3f}),返回空结果")
filtered_results = []
else:
# 相似度还可以,返回前几个结果并添加警告
logger.warning(f"所有搜索结果都被相似度阈值 {similarity_threshold} 过滤,但最高分数 {max_score:.3f} 尚可,返回前 {min(len(results), top_k)} 个结果")
filtered_results = results[:top_k]
return {