[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 模型」再把检索组件化进链。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →