基于 LangChain + Chroma 实现文档向量化入库(含摘要处理 + RAG 查询):完整实战流程
本文介绍如何将 PDF 和 TXT 文档通过摘要提取与向量化处理后存入向量数据库 Chroma,并实现 RAG(Retrieval-Augmented Generation)问答功能,适用于私有知识库、行业报告系统等场景。
一、 背景介绍
在构建 AI 应用(如智能问答、知识检索)时,第一步往往是将原始文档转化为向量形式并存入数据库。这通常包含以下流程:
-
加载原始文件(PDF、TXT 等格式)
-
文本切分(控制 chunk 大小以适配模型)
-
使用大模型提取摘要(减少冗余)
-
向量化(生成 embedding 向量)
-
存入向量数据库(如 Chroma)
本文将使用 LangChain 框架 + 阿里通义大模型 + Chroma 数据库,完成从原始文档到知识入库再到语义检索的完整闭环。
二、 技术选型
工具 | 作用 |
---|---|
LangChain | 文档加载、文本切分、链式处理调用 |
ChromaDB | 本地/远程向量数据库,支持相似度搜索 |
DashScope | 通义千问 Embedding 与摘要模型支持 |
PyMuPDF | 高效解析 PDF 文档内容 |
tqdm | 控制台进度条显示,便于查看批处理状态 |
三、 什么是向量数据库?
在 AI 应用中,大模型会将文本编码成向量(embedding),以便进行语义层面的匹配与搜索。此时,传统数据库已无法满足需求,我们通常会使用向量数据库来做底层支撑。
向量数据库的优势包括:
-
✅ 适配高维嵌入向量(如 OpenAI/通义输出的 768/1536 维向量)
-
✅ 提供基于向量的相似度检索(支持余弦距离、欧氏距离等)
-
✅ 支持批量插入、删除、更新
-
✅ 支持元数据绑定,便于实现过滤、分类检索等高级功能
本项目使用的 Chroma 向量数据库 是一个轻量级、高性能的开源库,具备本地部署优势,非常适合私有化知识库场景。
四、 第一步:连接 Chroma 向量数据库
from chromadb import HttpClient
from langchain_chroma import Chroma
from models import get_dashscope_embedclient = HttpClient(host="localhost", port=8000)
embed = get_dashscope_embed()db = Chroma(collection_name="doc_db", embedding_function=embed, client=client)# 可选:清空已有数据
ids = db.get(include=[])["ids"]
if ids:db.delete(ids=ids)
五、加载 PDF 并进行摘要处理
loader = PyMuPDFLoader("计算机行业深度报告:AI搜索,大模型商业落地“第一束光”.pdf")
docs = loader.load()splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
chunks = splitter.split_documents(docs)prompt = ChatPromptTemplate.from_messages([("system", "你是一个文本摘要机器人,只输出适合入库的知识摘要:\n\n文章:{passage}\n\n摘要:")
])
chain = prompt | get_tongyi_llm() | StrOutputParser()final_docs = []
for doc in tqdm(chunks):metadata = {"author": "Tom","file_name": "计算机行业深度报告:AI搜索,大模型商业落地“第一束光”.pdf","create_datetime": get_current_datetime(),"department": "技术部","origin": doc.page_content}meta = deepcopy(doc.metadata)meta.update(metadata)summary = chain.invoke({"passage": doc.page_content})final_docs.append(Document(page_content=summary, metadata=meta))
六、加载 TXT 文本并生成摘要
with open("寻龙特刊.text", encoding="utf8") as f:texts = [t.strip() for t in f.read().split("###") if t.strip()]for text in tqdm(texts):metadata = {"author": "李四","file_name": "寻龙特刊.text","create_datetime": get_current_datetime(),"department": "产品部","origin": text}summary = chain.invoke({"passage": text})final_docs.append(Document(page_content=summary, metadata=metadata))
七、 批量写入 Chroma 向量数据库
batch_size = 10
num_docs = len(final_docs)for idx in range(math.ceil(num_docs / batch_size)):batch = final_docs[idx * batch_size : (idx + 1) * batch_size]if batch:db.add_documents(batch)
八、 查询测试:RAG 检索问答示例
入库后,我们就可以使用大模型 + 向量数据库实现 RAG 查询(检索增强生成),如下所示:
from langchain.chains import RetrievalQA
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from models import get_tongyi_llm# 构建 RAG 检索链
retriever = db.as_retriever(search_kwargs={"k": 3}) # top-3 相似块
llm = get_tongyi_llm()prompt = ChatPromptTemplate.from_messages([("system", "你是一个行业知识问答助手,请根据以下内容准确回答用户问题:\n\n{context}\n\n问题:{question}\n\n回答:")
])qa_chain = (prompt| llm| StrOutputParser()
)# 查询示例
query = "大模型在 AI 搜索领域有哪些实际应用?"
docs = retriever.get_relevant_documents(query)
context = "\n\n".join([doc.page_content for doc in docs])response = qa_chain.invoke({"context": context,"question": query
})print("💡 回答:", response)
你将看到模型结合真实资料内容给出的精准回答,这就是典型的 RAG 问答流程。
九、总结
本文构建了一个端到端的私有知识入库与查询系统:
-
✅ 多格式文档支持(PDF、TXT)
-
✅ 摘要提取减少冗余,提升嵌入质量
-
✅ 向量化并存入 Chroma 向量数据库
-
✅ 基于检索的问答系统(RAG)可灵活对接各类大模型
这一套流程适用于企业知识管理、内部报告搜索、垂直问答系统等多种场景,是 LLM 应用落地的重要基建环节。