|
|
@ -38,9 +38,10 @@ SUB_QUERY_PROMPT = """ |
|
|
|
示例输出(例子中的数量不是要求): |
|
|
|
[ |
|
|
|
"什么是机器学习?", |
|
|
|
"机器学习的使用目的是什么?", |
|
|
|
"机器学习和深度学习的区别是什么?", |
|
|
|
"机器学习的历史演进过程?" |
|
|
|
"机器学习的使用目的", |
|
|
|
"机器学习的常用算法", |
|
|
|
"机器学习的历史演进过程", |
|
|
|
"机器学习和深度学习的区别是什么?" |
|
|
|
] |
|
|
|
|
|
|
|
</EXAMPLE> |
|
|
@ -51,16 +52,16 @@ SUB_QUERY_PROMPT = """ |
|
|
|
|
|
|
|
|
|
|
|
RERANK_PROMPT = """ |
|
|
|
根据当前的问题和获取到的文档片段(文档片段包裹都在<reference></reference>和<chunk></chunk>标签中并有对应的id) |
|
|
|
请你对当前获取到的文档是否能帮助回答这个问题(直接或间接、全面或部分,都可以)给出一个快速判断 |
|
|
|
对于每一个文档片段,你只应该返回"YES"或者"NO"(需要注意顺序和数量) |
|
|
|
根据当前的问题和获取到的文档片段(文档片段包裹都在<reference></reference>和<chunk></chunk>标签中并有对应的连续的id) |
|
|
|
请你对当前获取到的文档片段是否能帮助回答这个问题(直接或间接、全面或部分,都可以,但需要有实际有效内容)给出一个快速判断 |
|
|
|
对于每一个文档片段,你只应该返回"True"或者"False"(需要注意顺序和数量) |
|
|
|
|
|
|
|
问题: {query} |
|
|
|
|
|
|
|
检索到的文档片段: |
|
|
|
{chunks} |
|
|
|
|
|
|
|
例如,假如给出4个chunks(实际检索到的文档片段不一定是这么多),返回4个"YES"或者"NO"(注意这只是一个示例,不代表实际判断): ["YES", "NO", "YES", "YES"] |
|
|
|
例如,假如给出4个chunks(实际检索到的文档片段不一定是这么多),返回4个"True"或者"False"(注意这只是一个示例,不代表实际判断): ["True", "False", "True", "True"] |
|
|
|
使用的语言与问题相同 |
|
|
|
你需要返回的是 a python list of str without any addtional content: |
|
|
|
""" |
|
|
@ -68,7 +69,7 @@ RERANK_PROMPT = """ |
|
|
|
|
|
|
|
REFLECT_PROMPT = """ |
|
|
|
根据原问题和子问题,以及获取到的文档片段,请你决定是否要生成更多的问题,这些问题将被用于后续的思考和搜索。 |
|
|
|
你应该根据已经获得到的文档片段进行批评思考,生成其他新的问题来保证原问题的回答的准确和全面。 |
|
|
|
你应该根据已经获得到的文档片段进行批评思考,生成其他新的问题来保证原问题的回答的准确和全面,请你使用自顶向下和自底向上两种方向来思考如何生成新问题。 |
|
|
|
如果已经获得的文档片段没能覆盖所有的子问题,这意味着有关这些问题的文档无法被检索到,你应该根据你自己的知识补充思考。 |
|
|
|
需要保证每个新的问题都具体、清晰、不可分(原子性)并且不可以和之前的问题重复,新的问题中不要包含"请你回答"、"请你总结"、"请你分析"等祈使类型词语 |
|
|
|
如果没有真的必要继续研究(取决于你的判断),返回一个空列表。 |
|
|
@ -86,12 +87,13 @@ REFLECT_PROMPT = """ |
|
|
|
|
|
|
|
|
|
|
|
SUMMARY_PROMPT = """ |
|
|
|
你是一个内容分析专家,请你根据提供的问题和检索到的信息生成详尽的、有逻辑的长文回答。 |
|
|
|
你是一个内容分析专家,请你根据提供的问题和检索到的信息,生成详细、层次分明、尽可能长的回答。 |
|
|
|
如果检索到的信息不足以回答问题,你应该使用你的知识来进行扩展补充。 |
|
|
|
注意,不要一个子问题一个子问题的回答,而是应该仔细分析子问题之间的关系、子问题和原问题之间的关系。 |
|
|
|
同时,你应该根据提供的信息生成文内引用和文末参考资料列表,使用markdown脚注。 |
|
|
|
如果检索到的信息不足以回答问题或者必须添加额外信息才能回答,你应该使用你的知识来进行补充, |
|
|
|
这种情况下,你自己提供的信息需要使用例如"your knowledge here[^0]"引用。 |
|
|
|
如果你自己提供的信息需要使用"your knowledge here[^0]"引用。 |
|
|
|
注意,这里的"[^0]"的序号0是固定的,表示你的知识,文末引用使用"[^0]: AI 生成", |
|
|
|
来自<chunk><reference>的引用序号从[^1]开始,来源需要与前文<reference>中的href一致,不需要对每个<chunk>分配一个引用,而是相同<reference>的<chunk>共用一个引用 |
|
|
|
来自<chunk><reference>的引用序号从[^1]开始,来源需要与前文<reference>中的"href"一致,不需要对每个<chunk>分配一个引用,而是相同<reference>的<chunk>共用一个引用 |
|
|
|
另外,如果回答的内容文内引用需要引用多个<reference>,请添加多个[^index]到句尾。 |
|
|
|
如果多个片段是相同的来源或者一个片段可以回答多个问题,文内引用可以引用多次,但文末只引用一次来源,即文末的引用列表中不能有重复。 |
|
|
|
|
|
|
@ -110,9 +112,10 @@ SUMMARY_PROMPT = """ |
|
|
|
|
|
|
|
错误例子: |
|
|
|
[^0]: AI 生成 |
|
|
|
[^1]: files/docs/machine_learning.md |
|
|
|
[^2]: files/docs/chap_001_003_models.md |
|
|
|
[^1]: files/docs/chap_001_003_models.md |
|
|
|
[^2]: files/docs/machine_learning.md |
|
|
|
[^3]: files/docs/chap_001_003_models.md(错误,这是重复引用) |
|
|
|
[^5]: files/docs/machine_learning.md(错误,也这是重复引用) |
|
|
|
|
|
|
|
</EXAMPLE> |
|
|
|
|
|
|
@ -275,14 +278,14 @@ class DeepSearch(BaseAgent): |
|
|
|
relevance_list = self.llm.literal_eval(content) |
|
|
|
if not isinstance(relevance_list, list): |
|
|
|
raise ValueError("Response is not a list") |
|
|
|
except (ValueError, SyntaxError): |
|
|
|
except Exception as _: |
|
|
|
# Fallback: if parsing fails, treat all chunks as relevant |
|
|
|
log.color_print(f"Warning: Failed to parse relevance response. Treating all chunks as relevant. Response was: {content}") |
|
|
|
relevance_list = ["YES"] * len(retrieved_results) |
|
|
|
relevance_list = ["True"] * len(retrieved_results) |
|
|
|
|
|
|
|
# Ensure we have enough relevance judgments for all chunks |
|
|
|
while len(relevance_list) < len(retrieved_results): |
|
|
|
relevance_list.append("YES") # Default to relevant if no judgment provided |
|
|
|
relevance_list.append("True") # Default to relevant if no judgment provided |
|
|
|
|
|
|
|
# Filter relevant chunks based on LLM response |
|
|
|
accepted_chunk_num = 0 |
|
|
@ -291,9 +294,9 @@ class DeepSearch(BaseAgent): |
|
|
|
# Check if we have a relevance judgment for this chunk |
|
|
|
is_relevant = ( |
|
|
|
i < len(relevance_list) and |
|
|
|
"YES" in relevance_list[i].upper() and |
|
|
|
"NO" not in relevance_list[i].upper()) if i < len(relevance_list |
|
|
|
) else True |
|
|
|
"True" in relevance_list[i] and |
|
|
|
"False" not in relevance_list[i] |
|
|
|
) if i < len(relevance_list) else True |
|
|
|
|
|
|
|
if is_relevant: |
|
|
|
all_retrieved_results.append(retrieved_result) |
|
|
@ -427,12 +430,16 @@ class DeepSearch(BaseAgent): |
|
|
|
chunks = [] |
|
|
|
chunk_count = 0 |
|
|
|
for i, reference in enumerate(references): |
|
|
|
formated = f"<reference id='{i + 1}' href='{reference}'>\n" + "".join( |
|
|
|
formated = "".join( |
|
|
|
[ |
|
|
|
f"<chunk id='{j + 1 + chunk_count}'>\n{chunk}\n</chunk id='{j + 1 + chunk_count}'>\n" |
|
|
|
( |
|
|
|
f"<reference id='{i + 1}' href='{reference}'>" + |
|
|
|
f"<chunk id='{j + 1 + chunk_count}'>\n{chunk}\n</chunk id='{j + 1 + chunk_count}'>" + |
|
|
|
f"</reference id='{i + 1}'>\n" |
|
|
|
) |
|
|
|
for j, chunk in enumerate(references[reference]) |
|
|
|
] |
|
|
|
) + f"</reference id='{i + 1}'>\n" |
|
|
|
) |
|
|
|
print(formated) |
|
|
|
chunks.append(formated) |
|
|
|
chunk_count += len(references[reference]) |
|
|
|