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,19 +745,30 @@ class WorkflowEngine:
# 构建提示词 # 构建提示词
if knowledge_base_results and len(knowledge_base_results) > 0: if knowledge_base_results and len(knowledge_base_results) > 0:
# 有知识库结果构建RAG风格的提示词 # 检查知识库结果的相似度,判断是否相关
context_parts = [] max_score = 0
for i, result in enumerate(knowledge_base_results[:5], 1): # 取前5个结果 for result in knowledge_base_results:
content = result.get('content', '').strip() score = result.get('normalized_score', result.get('similarity_score', 0))
if content: if score > max_score:
# 限制每个结果的长度,避免提示词过长 max_score = score
max_length = 1000
if len(content) > max_length:
content = content[:max_length] + "..."
context_parts.append(f"【参考文档{i}\n{content}\n")
context = "\n\n".join(context_parts) # 如果最高相似度分数很低低于0.5),认为结果不相关
prompt_template = f"""你是一个专业的助手。请仔细阅读以下参考文档,然后回答用户的问题。 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()
if content:
# 限制每个结果的长度,避免提示词过长
max_length = 1000
if len(content) > max_length:
content = content[:max_length] + "..."
context_parts.append(f"【参考文档{i}\n{content}\n")
context = "\n\n".join(context_parts)
prompt_template = f"""你是一个专业的助手。请仔细阅读以下参考文档,然后回答用户的问题。
{context} {context}
@ -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: elif user_query:
# 没有知识库结果,但有用户查询,构建简单提示词 # 没有知识库结果,但有用户查询,构建简单提示词
prompt_template = user_query prompt_template = user_query
@ -1164,10 +1179,18 @@ class WorkflowEngine:
logger.info(f"应用相似度阈值 {similarity_threshold} 后,剩余 {len(filtered_results)} 个结果") logger.info(f"应用相似度阈值 {similarity_threshold} 后,剩余 {len(filtered_results)} 个结果")
# 如果过滤后结果为空,但原始结果不为空,返回所有结果并添加警告 # 如果过滤后结果为空,但原始结果不为空
if not filtered_results and results: if not filtered_results and results:
logger.warning(f"所有搜索结果都被相似度阈值 {similarity_threshold} 过滤,返回前 {min(len(results), top_k)} 个结果") # 检查最高相似度分数
filtered_results = 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 { return {
'success': True, 'success': True,