|
@ -63,7 +63,7 @@ RERANK_PROMPT = """ |
|
|
|
|
|
|
|
|
例如,假如给出4个chunks(实际检索到的文档片段不一定是这么多),返回4个"True"或者"False"(注意这只是一个示例,不代表实际判断): ["True", "False", "True", "True"] |
|
|
例如,假如给出4个chunks(实际检索到的文档片段不一定是这么多),返回4个"True"或者"False"(注意这只是一个示例,不代表实际判断): ["True", "False", "True", "True"] |
|
|
使用的语言与问题相同 |
|
|
使用的语言与问题相同 |
|
|
你需要返回的是 a python list of str without any addtional content: |
|
|
你需要返回的是 a python list of str(bool) without any addtional content: |
|
|
""" |
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -87,35 +87,19 @@ REFLECT_PROMPT = """ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SUMMARY_PROMPT = """ |
|
|
SUMMARY_PROMPT = """ |
|
|
你是一个内容分析专家,请你根据提供的问题和检索到的信息,生成详细、层次分明、尽可能长的回答。 |
|
|
你是一个内容分析专家 |
|
|
|
|
|
请你综合已经提出的问题和检索到的信息,以原问题为中心,生成详细准确、层次分明、尽可能长的回答。 |
|
|
如果检索到的信息不足以回答问题,你应该使用你的知识来进行扩展补充。 |
|
|
如果检索到的信息不足以回答问题,你应该使用你的知识来进行扩展补充。 |
|
|
注意,不要一个子问题一个子问题的回答,而是应该仔细分析子问题之间的关系、子问题和原问题之间的关系。 |
|
|
注意,不要逐个回答问题,而是应该综合所有问题和信息,生成一个完整的回答。 |
|
|
同时,你应该根据提供的信息生成文内引用和文末参考资料列表,使用markdown脚注。 |
|
|
同时,你应该根据提供的信息生成文内引用"[^index]"(markdown文内引用)。 |
|
|
如果你自己提供的信息需要使用"your knowledge here[^0]"引用。 |
|
|
如果你自己提供的信息需要使用"[^0]"引用,即你提供的信息使用固定index=0。 |
|
|
注意,这里的"[^0]"的序号0是固定的,表示你的知识,文末引用使用"[^0]: AI 生成", |
|
|
来自<chunk><reference>的引用序号从[^index]从index=1开始,来源需要与前文<reference>中的"href"一致 |
|
|
来自<chunk><reference>的引用序号从[^1]开始,来源需要与前文<reference>中的"href"一致,不需要对每个<chunk>分配一个引用,而是相同<reference>的<chunk>共用一个引用 |
|
|
不需要对每个<chunk>分配一个引用,而是相同<reference>的<chunk>共用一个引用。 |
|
|
另外,如果回答的内容文内引用需要引用多个<reference>,请添加多个[^index]到句尾。 |
|
|
另外,如果回答的内容文内引用需要引用多个<reference>,请添加多个[^index]到句尾。 |
|
|
如果多个片段是相同的来源或者一个片段可以回答多个问题,文内引用可以引用多次,但文末只引用一次来源,即文末的引用列表中不能有重复。 |
|
|
|
|
|
|
|
|
|
|
|
例子: |
|
|
|
|
|
<EXAMPLE> |
|
|
<EXAMPLE> |
|
|
|
|
|
|
|
|
文内引用示例: |
|
|
"XGBoost是非常强大的集成学习模型。[^1]但是XGBoost的缺点是计算复杂度高,需要大量的计算资源。[^0]" |
|
|
"XGBoost是非常强大的集成学习模型[^2]" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
文末引用示例: |
|
|
|
|
|
正确例子: |
|
|
|
|
|
[^0]: AI 生成 |
|
|
|
|
|
[^1]: files/docs/machine_learning.md |
|
|
|
|
|
[^2]: files/docs/chap_001_003_models.md |
|
|
|
|
|
|
|
|
|
|
|
错误例子: |
|
|
|
|
|
[^0]: AI 生成 |
|
|
|
|
|
[^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> |
|
|
</EXAMPLE> |
|
|
|
|
|
|
|
@ -257,7 +241,7 @@ class DeepSearch(BaseAgent): |
|
|
continue |
|
|
continue |
|
|
|
|
|
|
|
|
# Format all chunks for batch processing |
|
|
# Format all chunks for batch processing |
|
|
chunks = self._format_chunks(retrieved_results) |
|
|
chunks, _ = self._format_chunks(retrieved_results) |
|
|
|
|
|
|
|
|
# Batch process all chunks with a single LLM call |
|
|
# Batch process all chunks with a single LLM call |
|
|
content = self.llm.chat( |
|
|
content = self.llm.chat( |
|
@ -312,7 +296,7 @@ class DeepSearch(BaseAgent): |
|
|
def _generate_more_sub_queries( |
|
|
def _generate_more_sub_queries( |
|
|
self, original_query: str, all_sub_queries: list[str], all_retrieved_results: list[RetrievalResult] |
|
|
self, original_query: str, all_sub_queries: list[str], all_retrieved_results: list[RetrievalResult] |
|
|
) -> list[str]: |
|
|
) -> list[str]: |
|
|
chunks = self._format_chunks(all_retrieved_results) |
|
|
chunks, _ = self._format_chunks(all_retrieved_results) |
|
|
reflect_prompt = REFLECT_PROMPT.format( |
|
|
reflect_prompt = REFLECT_PROMPT.format( |
|
|
original_query=original_query, |
|
|
original_query=original_query, |
|
|
all_sub_queries=all_sub_queries, |
|
|
all_sub_queries=all_sub_queries, |
|
@ -410,7 +394,7 @@ class DeepSearch(BaseAgent): |
|
|
if not all_retrieved_results or len(all_retrieved_results) == 0: |
|
|
if not all_retrieved_results or len(all_retrieved_results) == 0: |
|
|
send_info(f"'{original_query}'没能找到更多信息!") |
|
|
send_info(f"'{original_query}'没能找到更多信息!") |
|
|
return "", [] |
|
|
return "", [] |
|
|
chunks = self._format_chunks(all_retrieved_results) |
|
|
chunks, refs = self._format_chunks(all_retrieved_results) |
|
|
send_info(f"正在总结 {len(all_retrieved_results)} 个查找到的文档片段") |
|
|
send_info(f"正在总结 {len(all_retrieved_results)} 个查找到的文档片段") |
|
|
summary_prompt = SUMMARY_PROMPT.format( |
|
|
summary_prompt = SUMMARY_PROMPT.format( |
|
|
original_query=original_query, |
|
|
original_query=original_query, |
|
@ -418,29 +402,33 @@ class DeepSearch(BaseAgent): |
|
|
chunks=chunks |
|
|
chunks=chunks |
|
|
) |
|
|
) |
|
|
response = self.llm.chat([{"role": "user", "content": summary_prompt}]) |
|
|
response = self.llm.chat([{"role": "user", "content": summary_prompt}]) |
|
|
final_answer = self.llm.remove_think(response) |
|
|
response = self.llm.remove_think(response) + refs |
|
|
send_answer(final_answer) |
|
|
send_answer(response) |
|
|
return self.llm.remove_think(response), all_retrieved_results |
|
|
return response, all_retrieved_results |
|
|
|
|
|
|
|
|
def _format_chunks(self, retrieved_results: list[RetrievalResult]): |
|
|
def _format_chunks(self, retrieved_results: list[RetrievalResult]) -> tuple[str, str]: |
|
|
# 以referecen为key,把chunk放到字典中 |
|
|
# 以referecen为key,把chunk放到字典中 |
|
|
references = defaultdict(list) |
|
|
ref_dict = defaultdict(list) |
|
|
for result in retrieved_results: |
|
|
for result in retrieved_results: |
|
|
references[result.reference].append(result.text) |
|
|
ref_dict[result.reference].append(result.text) |
|
|
chunks = [] |
|
|
formated_chunks = [] |
|
|
|
|
|
formated_refs = ["\n\n[^0]: AI 生成\n"] |
|
|
chunk_count = 0 |
|
|
chunk_count = 0 |
|
|
for i, reference in enumerate(references): |
|
|
for i, reference in enumerate(ref_dict): |
|
|
formated = "".join( |
|
|
formated_chunk = "".join( |
|
|
[ |
|
|
[ |
|
|
( |
|
|
( |
|
|
f"<reference id='{i + 1}' href='{reference}'>" + |
|
|
f"<reference id='{i + 1}' href='{reference}'>" + |
|
|
f"<chunk id='{j + 1 + chunk_count}'>\n{chunk}\n</chunk id='{j + 1 + chunk_count}'>" + |
|
|
f"<chunk id='{j + 1 + chunk_count}'>\n{chunk}\n</chunk id='{j + 1 + chunk_count}'>" + |
|
|
f"</reference id='{i + 1}'>\n" |
|
|
f"</reference id='{i + 1}'>\n" |
|
|
) |
|
|
) |
|
|
for j, chunk in enumerate(references[reference]) |
|
|
for j, chunk in enumerate(ref_dict[reference]) |
|
|
] |
|
|
] |
|
|
) |
|
|
) |
|
|
print(formated) |
|
|
print(formated_chunk) |
|
|
chunks.append(formated) |
|
|
formated_chunks.append(formated_chunk) |
|
|
chunk_count += len(references[reference]) |
|
|
chunk_count += len(ref_dict[reference]) |
|
|
return "".join(chunks) |
|
|
formated_refs.append(f"[^{i + 1}]: " + str(reference) + "\n") |
|
|
|
|
|
formated_chunks = "".join(formated_chunks) |
|
|
|
|
|
formated_refs = "".join(formated_refs) |
|
|
|
|
|
return formated_chunks, formated_refs |
|
|