大模型学习·第43天:LangChain文档处理——加载器、分割器与向量存储
·
一、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 存在内存中,适合学习和测试。
今日核心总结
- Document 是统一载体:
page_content+metadata,所有加载器返回此类型 - 加载器统一接口:
load()一次性加载,lazy_load()懒加载适合大文件 - 四种加载器:CSVLoader、JSONLoader(需jq)、TextLoader、PyPDFLoader
- 文档分割器:
RecursiveCharacterTextSplitter,控制chunk_size和chunk_overlap - 向量存储三步走:加载文档 → 分割 → 存入向量库,统一接口:
add_documents/delete/similarity_search
更多推荐
所有评论(0)