一、Document:LangChain 的统一文档载体

所有文档加载器最终返回 Document 对象,包含两个核心属性:

属性说明
page_content文档的文本内容
metadata文档元数据(来源、作者等),字典格式

所有加载器都实现统一接口:load()(一次性加载,返回list)和 lazy_load()(懒加载,返回生成器,适合大文件避免内存溢出)。

二、文档加载器

CSVLoader

from langchain_community.document_loaders import CSVLoader
loader = CSVLoader(
    file_path="./data/stu.csv",
    csv_args={"delimiter": ",", "quotechar": '"'},
    encoding="utf-8"
)
documents = loader.load()

JSONLoader(需 pip install jq):

from langchain_community.document_loaders import JSONLoader
loader = JSONLoader(
    file_path="./data/stu.json",
    jq_schema=".[].name",      # jq语法:取数组中每个对象的name
    text_content=False,
    json_lines=True             # JSONLines格式
)

常用 jq 语法:. 表示根、.name 取name值、.[] 展开数组、.[].name 取数组中每个对象的name。

TextLoader:读取 .txt 文件,整个内容放入一个 Document。

PyPDFLoader(需 pip install pypdf):

from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader(file_path="./data/pdf1.pdf", mode="page")  # page:每页一个Document

三、文档分割器

RecursiveCharacterTextSplitter 是 LangChain 官方推荐的默认分割器,按自然段落分割大文档。

from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,                              # 每段最大字符数
    chunk_overlap=50,                            # 段间重叠字符数
    separators=["\n\n", "\n", ",", "!"],       # 分割依据符号
    length_function=len                          # 字符统计函数
)
split_docs = splitter.split_documents(docs)

参数说明:chunk_size 控制每段大小,chunk_overlap 防止关键信息被切断,separators 按优先级依次尝试分割。

四、向量存储

from langchain_core.vectorstores import InMemoryVectorStore
from langchain_community.embeddings import DashScopeEmbeddings

vector_store = InMemoryVectorStore(embedding=DashScopeEmbeddings())

# 添加文档(自动向量化后存储)
vector_store.add_documents(documents=docs, ids=["id1", "id2", ...])

# 删除
vector_store.delete(["id1", "id2"])

# 相似度检索,返回最相关的k个文档
result = vector_store.similarity_search("查询内容", k=3)

统一接口add_documents(存入向量并分配ID)、delete(按ID删除)、similarity_search(相似度检索)。InMemoryVectorStore 存在内存中,适合学习和测试。

今日核心总结

  1. Document 是统一载体page_content + metadata,所有加载器返回此类型
  2. 加载器统一接口load() 一次性加载,lazy_load() 懒加载适合大文件
  3. 四种加载器:CSVLoader、JSONLoader(需jq)、TextLoader、PyPDFLoader
  4. 文档分割器RecursiveCharacterTextSplitter,控制 chunk_sizechunk_overlap
  5. 向量存储三步走:加载文档 → 分割 → 存入向量库,统一接口:add_documents / delete / similarity_search

更多推荐