Browse Source

fix: 前端加载本地文件时修改为默认force_rebuild

chore: 调整提示词
chore: 调整向量检索的top_k
main
tanxing 4 days ago
parent
commit
efa63a870a
  1. 49
      deepsearcher/agent/deep_search.py
  2. 4
      deepsearcher/templates/html/index.html
  3. 88
      deepsearcher/templates/index.html
  4. 4
      deepsearcher/vector_db/milvus.py
  5. 6
      main.py

49
deepsearcher/agent/deep_search.py

@ -23,9 +23,11 @@ COLLECTION_ROUTE_PROMPT = """
SUB_QUERY_PROMPT = """
为了能够全面的回答这个问题请你尝试把原本的问题拆分或扩展为几个子问题
不可以太多但是也不可以太少请根据问题复杂程度来决定子问题的数量
请你使用自顶向下和自底向上两种方向来思考如何拆分问题
子问题的数量不可以太多但是也不可以太少应当保证问题的回答全面性请根据问题复杂程度来决定子问题的数量
如果原问题本身非常简单没有必要进行拆分则保留输出原问题本身
需要保证每个子问题都具体清晰不可分原子性最终返回一个字符串列表
需要保证每个子问题都具体清晰不可分原子性即不可以再包含更细分的子问题子问题中不要包含"请你回答""请你总结""请你分析"等祈使类型词语
你需要最终返回一个字符串列表
原问题: {original_query}
@ -49,8 +51,8 @@ SUB_QUERY_PROMPT = """
RERANK_PROMPT = """
根据当前的问题和获取到的文档片段
请你对当前获取到的文档是否能帮助回答这个问题直接或间接全面或部分都可以给出一个快速判断
根据当前的问题和获取到的文档片段文档片段包裹都在<reference></reference><chunk></chunk>标签中并有对应的id
请你对当前获取到的文档是否能帮助回答这个问题直接或间接全面或部分都可以给出一个快速判断
对于每一个文档片段你只应该返回"YES"或者"NO"需要注意顺序和数量
问题: {query}
@ -58,17 +60,18 @@ RERANK_PROMPT = """
检索到的文档片段:
{chunks}
例如给定4个chunks实际检索到的文档片段不一定是4个返回: ["YES", "NO", "YES", "YES"]
例如假如给出4个chunks实际检索到的文档片段不一定是这么多返回4个"YES"或者"NO"注意这只是一个示例不代表实际判断: ["YES", "NO", "YES", "YES"]
使用的语言与问题相同
你需要返回的是 a python list of str without any addtional content:
"""
REFLECT_PROMPT = """
根据原问题和子问题以及获取到的文档片段请你决定是否要生成更多的问题
如果已经获得的文档片段没能覆盖所有的子问题这意味着这些文档无法被检索到
你可以尝试生成相似但些许不同的问题来尝试重新检索但是也可以根据获得到的文档片段进行批评思考生成新的问题来保证原问题的回答的准确和全面
如果没有真的必要继续研究取决于你的判断返回一个空列表
根据原问题和子问题以及获取到的文档片段请你决定是否要生成更多的问题这些问题将被用于后续的思考和搜索
你应该根据已经获得到的文档片段进行批评思考生成其他新的问题来保证原问题的回答的准确和全面
如果已经获得的文档片段没能覆盖所有的子问题这意味着有关这些问题的文档无法被检索到你应该根据你自己的知识补充思考
需要保证每个新的问题都具体清晰不可分原子性并且不可以和之前的问题重复新的问题中不要包含"请你回答""请你总结""请你分析"等祈使类型词语
如果没有真的必要继续研究取决于你的判断返回一个空列表
原问题: {original_query}
@ -83,24 +86,34 @@ REFLECT_PROMPT = """
SUMMARY_PROMPT = """
你是一个内容分析专家请你根据提供的问题和检索到的信息生成详尽的长文回答
如果检索到的信息不足以回答问题或者必须添加额外信息才能能回答你应该使用你的知识来进行补充
这种情况下你自己提供的信息需要使用例如"your knowledge here[^0]"引用注意这里的"[^0]"的序号0是固定的表示你的知识下文当中有文末引用的例子
同时你应该根据提供的信息生成文内引用和文末参考资料列表来自文档切片的reference引用从[^1]开始
如果多个片段是相同的来源或者一个片段可以回答多个问题文内引用可以引用多次但文末只引用一次来源即文末的引用列表中不能有重复的来源
你是一个内容分析专家请你根据提供的问题和检索到的信息生成详尽的有逻辑的长文回答
同时你应该根据提供的信息生成文内引用和文末参考资料列表使用markdown脚注
如果检索到的信息不足以回答问题或者必须添加额外信息才能回答你应该使用你的知识来进行补充
这种情况下你自己提供的信息需要使用例如"your knowledge here[^0]"引用
注意这里的"[^0]"的序号0是固定的表示你的知识文末引用使用"[^0]: AI 生成",
来自<chunk><reference>的引用序号从[^1]开始来源需要与前文<reference>中的href一致不需要对每个<chunk>分配一个引用而是相同<reference><chunk>共用一个引用
另外如果回答的内容文内引用需要引用多个<reference>请添加多个[^index]到句尾
如果多个片段是相同的来源或者一个片段可以回答多个问题文内引用可以引用多次但文末只引用一次来源即文末的引用列表中不能有重复
例子:
<EXAMPLE>
文内引用示例使用markdown脚注:
文内引用示例:
"XGBoost是非常强大的集成学习模型[^2]"
(必须使用 "[^index]"这里的index是对应的<reference>的id)
文末引用示例 (需要与前文reference的href一致不需要对每个chunk分配一个引用而是每一个referecen共用一个引用):
[^0]: AI Generated
文末引用示例:
正确例子
[^0]: AI 生成
[^1]: files/docs/machine_learning.md
[^2]: files/docs/chap_001_003_models.md
错误例子
[^0]: AI 生成
[^1]: files/docs/machine_learning.md
[^2]: files/docs/chap_001_003_models.md
[^3]: files/docs/chap_001_003_models.md错误这是重复引用
</EXAMPLE>
原问题: {original_query}

4
deepsearcher/templates/html/index.html

@ -33,7 +33,7 @@
</div>
<div class="card">
<h2 class="card-title">网站内容加载</h2>
<h2 class="card-title">网站加载</h2>
<div class="form-group">
<label for="websiteUrls">网站URL(多个URL用逗号分隔)</label>
<input type="text" id="websiteUrls" placeholder="例如: https://example.com/page1,https://example.com/page2">
@ -46,7 +46,7 @@
<label for="webCollectionDesc">集合描述(可选)</label>
<textarea id="webCollectionDesc" rows="2" placeholder="例如: 来自网站的内容"></textarea>
</div>
<button id="loadWebsiteBtn">加载网站内容</button>
<button id="loadWebsiteBtn">加载网站</button>
<div id="webLoadStatus" class="status"></div>
</div>

88
deepsearcher/templates/index.html

@ -1,88 +0,0 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DeepSearcher - 智能搜索系统</title>
<link rel="stylesheet" href="static/css/styles.css">
</head>
<body>
<div class="container">
<header>
<h1>DeepSearcher 智能搜索系统</h1>
<p class="app-description">基于大型语言模型和向量数据库的企业知识管理系统,支持私有数据搜索和在线内容整合,提供准确答案和综合报告。</p>
</header>
<main>
<div class="card">
<h2 class="card-title">文件加载</h2>
<div class="form-group">
<label for="filePaths">文件路径(多个路径用逗号分隔)</label>
<input type="text" id="filePaths" placeholder="例如: /path/to/file1.pdf,/path/to/file2.txt">
</div>
<div class="form-group">
<label for="collectionName">集合名称</label>
<input type="text" id="collectionName" placeholder="例如: my_collection">
</div>
<div class="form-group">
<label for="collectionDesc">集合描述</label>
<textarea id="collectionDesc" rows="2" placeholder="例如: 这是一个测试集合"></textarea>
</div>
<button id="loadFilesBtn">加载文件</button>
<div id="loadStatus" class="status"></div>
</div>
<div class="card">
<h2 class="card-title">网站加载</h2>
<div class="form-group">
<label for="websiteUrls">网站URL(多个URL用逗号分隔)</label>
<input type="text" id="websiteUrls" placeholder="例如: https://example.com/page1,https://example.com/page2">
</div>
<div class="form-group">
<label for="webCollectionName">集合名称</label>
<input type="text" id="webCollectionName" placeholder="例如: web_collection">
</div>
<div class="form-group">
<label for="webCollectionDesc">集合描述</label>
<textarea id="webCollectionDesc" rows="2" placeholder="例如: 来自网站的内容"></textarea>
</div>
<button id="loadWebsiteBtn">加载网站</button>
<div id="webLoadStatus" class="status"></div>
</div>
<div class="card">
<h2 class="card-title">智能查询</h2>
<div class="form-group">
<label for="queryText">请输入您的问题</label>
<textarea id="queryText" rows="3" placeholder="例如: 请生成一份关于人工智能发展趋势的报告"></textarea>
</div>
<div class="form-group">
<label for="maxIter">最大迭代次数 (1-10)</label>
<input type="number" id="maxIter" min="1" max="10" value="3">
</div>
<button id="queryBtn">执行查询</button>
<button id="clearMessagesBtn" style="margin-left: 10px; background-color: var(--text-secondary);">清空消息</button>
<div id="queryStatus" class="status"></div>
<div id="queryResult" class="result-container">
<h3>查询结果:</h3>
<div class="query-result" id="resultText"></div>
</div>
<div id="processResult" class="result-container">
<h3>处理过程:</h3>
<div id="messageStream" class="message-stream">
<div class="message-container" id="messageContainer"></div>
</div>
</div>
</div>
</main>
<footer>
<p>DeepSearcher © 2025 | 企业知识管理与智能问答系统</p>
</footer>
</div>
<script src="static/js/app.js"></script>
</body>
</html>

4
deepsearcher/vector_db/milvus.py

@ -152,7 +152,7 @@ class Milvus(BaseVectorDB):
self,
collection: str,
vector: np.ndarray | list[float],
top_k: int = 3,
top_k: int = 4,
query_text: str = None,
*args,
**kwargs,
@ -163,7 +163,7 @@ class Milvus(BaseVectorDB):
Args:
collection (Optional[str]): Collection name. If None, uses default_collection.
vector (Union[np.array, List[float]]): Query vector for similarity search.
top_k (int, optional): Number of results to return. Defaults to 5.
top_k (int, optional): Number of results to return. Defaults to 4.
query_text (Optional[str], optional): Original query text for hybrid search. Defaults to None.
*args: Variable length argument list.
**kwargs: Arbitrary keyword arguments.

6
main.py

@ -112,7 +112,7 @@ def load_files(
examples=[256],
),
force_rebuild: bool = Body(
False,
True,
description="Whether to force rebuild the collection if it already exists.",
examples=[False],
),
@ -141,7 +141,7 @@ def load_files(
batch_size=batch_size if batch_size is not None else 8,
force_rebuild=force_rebuild,
)
return {"message": "Files loaded successfully."}
return {"message": "成功加载文档"}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@ -198,7 +198,7 @@ def load_website(
batch_size=batch_size if batch_size is not None else 8,
force_rebuild=force_rebuild,
)
return {"message": "Website loaded successfully."}
return {"message": "成功加载网址"}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))

Loading…
Cancel
Save