LangChain生成Embbeding创建向量数据库后如果只是想验证检索效果,直接使用 similarity_search () 最直观
·
如果只是想验证检索效果,直接使用 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 官方流水线,封装完整检索 + 问答链路
分层说明
as_retriever():把向量存储包装成统一BaseRetriever对象- 内置支持:
search_kwargs={"k":4, "score_threshold":0.7} - 可切换检索模式:相似度 / MMR / 阈值过滤
- 兼容所有 LangChain 组件(历史对话检索、SelfQueryRetriever、上下文压缩等)
- 内置支持:
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 服务 | ✅ 完整问答链路 | 强,可叠加重排序、上下文压缩、对话记忆等 |
实践经验
- 开发调试阶段:先用
similarity_search()确认「召回文档是否正确」 如果召回文档本身就不对,上层 RAG 链条再怎么调 Prompt 都没用; - 上线工程代码:一律使用
as_retriever(),不要直接调用similarity_search; Retriever 抽象层方便后续无缝替换:向量检索 → 混合检索、增加 Rerank、切换检索器。
延伸小知识点
如果你需要拿到相似度分数做调试,similarity_search 对应的带分数版本:
# 返回 (Document, score)
docs_with_score = vector_store.similarity_search_with_score("query", k=4)
而标准 Retriever 默认不返回分数,如需分数需要自定义 Retriever 子类或者开启对应参数。
更多推荐
所有评论(0)