J'Blog

6 课 · RAG

语义检索

基于 Chroma 向量库,与 Workspace 知识库分离。用自然语言描述你想查的内容。 非管理员每人每天可检索 5 次(消耗站点 AI 配额)。

LangChain 知识库构建

原文:知识库教程

一句话

LangChain 提供了 embedding 和 vector store 抽象,用于构建基于语义搜索的检索增强生成(RAG)系统。

什么时候翻这页

当你需要构建一个能够从文档中检索相关信息并用于 LLM 推理的应用程序时,特别是实现检索增强生成(RAG)功能时。

核心概念

  • Document: 表示文本单元及其关联元数据的抽象,包含 page_content(内容)、metadata(元数据)和可选的 id(标识符)
  • Embeddings: 将文本转换为数值向量的模型,用于语义搜索
  • Vector stores: 存储和搜索文本嵌入的特殊数据结构,支持高效的相似性搜索
  • Retrievers: 可运行的组件,用于从数据源检索文档,支持同步和异步操作

怎么做

  1. 安装必要的包,如 pypdf 用于读取 PDF 文件
  2. 配置 LangSmith 以跟踪和调试应用程序
  3. 创建 Document 对象表示你的文本数据
  4. 选择并配置嵌入模型(如 OpenAI、Azure、Google Gemini 等)
  5. 选择并配置向量存储(如 Chroma、Milvus、Pinecone 等)
  6. 使用文本分割器(如 RecursiveCharacterTextSplitter)将文档分割成适当大小的块
  7. 将文档块添加到向量存储中
  8. 使用检索器查询向量存储,获取与查询相似的文档

命令 / 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 结合以生成响应。

初学者易错点

  1. 忽略文档分割的重要性:直接使用整个页面作为检索单元可能导致上下文过于宽泛
  2. 不设置适当的 chunk_overlap:这可能导致相关信息被分割到不同的块中
  3. 忽略元数据的重要性:元数据对于跟踪文档来源和位置非常关键
  4. 选择不合适的嵌入模型:不同模型可能对特定类型的数据表现更好
  5. 不考虑向量存储的扩展性:对于大型数据集,需要选择可扩展的存储解决方案

相关词条

官方原文:https://docs.langchain.com/oss/python/langchain/knowledge-base