ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

在 local-deep-research 中接入 LangChain Retriever:把向量库、数据库与自定义检索器变成研究搜索引擎

2026/9/16 19:02:15 拓冰建站 浏览量
在 local-deep-research 中接入 LangChain Retriever:把向量库、数据库与自定义检索器变成研究搜索引擎 在 local-deep-research 中接入 LangChain Retriever把向量库、数据库与自定义检索器变成研究搜索引擎【免费下载链接】local-deep-research~95% on SimpleQA (e.g. Qwen3.6-27B on a 3090). Supports all local and cloud LLMs (llama.cpp, Ollama, Google, ...). 10 search engines - arXiv, PubMed, your private documents. Everything Local Encrypted.项目地址: https://gitcode.com/GitHub_Trending/lo/local-deep-research本指南讲解 Local Deep ResearchLDR的 LangChain Retriever 集成能力任意符合 LangChainBaseRetriever接口的检索器FAISS、Chroma、Vertex AI、PostgreSQL、私有文档库等都可以直接注册为 LDR 的搜索源与内置的 Web 搜索引擎一样参与多轮深度研究。读完本文你将掌握retrievers与search_tool参数的正确用法、注册机制背后的线程安全与命名空间隔离设计以及如何在单检索器、多检索器、混合搜索和自定义检索器四种场景下写出可运行的集成代码。集成原理Retriever 如何成为搜索引擎LDR 之所以能零耦合地接入任意 LangChain 检索器是因为它把检索器适配成了标准搜索源。在源码层面这由两个核心组件完成retriever_registry.py 中的全局RetrieverRegistry负责检索器的注册、按名称解析、注销与元数据管理search_engine_retriever.py 中的RetrieverSearchEngine把BaseRetriever包装成 LDR 标准的搜索引擎将 LangChainDocument统一转换为 LDR 搜索结果格式。工作流程如下调用任一研究函数quick_summary、detailed_research、generate_report时通过retrievers{名字: retriever}传入字典函数内部调用retriever_registry.register_multiple(retrievers, usernameusername)完成注册见 research_functions.py通过search_tool名字指定主搜索源当search_tool指向某个已注册的 retriever 时LDR 会构造RetrieverSearchEngine包装该 retriever后续研究迭代中的每次查询都会调用retriever.invoke(query)同步或aget_relevant_documents(query)异步获取相关文档RetrieverSearchEngine._convert_document_to_result将Document的page_content与metadata映射为 LDR 统一结果结构title、url、snippet、full_content、score等从而与内置搜索引擎无缝对齐见 search_engine_retriever.py。关键点是LDR 不需要了解检索器内部实现向量相似度、图遍历、SQL 查询等一概不管它只依赖 LangChain 标准接口——这正是文档中 Zero Coupling 的底层依据。快速开始一个可运行的 FAISS 示例最小集成只需四步。以下代码直接取自文档 Quick Start 并补全了文档加载逻辑from langchain.vectorstores import FAISS from langchain.embeddings import OpenAIEmbeddings from langchain.schema import Document from local_deep_research.api import quick_summary # 0. 准备你的文档示例企业内部知识 documents [ Document(page_content部署流程先构建镜像再滚动发布……, metadata{title: Deployment Guide, source: deploy.md}), # ... 更多文档 ] # 1. 创建 retriever任意 LangChain retriever 均可 embeddings OpenAIEmbeddings() vectorstore FAISS.from_documents(documents, embeddings) retriever vectorstore.as_retriever() # 2. 传入 LDRsearch_tool 指向它的注册名 result quick_summary( queryWhat are our deployment procedures?, retrievers{company_kb: retriever}, search_toolcompany_kb )注册名字典的 key就是该检索器在 LDR 内的引擎名后续search_tool、日志与引用来源都会使用这个名字。三种实战模式单检索器只查询内部知识库当你只想让研究基于单一私有数据源时retrievers只放一个条目search_tool指向它result quick_summary( queryYour question, retrievers{my_kb: retriever}, search_toolmy_kb # 只使用这个 retriever )多检索器同时注册多个知识源可以一次性注册多个检索器如向量库 图数据库 SQL 数据库研究函数会在一次调用中完成全部注册result detailed_research( queryComplex question, retrievers{ vector_db: vector_retriever, graph_db: graph_retriever, sql_db: sql_retriever }, search_toolvector_db # 主检索器使用默认 langgraph-agent 策略时 # 每个已注册的 retriever 也会作为搜索工具暴露给研究 Agent )注意源码中的行为细节在使用默认langgraph-agent研究策略时注册的每个 retriever 都会被暴露为研究 Agent 可调用的搜索工具search_tool仅指定主搜索源见 research_functions.py。这意味着多注册并不意味着只能被动使用其中一个——Agent 可以根据研究需要主动切换多个内部知识源。混合搜索Retriever 与 Web 搜索结合将内部检索器与外部 Web 引擎如 searxng组合即可实现内部实践与外部业界做法对比这类研究任务result quick_summary( queryCompare internal and external practices, retrievers{internal: internal_retriever}, search_toolsearxng # Web 引擎作为主源langgraph-agent 策略 # 同样可以查询已注册的 internal retriever )选择性使用注册多个但只用一个有时你需要维护一个知识库注册表但每次研究只选择其中一个子集all_retrievers { tech_docs: tech_retriever, legal_docs: legal_retriever, hr_docs: hr_retriever } # 本次查询只用 tech 文档 result quick_summary( queryTechnical question, retrieversall_retrievers, search_tooltech_docs # 选择特定 retriever )支持的 Retriever 类型凡是继承langchain_core.retrievers.BaseRetriever的实现都可以接入包括但不限于类别代表实现向量存储FAISS、Chroma、Pinecone、Weaviate、Qdrant 等云服务Vertex AI、AWS Bedrock、Azure Cognitive Search数据库PostgreSQL、MongoDB、Elasticsearch自定义任何继承BaseRetriever的类仓库中的 custom_llm_retriever_example.py 展示了完整的自定义检索器落地示例用OllamaEmbeddings(modelnomic-embed-text)生成向量、FAISS.from_documents建库再通过自定义检索逻辑返回结果可作为私域知识库集成的参考范本。API 参考参数说明与复杂配置所有研究函数quick_summary、detailed_research、generate_report统一接受两个与检索器相关的参数签名定义见 research_functions.pyretrievers: Optional[Dict[str, BaseRetriever]]检索器字典key 为注册名value 为 LangChainBaseRetriever实例为None时不注册任何检索器仅走内置引擎search_tool: str主搜索源的名称——可以是检索器的注册名也可以是内置引擎名searxng、wikipedia、arxiv等未指定时回退到settings_snapshot中的默认搜索设置若仍无法创建对应引擎则使用默认引擎。复杂配置示例Vertex AI云服务检索器往往需要代理与鉴权配置。以下示例展示了复杂配置留在 retriever 层、LDR 侧保持极简的用法from langchain.vectorstores import VertexAIVectorSearch from langchain.embeddings import VertexAIEmbeddings import os # 代理/鉴权由用户侧处理 os.environ[HTTP_PROXY] http://proxy.company.com:8080 # 创建带复杂配置的 retriever embeddings VertexAIEmbeddings( projectmy-project, locationus-central1 ) vectorstore VertexAIVectorSearch( projectmy-project, locationus-central1, indexmy-index, endpointmy-endpoint, embeddingsembeddings ) retriever vectorstore.as_retriever() # LDR 侧无需感知任何复杂度 result quick_summary( queryInternal knowledge query, retrievers{vertex_ai: retriever}, search_toolvertex_ai )底层机制注册表、命名空间与出口策略要写出健壮的集成代码需要理解RetrieverRegistry的几条设计约束依据 retriever_registry.py线程安全注册表内部使用Lock保护所有读写操作多线程并发注册/查询不会出现数据竞争命名空间隔离注册表按username分命名空间存储register未传username时落入共享命名空间历史单命名空间行为读取时先查自己的命名空间、再查共享命名空间因此一个用户既不能遮蔽也不能窥探其他用户注册的检索器is_local标记注册时可指定is_local默认True用于标识该检索器读取的是本地/私有数据用户向量库、知识库而非公共互联网。该标记会进入元数据供安全出口egress策略的evaluate_retriever在PUBLIC_ONLY/PRIVATE_ONLY/BOTH等作用域下决策是否允许该检索器运行。使用云服务检索器时务必显式传is_localFalse否则默认的True会把它错误分类为私有源批量注册时可用{name: {retriever: ..., is_local: bool}}的字典形状为不同检索器分别标注原子批量注册register_multiple采用先校验、后写入的两段式实现任一条目为None都会抛出ValueError且不会留下部分注册状态确定性列举list_registered返回自己命名空间的条目在前、共享条目在后的确定顺序便于 UI/CLI 稳定展示。注册后的检索器可通过unregister注销、clear清空传username只清该用户命名空间、is_registered判断是否可解析get_metadata则返回策略相关的分类元数据。用自定义 Retriever 验证你的集成在接入真实数据源之前可以用一个内存版TestRetriever快速验证 LDR 侧的调用链是否通畅无需任何外部依赖from langchain.schema import Document, BaseRetriever class TestRetriever(BaseRetriever): def get_relevant_documents(self, query: str): return [Document(page_contentfTest doc about {query})] async def aget_relevant_documents(self, query: str): return self.get_relevant_documents(query) # 测试它 result quick_summary( querytest, retrievers{test: TestRetriever()}, search_tooltest )运行后观察返回结果的来源字段即可确认检索器是否被正确包装与调用。注意RetrieverSearchEngine对异常的处理任一查询抛错都会被捕获并记录脱敏日志_scrub_error返回空结果而非中断整个研究流程这保证了单个检索器的故障不会拖垮多引擎研究任务。集成收益总结零耦合LDR 只依赖 LangChainBaseRetriever标准接口无需了解向量库、图数据库或自定义实现的内部逻辑全功能兼容注册的检索器可参与所有 LDR 特性——研究策略如默认的langgraph-agent策略可将每个注册检索器暴露为 Agent 工具、Agentic 引擎选择、多轮迭代、引用与来源追踪干净 API一次研究调用只需传一个retrievers字典加一个search_tool名称灵活组合内部检索器与 Web 搜索可以在同一研究中无缝混用实现内外对比式研究。进阶参考注册与解析的完整实现retriever_registry.py检索器到 LDR 搜索结果的适配器search_engine_retriever.pyquick_summary/detailed_research/generate_report的retrievers参数处理research_functions.py完整的自定义 LLM 自定义 Retriever 实战示例custom_llm_retriever_example.py其他 LangChain 相关集成说明CUSTOM_LLM_INTEGRATION.md【免费下载链接】local-deep-research~95% on SimpleQA (e.g. Qwen3.6-27B on a 3090). Supports all local and cloud LLMs (llama.cpp, Ollama, Google, ...). 10 search engines - arXiv, PubMed, your private documents. Everything Local Encrypted.项目地址: https://gitcode.com/GitHub_Trending/lo/local-deep-research创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考