feat: 增强工作流引擎的提示词构建逻辑
- 添加相似度检查以判断知识库结果的相关性,确保只有相关结果用于构建提示词 - 改进日志记录,提供关于相似度分数和结果处理的详细信息 - 优化无相关结果时的处理逻辑,直接回答用户问题
This commit is contained in:
parent
a73afd7f25
commit
a61e710ff1
Binary file not shown.
Binary file not shown.
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue