From 5742170b51c896f7d7c6948fd1800ab4f5903229 Mon Sep 17 00:00:00 2001 From: tanxing Date: Tue, 12 Aug 2025 18:00:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dmain.py=E7=BD=91?= =?UTF-8?q?=E9=A1=B5=E6=9F=A5=E8=AF=A2=E7=BC=BA=E5=A4=B1max=5Fiter?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=20test:=20=E6=9A=82=E6=97=B6?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=89=8D=E7=AB=AF=E6=9C=80=E5=90=8E=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E8=BE=93=E5=87=BA=20chore:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deepsearcher/agent/deep_search.py | 56 +++++++++++------------ deepsearcher/backend/templates/index.html | 51 --------------------- deepsearcher/llm/openai_llm.py | 3 +- deepsearcher/online_query.py | 8 ++-- main.py | 11 +---- 5 files changed, 34 insertions(+), 95 deletions(-) diff --git a/deepsearcher/agent/deep_search.py b/deepsearcher/agent/deep_search.py index e70a4d6..853a7c0 100644 --- a/deepsearcher/agent/deep_search.py +++ b/deepsearcher/agent/deep_search.py @@ -12,8 +12,8 @@ COLLECTION_ROUTE_PROMPT = """ 请你选择可能与问题相关的合集名称,并返回一个字符串列表。 如果没有相关合集,请返回一个空列表。 -"Query": {query} -"COLLECTION_INFO": {collection_info} +"问题": {query} +"合集信息": {collection_info} 使用的语言与问题相同 你需要返回的格式是 a python list of str without any addtional content: @@ -25,18 +25,18 @@ SUB_QUERY_PROMPT = """ 如果原问题本身非常简单,没有必要进行拆分,则保留输出原问题本身 需要保证每个子问题都具体、清晰、不可分(原子性),最终返回一个字符串列表 -Original Question: {original_query} +原问题: {original_query} 示例输入: -"Explain deep learning" +"请解释机器学习" -示例输出: +示例输出(例子中的数量不是要求): [ - "What is deep learning?", - "What is deep learning's purpose?", - "What is the difference between deep learning and machine learning?", - "What is the history of deep learning?" + "什么是机器学习?", + "机器学习的使用目的是什么?", + "机器学习和深度学习的区别是什么?", + "机器学习的历史演进过程?" ] @@ -47,15 +47,16 @@ Original Question: {original_query} RERANK_PROMPT = """ -根据当前的问题和获取到的文档片段,请你对当前获取到的文档是否能帮助回答这个问题给出一个快速判断 -对于每一个文档片段,你只应该返回"YES"或者"NO" +根据当前的问题和获取到的文档片段 +请你对当前获取到的文档是否能帮助回答这个问题(直接或间接,全面或部分,都可以)给出一个快速判断 +对于每一个文档片段,你只应该返回"YES"或者"NO"(需要注意顺序和数量) -Query: {query} +问题: {query} -Retrieved Chunks: +检索到的文档片段: {chunks} -例如,对于4个chunks,返回: ["YES", "NO", "YES", "YES"] +例如,给定4个chunks(实际检索到的文档片段不一定是4个),返回: ["YES", "NO", "YES", "YES"] 使用的语言与问题相同 你需要返回的是 a python list of str without any addtional content: """ @@ -67,11 +68,11 @@ REFLECT_PROMPT = """ 你可以尝试生成相似但些许不同的问题来尝试重新检索,但是也可以根据获得到的文档片段进行批评思考,生成新的问题来保证原问题的回答的准确和全面 如果没有真的必要继续研究(取决于你的判断),返回一个空列表 -Original Query: {original_query} +原问题: {original_query} -Previous Sub Queries: {all_sub_queries} +子问题: {all_sub_queries} -Related Chunks: +检索到的文档片段: {chunks} 使用的语言与原问题相同 @@ -91,23 +92,20 @@ SUMMARY_PROMPT = """ 文内引用示例(使用markdown和html的混合语法,格式必须和例子一致): -"XGBoost is a powerful ensemble learning method [[2]](#2)" -(必须使用 "[[index]](#index)" 而不是 "[index]",注意不要遗漏"(#index)") +"XGBoost是非常强大的集成学习模型[[2]](#2)" +(必须使用 "[[index]](#index)" 而不是 "[index]",注意不要遗漏"(#index)",这里的index是chunk对应的reference的id) -文末参考资料列表 (超链接必须和href属性一致,不允许简化): -前文输入: -... -参考输出: +文末引用示例 (需要href与前文参考中的一致,不需要对每个chunk分配一个引用,而是每一个referecen共用一个引用):
\n" + "".join( + formated = f"\n" + "".join( [ - f"\n{chunk}\n\n" + f"\n{chunk}\n\n" for j, chunk in enumerate(references[reference]) ] ) + "\n" diff --git a/deepsearcher/backend/templates/index.html b/deepsearcher/backend/templates/index.html index 902801f..6c9d3e2 100644 --- a/deepsearcher/backend/templates/index.html +++ b/deepsearcher/backend/templates/index.html @@ -192,29 +192,6 @@ line-height: 1.6; } - /* 进度日志样式 */ - .progress-log { - background-color: #1e1e1e; - color: #d4d4d4; - border-radius: 6px; - padding: 16px; - font-family: 'Courier New', monospace; - font-size: 14px; - margin: 16px 0; - max-height: 300px; - overflow-y: auto; - display: none; - } - - .progress-log.visible { - display: block; - } - - .progress-log-entry { - margin: 4px 0; - line-height: 1.4; - } - footer { text-align: center; margin-top: 30px; @@ -291,9 +268,6 @@
- -
-

查询结果:

@@ -346,25 +320,6 @@ resultElement.classList.remove('visible'); } - // 工具函数:显示进度日志 - function showProgressLog(messages) { - const logElement = document.getElementById('progressLog'); - if (messages && messages.length > 0) { - logElement.innerHTML = messages.map(msg => - `
${escapeHtml(msg)}
` - ).join(''); - logElement.classList.add('visible'); - } else { - logElement.classList.remove('visible'); - } - } - - // 工具函数:隐藏进度日志 - function hideProgressLog() { - const logElement = document.getElementById('progressLog'); - logElement.classList.remove('visible'); - } - // 工具函数:转义HTML特殊字符 function escapeHtml(text) { const map = { @@ -405,7 +360,6 @@ setButtonLoading(button, true); showStatus('loadStatus', '正在加载文件...', 'loading'); hideResult(); - hideProgressLog(); try { const response = await fetch('/load-files/', { @@ -451,7 +405,6 @@ setButtonLoading(button, true); showStatus('webLoadStatus', '正在加载网站内容...', 'loading'); hideResult(); - hideProgressLog(); try { const response = await fetch('/load-website/', { @@ -499,7 +452,6 @@ setButtonLoading(button, true); showStatus('queryStatus', '正在处理查询...', 'loading'); hideResult(); - hideProgressLog(); try { const response = await fetch(`/query/?original_query=${encodeURIComponent(queryText)}&max_iter=${maxIter}`, { @@ -515,9 +467,6 @@ showStatus('queryStatus', '查询完成', 'success'); document.getElementById('resultText').textContent = data.result; showResult(); - - // 显示进度日志 - showProgressLog(data.progress_messages); } else { showStatus('queryStatus', `查询失败: ${data.detail}`, 'error'); } diff --git a/deepsearcher/llm/openai_llm.py b/deepsearcher/llm/openai_llm.py index bbd3998..02a21c9 100644 --- a/deepsearcher/llm/openai_llm.py +++ b/deepsearcher/llm/openai_llm.py @@ -50,6 +50,7 @@ class OpenAILLM(BaseLLM): stream=True, temperature=0.6 ) as stream: + # stream仅做测试,不需要发送到前端 content = "" reasoning_content = "" for chunk in stream: @@ -63,5 +64,5 @@ class OpenAILLM(BaseLLM): if hasattr(delta, 'content') and delta.content is not None: print(delta.content, end="", flush=True) content += delta.content - print("\n") + print("\n") return content diff --git a/deepsearcher/online_query.py b/deepsearcher/online_query.py index 77ed6e6..096124a 100644 --- a/deepsearcher/online_query.py +++ b/deepsearcher/online_query.py @@ -3,7 +3,7 @@ from deepsearcher import configuration from deepsearcher.vector_db.base import RetrievalResult -def query(original_query: str) -> tuple[str, list[RetrievalResult]]: +def query(original_query: str, max_iter: int | None = None) -> tuple[str, list[RetrievalResult]]: """ Query the knowledge base with a question and get an answer. @@ -20,10 +20,10 @@ def query(original_query: str) -> tuple[str, list[RetrievalResult]]: - A list of retrieval results that were used to generate the answer """ default_searcher = configuration.default_searcher - return default_searcher.query(original_query) + return default_searcher.query(original_query, max_iter=max_iter) -def retrieve(original_query: str) -> tuple[list[RetrievalResult], list[str]]: +def retrieve(original_query: str, max_iter: int | None = None) -> tuple[list[RetrievalResult], list[str]]: """ Retrieve relevant information from the knowledge base without generating an answer. @@ -40,5 +40,5 @@ def retrieve(original_query: str) -> tuple[list[RetrievalResult], list[str]]: - A list of strings representing consumed tokens """ default_searcher = configuration.default_searcher - retrieved_results, metadata = default_searcher.retrieve(original_query) + retrieved_results, metadata = default_searcher.retrieve(original_query, max_iter=max_iter) return retrieved_results diff --git a/main.py b/main.py index d0ea344..77eafdc 100644 --- a/main.py +++ b/main.py @@ -203,19 +203,10 @@ def perform_query( HTTPException: If the query fails. """ try: - # 清除之前的进度消息 - from deepsearcher.utils.log import clear_progress_messages - clear_progress_messages() - result_text, _ = query(original_query, max_iter) - # 获取进度消息 - from deepsearcher.utils.log import get_progress_messages - progress_messages = get_progress_messages() - return { - "result": result_text, - "progress_messages": progress_messages + "result": result_text } except Exception as e: raise HTTPException(status_code=500, detail=str(e))