LangChain:可换零件的管道
这一章讲一件事: 为什么同一套 RAG 代码,换向量库、换检索策略、换 LLM 都只需要改一两行—— 以及换的时候,每个位置上有哪些选项、各自适合什么场景。 原书对这套东西的定位很准:把新更好的零件换进管道,是这个行业的常态,框架要为此而生1。
1. 统一接口:框架存在的理由
LangChain 给三大件各定义了一个抽象类:vector store(向量库)、retriever(检索器)、LLM。 你的检索逻辑只对这些接口编程,底层实现随便换2。
这个抽象的规模值得一观:LangChain 目前集成了 49 种向量库3。第 02 章用的 Chroma 只是其中之一。原书演示了换库的实际改动量:
- 换 FAISS:
Chroma.from_documents(...)改成FAISS.from_documents(...), 删掉 Chroma 特有的 collection 参数,完事。FAISS 是 Facebook 开源的检索库, 支持 GPU 加速(faiss-gpu,需要 NVIDIA 显卡,Apple Silicon 不行),能扛十亿级数据4; - 换 Weaviate: 稍麻烦——它要求先定义 schema(数据结构的正式定义),
还有一堆专属参数;批量(即一次一批地)写入用
client.batch。
metadata 里不能用 id 这个名字(它是内部保留字段——字段即一条数据里的属性格子——要用 doc_id),
重建前要先删掉旧 schema。schema 带来更严格的约束和控制,代价是更多样板代码5。
Chroma 与 Weaviate 的对比就是 spectrum 的两端:前者灵活省事,后者结构化、功能全6。 LangGraph 等框架的更深入拆解不在本书范围,我们的书架里有现成的 (补充(不在书里,依据我们的 frontier 书架):LangChain 的 Runnable/LCEL 接口设计、 自动获得 stream/batch/async 能力的机制,在我们对 LangChain 本体的拆解里有逐行分析。 依据: shelf=ai-frontier-reference/langchain#03-runnable-lcel.md 事实=所有 LLM 实现 Runnable 接口,默认具备 ainvoke/batch/stream 等方法,与原书第 7 节所述一致)。
2. 检索器:真正影响结果的旋钮都在这层
向量库上面的检索器层藏着一组直接决定检索质量的选项,原书一个个演示7:
| 检索器 | 一句话 | 适用 |
|---|---|---|
| dense(默认) | as_retriever(search_kwargs={"k": 10}),取最相似的 10 条 | 大多数场景的起点 |
| score threshold | similarity_score_threshold: 0.5——低于阈值(即划定的分数及格线)的结果直接丢 | 宁缺毋滥的场景 |
| MMR | search_type="mmr"——兼顾相关与多样,主动避免返回十个差不多的结果 | 结果同质化严重时 |
| BM25 sparse | 关键词检索(第 05 章) | 专名、代码、精确匹配 |
| Ensemble | 多路检索加权融合(如 dense 0.5 + sparse 0.5),内置 RRF 排序 | 混合检索 |
| KNNRetriever | 暴力精确检索 | 小数据(见下) |
还有两个挂在美国数据源上的特殊检索器,展示了「检索器」概念的弹性: WikipediaRetriever 直接把维基百科当检索库(作者用它查「加勒比海盗黄金时代」, 返回词条、摘要、来源链接);同类还有 PubMedRetriever(生物医学)、ArxivRetriever(200 万+论文)、 KayAiRetriever(SEC 财报)8。
kNN 的翻案文章
原书在这里写了一段反主流的判断,值得整段记住9: k-NN 的精度至今仍优于一切后继者,包括所有向量厂商主推的 ANN——这不是印刷错误。 那为什么大家都用 ANN?因为 k-NN 不扩展,而厂商的目标客户是企业级规模。 但「企业级」是相对的:一百万条 1536 维向量,听上去很多,在全球企业尺度上其实很小,k-NN 毫无压力。 作者的判据:先用 k-NN,直到等待时间真的不可忍受,再换 ANN。很多中小项目用 ANN,纯属白丢精度。
最后是两个容易被忽略的特殊检索器:time-weighted(给新内容加权,治「老答案霸榜」) 和 Long-Context Reorder(把最相关的材料挪到上下文两头,治第 01 章提过的 lost in the middle)10。
3. LLM:最不该忠诚的位置
LLM 是三大件里最该「货比三家」的位置。原书的经济账11:
- gpt-4o-mini 是 GPT-4 系列里最便宜的,但仍是 gpt-3.5-turbo 的 10 倍价;
- 贵的模型不一定合适:gpt-4-32k 又贵又不如 4o-mini 快和强,只是上下文大 4 倍;
- 结论:别假设最新=最好=最贵,每次新模型发布都值得用评测(第 06 章)重新比一遍。
开源路子:Together AI 一个 API 提供 200+ 开源模型。原书实测把管道里的 gpt-4o-mini 换成 Llama 3 70B(每百万 token $0.88)和 Mixtral MoE(MoE 即混合专家——多个小专家网络分工协作——的架构),同一问题(「Google 有哪些环保举措」) 的回答质量与 GPT-4o-mini 相当甚至更全面,而成本显著更低12。
另外所有 LLM 都实现 Runnable 接口,自动获得 async/stream/batch 能力:
异步(即发出调用后不等结果、先干别的)默认起线程跑同步调用;batch 用多线程或 asyncio.gather 并发,max_concurrency 控制并发上限13。