[LangChain RAG] 06 文档加载、Chroma 向量库与检索增强问答
一、Document 与文档加载器文档加载器提供一套标准接口用于将不同来源如 CSV、PDF 或 JSON 等的数据读取为 LangChain 的文档格式确保无论数据来源如何都能对其进行一致性处理。1.1 BaseLoader 与 Document文档加载器内置或自行实现需实现BaseLoader接口。Class Document是 LangChain 内文档的统一载体所有文档加载器最终返回此类的实例。核心记录page_content文档内容metadata文档元数据字典一个基础的Document类实例基于如下代码创建from langchain_core.documents import Document document Document( page_contentHello, world!, metadata{source: https://example.com} )1.2 两个统一方法load()一次性加载全部文档lazy_load()延迟流式传输文档对大型数据集很有用避免内存溢出官方文档加载器列表Document loader integrations - Docs by LangChain重点加载器CSVLoader、JSONLoader、PDFLoaderPyPDFLoader、TextLoader。二、CSVLoader2.1 最简用法from langchain_community.document_loaders.csv_loader import CSVLoader loader CSVLoader(file_path./xxx.csv) data loader.load() print(data)2.2 自定义解析loader CSVLoader( file_path./xxx.csv, csv_args{ delimiter: ,, # 指定分隔符 quotechar: , # 指定字符串的引号包裹 # 字段列表无表头使用有表头勿用会读取首行作为数据 fieldnames: [name, age, gender], }, ) data loader.load() print(data)2.3 小结文档加载器均继承于 BaseLoader返回 Documentload一次性批量加载list 内含 Document内容过多可能内存溢出lazy_load得到生成器for 循环依次获取单个 Document适合大文档三、JSONLoader 与 jq3.1 依赖使用 JSONLoader 需要额外安装pip install jq。jq 是跨平台 JSON 解析工具LangChain 底层对 JSON 的解析基于 jq。抽取依赖jq_schema语法。3.2 jq_schema 常见写法示例对象{ name: 周杰轮, age: 11, hobby: [唱, 跳, RAP], other: { addr: 深圳, tel: 12332112321 } }jq_schema含义.整个 JSON 对象根[]数组.name抽取「周杰轮」.hobby抽取爱好数组.hobby[1]或.hobby.[1]抽取「跳」.other.addr抽取地址「深圳」数组[ {name: 周杰轮, age: 11, gender: 男}, {name: 蔡依临, age: 12, gender: 女}, {name: 王力鸿, age: 11, gender: 男} ].[]得到 3 个字典.[].name抽取全部 name即 3 个 name 信息3.3 初始化参数from langchain_community.document_loaders import JSONLoader loader JSONLoader( file_pathxxx.json, # 文件路径 jq_schema., # jq schema 语法 text_contentFalse, # 抽取的是否是字符串默认 True json_linesTrue, # 是否是 JsonLines 文件每一行都是 JSON )四个主要参数file_path必填、jq_schema必填、text_content默认 True、json_lines默认 False。JsonLines 示例每一行都是独立字典{name: 周杰轮, age: 11, gender: 男} {name: 蔡依临, age: 12, gender: 女} {name: 王力鸿, age: 11, gender: 男}四、PyPDFLoaderLangChain 内支持许多 PDF 加载器课件选用PyPDFLoader。依赖 PyPDFpip install pypdf。from langchain_community.document_loaders import PyPDFLoader loader PyPDFLoader( file_path, # 文件路径必填 modepage, # page按页面划分不同 Documentsingle单个 Document passwordpassword, # 文件密码 )五、TextLoader 与文本分割5.1 TextLoader读取文本文件如.txt将全部内容放入一个 Document 对象中。from langchain_community.document_loaders import TextLoader loader TextLoader( xxx.txt, encodingutf-8, ) docs loader.load() print(docs) print(len(docs)) # 结果为 1如果文档很大加载到一个 Document 里并不合适。5.2 RecursiveCharacterTextSplitter递归字符文本分割器按自然段落分割大文档是 LangChain 官方推荐的默认字符分割器。它在保持上下文完整性和控制片段大小之间实现了良好平衡开箱即用效果佳。from langchain_community.document_loaders import TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter loader TextLoader( ../P3_LangChainRAG开发/data/Python基础语法.txt, encodingutf-8, ) docs loader.load() splitter RecursiveCharacterTextSplitter( chunk_size500, # 分段的最大字符数 chunk_overlap50, # 分段之间允许重叠的字符数 # 文本分段依据 separators[\n\n, \n, 。, , , ., !, ?, , ], # 字符统计依据函数 length_functionlen, ) split_docs splitter.split_documents(docs)5.3 小结TextLoader 加载文本文件返回仅有一个 Document 的 listRecursiveCharacterTextSplitter 是官方推荐的默认分割器可指定小文档最大字符数、重叠字符数可手动指定段落划分依据符号以及字符数量统计函数六、Vector Stores 向量存储基于 LangChain 的向量存储存储嵌入数据并执行相似性搜索。这是一个典型的向量存储应用也即是典型的 RAG 流程。6.1 要做的三件事如何文本转向量前文已经学习创建向量存储并完成存入向量、删除向量、向量检索LangChain 为向量存储提供统一接口add_documentsdeletesimilarity_search6.2 内存向量存储from langchain_core.vectorstores import InMemoryVectorStore from langchain_community.embeddings import DashScopeEmbeddings vector_store InMemoryVectorStore(embeddingDashScopeEmbeddings()) # 添加文档到向量存储并指定 id vector_store.add_documents(documents[doc1, doc2], ids[id1, id2]) # 删除文档通过指定的 id 删除 vector_store.delete(ids[id1]) # 相似性搜索 similar_docs vector_store.similarity_search(your query here, 4)6.3 外部 Chroma 向量存储from langchain_community.embeddings import DashScopeEmbeddings from langchain_chroma import Chroma vector_store Chroma( collection_nameexample_collection, embedding_functionDashScopeEmbeddings(), persist_directory./chroma_langchain_db, # 本地持久化目录不需要可去掉 )6.4 小结InMemoryVectorStore内存向量存储Chroma外部数据库向量存储通用 APIadd_documents、delete、similarity_search整体向量存储使用流程即 RAG 流程索引阶段存、查询阶段检索七、检索增强生成把检索接进 Prompt7.1 两条步骤向量存储实例可通过add_texts(list[str])快速添加文本。先通过向量存储检索匹配信息将用户提问和匹配信息一同封装到提示词模板中再提问模型7.2 手动 RAG 示例减肥知识库# 准备一下资料向量库的数据 # add_texts 传入一个 list[str] vector_store.add_texts( [减肥就是要少吃多练, 在减脂期间吃东西很重要,清淡少油控制卡路里摄入并运动起来] ) input_text 怎么减肥 # 检索向量库 result vector_store.similarity_search(input_text, k2) reference_text [ for doc in result: reference_text doc.page_content reference_text ] chain prompt | print_prompt | model | StrOutputParser() res chain.invoke({input: input_text, context: reference_text}) print(res)7.3 下一步让检索加入链这里检索是链外手工完成的。课件提出下一步让向量检索加入链使用 RunnablePassthrough 类。RunnablePassthrough的作用是让用户问题在链中「原样穿过」同时把检索器挂到同一条 LCEL 链上避免先similarity_search再手动拼context。课件以这个问题收束 RAG 开发主线先掌握「检索 Prompt 模型」再把检索组件化进链。

相关新闻

高速列车自动驾驶曲线生成:动态规划在轨交控制中的硬核落地

高速列车自动驾驶曲线生成:动态规划在轨交控制中的硬核落地

简介:本资源是一套面向智能交通与自动控制领域研究者及高校研究生的高速列车自动驾驶曲线生成方案,聚焦于能耗最优与运行时间精准协同优化问题。采用动态规划算法对线路(10km分段建模)、速度(0.2m/s离散化)…

2026/10/31 2:49:11 阅读更多 →
2026GEO生成式引擎优化服务商选型指南|6类主流服务模式对比、适配场景与避坑攻略

2026GEO生成式引擎优化服务商选型指南|6类主流服务模式对比、适配场景与避坑攻略

随着豆包、DeepSeek、文心一言、Kimi和ChatGPT等生成式AI成为企业信息入口,客户获取信息的方式正在变化。企业除了要让网页被传统搜索收录,还要确保品牌、产品、资质和案例能被AI正确理解,并在真实业务问题中获得准确引用。这就是生成式引擎优…

2026/11/2 10:55:00 阅读更多 →
高精度 AI 3D 模型生成与优化工具怎么选?真正应该看这 5 个指标

高精度 AI 3D 模型生成与优化工具怎么选?真正应该看这 5 个指标

如果你正在找一款高精度 AI 3D 模型生成与优化工具,我更建议把判断标准从“生成出来够不够惊艳”,升级到:生成精度够不够高、模型结构能不能继续用、出了问题能不能改、复杂模型能不能拆、最终能不能进入真实生产流程。按照这套标准&#xff…

2026/10/24 3:24:43 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/3 1:09:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/3 10:57:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/3 2:27:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/3 10:47:27 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/3 10:57:33 阅读更多 →

日新闻

周新闻

月新闻