如果只是想验证检索效果,直接使用 similarity_search () 最直观;如果要构建标准 RAG,通常会使用 vector_store.as_retriever () 配合 create_retrieval_chain ()。
 

两段用法核心区别详解(LangChain)

1. vector_store.similarity_search(query)

定位:底层向量库原始检索接口,仅做相似度召回,只返回文档列表

特点

  • 输入:query 字符串
  • 输出:List[Document]
  • 只执行向量相似度匹配,没有阈值过滤、搜索类型封装、上下文组装、LLM 问答链路
  • 适合:调试、验证检索质量、测试召回效果、观测召回文档

示例代码

# 单纯检索,只看召回文档
docs = vector_store.similarity_search(
    query="你的问题",
    k=4  # 返回top-k
)
for doc in docs:
    print(doc.page_content)

适合调优 embedding、chunk 策略、观察召回是否准确,是排查 RAG 召回问题首选。

2. vector_store.as_retriever() + create_retrieval_chain()

定位:标准 LangChain RAG 官方流水线,封装完整检索 + 问答链路

分层说明

  1. as_retriever():把向量存储包装成统一 BaseRetriever 对象
    • 内置支持:search_kwargs={"k":4, "score_threshold":0.7}
    • 可切换检索模式:相似度 / MMR / 阈值过滤
    • 兼容所有 LangChain 组件(历史对话检索、SelfQueryRetriever、上下文压缩等)
  2. create_retrieval_chain(retriever, combine_docs_chain)
    • 自动流程:query → retriever 召回文档 → 文档拼接进 Prompt → LLM 生成答案
    • 标准工业 RAG 范式,支持流式输出、溯源文档返回

最简标准 RAG 示例

from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain

retriever = vector_store.as_retriever(search_kwargs={"k": 4})
combine_docs_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, combine_docs_chain)

result = rag_chain.invoke({"input": "你的问题"})
# result["answer"] 最终回答
# result["context"] 召回的原始文档

关键对比总结

表格

方式用途能否直接问答扩展性
similarity_search()调试检索、验证召回效果❌ 仅返回文档,无 LLM弱,原始接口,不易接入更多中间组件
as_retriever() + create_retrieval_chain()正式业务 RAG 服务✅ 完整问答链路强,可叠加重排序、上下文压缩、对话记忆等

实践经验

  1. 开发调试阶段:先用 similarity_search() 确认「召回文档是否正确」 如果召回文档本身就不对,上层 RAG 链条再怎么调 Prompt 都没用;
  2. 上线工程代码:一律使用 as_retriever(),不要直接调用 similarity_search; Retriever 抽象层方便后续无缝替换:向量检索 → 混合检索、增加 Rerank、切换检索器。

延伸小知识点

如果你需要拿到相似度分数做调试,similarity_search 对应的带分数版本:

# 返回 (Document, score)
docs_with_score = vector_store.similarity_search_with_score("query", k=4)

而标准 Retriever 默认不返回分数,如需分数需要自定义 Retriever 子类或者开启对应参数。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐