2026 LangChain RAG教程:chains模块消失后,管线怎么重写

2026-10-22 约 29 分钟阅读

以langchain.chains导入开头的RAG教程,在1.4.6上必然报ModuleNotFoundError。这里给重写后的管线:三组切分参数的实测块数,加一个hit@4循环,先分清是检索坏了还是生成坏了。

💡 你将学到

以langchain.chains导入开头的RAG教程,在1.4.6上必然报ModuleNotFoundError。这里给重写后的管线:三组切分参数的实测块数,加一个hit@4循环,先分清是检索坏了还是生成坏了。

📜 目录

把任何一篇RAG教程粘进新终端,第一行就挂:ModuleNotFoundError: No module named 'langchain.chains'。这不是教程写错了,而是你装的是langchain==1.4.6,代码却是0.x时代写的——那会儿检索链住在langchain.chains里,这个模块现在没了。所有以from langchain.chains import create_retrieval_chain开头的文章,今天照抄都跑不通。

下面是按今天PyPI上真实存在的版本重写的管线,顺手补上多数教程跳过的部分:切分到底切出了什么(实测数字)、在怪模型之前怎么先给检索打分、旧import究竟藏在哪里。

干净环境里到底装了什么

2026年10月22日在Python 3.11新建虚拟环境实测:langchain 1.4.6、langchain-core 1.6.12、langchain-text-splitters 1.1.3、langchain-openai 1.7.2、langchain-postgres 0.0.19、langchain-classic 1.0.8。langchain要求Python >=3.10,<4.0,3.9环境装不上;文本切分器已经是独立包,装完langchain却没有RecursiveCharacterTextSplitter,就是漏了langchain-text-splitters。

旧import为什么装了classic还是失败

装上langchain-classic之后还得往下走一层。包根langchain_classic.chains只暴露了一个导入垫片,from langchain_classic.chains import create_stuff_documents_chain照样报ImportError。正确路径是langchain_classic.chains.combine_documents与langchain_classic.chains.retrieval。

切分:先量一次再定参数

用5600字符纯文本实测三组参数:1000/200切出7块,平均969字符,最短829;500/50切出13块,平均473,最短只有210;300/30切出21块,平均288。最大块永远不会超过chunk_size,但最小块可能只有目标的一半——切分器优先在段落边界断开,不肯为了填满预算牺牲语义。默认分隔符顺序是空行、换行、空格、硬切。所以文档里一个短小节就会产生一块没信息量的碎片,它嵌入之后是纯噪声,还会挤掉本该进top-k的好块。

比尺寸更值得写的两个参数:add_start_index=True给每块留下源文件字符偏移,引用时能说出「第4180字符」而不是只报文件名;入库前丢掉100字符以下的块,那些基本都是标题或表格残片。

检索链就是四个runnable

不需要chains模块:向量库、格式化函数、prompt、模型。核心形态是{"context": retriever | format_docs, "question": RunnablePassthrough()} | prompt | ChatOpenAI(...) | StrOutputParser()。InMemoryVectorStore在langchain_core里,不依赖外部服务,还带similarity_search_with_score和max_marginal_relevance_search。超过几千个块就换langchain_postgres.PGVector,检索器接口不变。

先给检索打分,再改prompt

很多人调RAG的第一反应是重写system prompt。这等于假设「正确段落已经在上下文里」,而这个假设恰恰该先验证。20道带标注的问题就够:每题配一个只出现在正确块里的短语,跑retriever.invoke看它排第几位,算hit@4和MRR。

换Postgres不动链路

内存库一重启就没了,上线只需换构造器:PGVector(embeddings=..., collection_name="handbook", connection="postgresql+psycopg://...", use_jsonb=True),0.0.19版本提供from_documents、from_texts、add_documents与as_retriever。collection_name要跨部署保持稳定;换嵌入模型时必须同时换collection名,两个嵌入空间混在一个集合里会悄悄毁掉相似度打分。

什么时候不该用这个框架

上面这条管线用LangChain大约40行;用httpx加Postgres客户端自己写大约120行,全部代码自己掌握,不吃版本更新。真正该用LangChain的理由是生态:十几种文档加载器、parent-document与multi-query这类检索器、1.x的agent middleware。如果系统只是「一个索引加一批文档」,这个框架就是你每次升级都要重读release note的依赖。

常见问题

chains模块为什么直接删掉而不是标废弃?

1.x把包重构到runnable和agent上,旧链类整体挪进独立发行包langchain-classic,主包体积小,旧代码也不用把主包钉死在0.x。

块大小从多少开始?

散文1000字符配200重叠,API文档与表格300到500,然后量。同一份5600字符输入,参数不同块数是7到21,这个数字直接决定有多少近似重复块在抢k个槽位。

要不要加重排?

量完再决定。hit@4已经高于0.9而MRR低于0.5,交叉编码器重排是最便宜的修法;hit@4低于0.6,重排救不了根本没召回的段落。

相关文章
2026-10-21
2026独立保险代理AI通话转写:不改CRM也能留下E&O记录
2026-10-19
2026斯德哥尔摩AI工资软件怎么选:集体协议、AGI申报与AI做不了的事
2026-10-22
Docker跑Ollama配GPU:compose写法、环境变量默认值,和悄悄掉回CPU的显存账
2026-10-21
2026波兹南AI开票软件:KSeF期限、23%增值税与两人工作室怎么选
2026-10-20
2026小型产权代理机构的AI产权检索工具:哪些是真自动,哪些只是演示
2026-10-20
2026伯尔尼AI费用管理软件:8.1%增值税、纸质票据与托管会计能用的报表

本站文章由编辑人工撰写,收录的工具均经过实测或公开资料核验。文中链接指向工具官网或 GitHub 仓库,仅作信息参考,不构成付费推广。

💬 评论 (0)

暂无评论,来说两句吧~

登录后评论