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