LangChain 知识库构建
原文:知识库教程
一句话
LangChain 提供了 embedding 和 vector store 抽象,用于构建基于语义搜索的检索增强生成(RAG)系统。
什么时候翻这页
当你需要构建一个能够从文档中检索相关信息并用于 LLM 推理的应用程序时,特别是实现检索增强生成(RAG)功能时。
核心概念
- Document: 表示文本单元及其关联元数据的抽象,包含 page_content(内容)、metadata(元数据)和可选的 id(标识符)
- Embeddings: 将文本转换为数值向量的模型,用于语义搜索
- Vector stores: 存储和搜索文本嵌入的特殊数据结构,支持高效的相似性搜索
- Retrievers: 可运行的组件,用于从数据源检索文档,支持同步和异步操作
怎么做
- 安装必要的包,如
pypdf用于读取 PDF 文件 - 配置 LangSmith 以跟踪和调试应用程序
- 创建 Document 对象表示你的文本数据
- 选择并配置嵌入模型(如 OpenAI、Azure、Google Gemini 等)
- 选择并配置向量存储(如 Chroma、Milvus、Pinecone 等)
- 使用文本分割器(如 RecursiveCharacterTextSplitter)将文档分割成适当大小的块
- 将文档块添加到向量存储中
- 使用检索器查询向量存储,获取与查询相似的文档
命令 / API 速查
安装
pip install pypdf
创建 Document
from langchain_core.documents import Document
document = Document(
page_content="文本内容",
metadata={"source": "文档来源"}
)
配置嵌入模型
# OpenAI
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
# Chroma 向量存储
from langchain_chroma import Chroma
vector_store = Chroma(
collection_name="example_collection",
embedding_function=embeddings,
persist_directory="./chroma_langchain_db"
)
文本分割
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200, add_start_index=True
)
splits = text_splitter.split_documents(documents)
添加文档到向量存储
ids = vector_store.add_documents(documents=splits)
查询向量存储
# 相似性搜索
results = vector_store.similarity_search("查询文本")
# 带分数的相似性搜索
results = vector_store.similarity_search_with_score("查询文本")
# 使用向量查询
embedding = embeddings.embed_query("查询文本")
results = vector_store.similarity_search_by_vector(embedding)
# 创建检索器
retriever = vector_store.as_retriever(
search_type="similarity",
search_kwargs={"k": 1}
)
与 LangGraph / RAG 手册的联系
本手册介绍了 LangChain 中用于构建 RAG 系统的基础组件,特别是数据检索部分。在 LangGraph 中,这些组件可以作为节点使用,构建更复杂的 agent 流程。RAG 手册则更专注于如何将检索到的上下文与 LLM 结合以生成响应。
初学者易错点
- 忽略文档分割的重要性:直接使用整个页面作为检索单元可能导致上下文过于宽泛
- 不设置适当的 chunk_overlap:这可能导致相关信息被分割到不同的块中
- 忽略元数据的重要性:元数据对于跟踪文档来源和位置非常关键
- 选择不合适的嵌入模型:不同模型可能对特定类型的数据表现更好
- 不考虑向量存储的扩展性:对于大型数据集,需要选择可扩展的存储解决方案