LangChain 构建向量数据库和检索器实战
随着大语言模型(LLM)在各类 AI 应用中不断普及,RAG(Retrieval-Augmented Generation,检索增强生成)逐渐成为提升回答准确率与上下文关联性的重要技术路径。
一、什么是向量数据库?
在自然语言处理中,文本、图片、音频等非结构化数据需要转化为模型可理解的形式才能参与运算。向量化(Embedding)是把原始数据转化为定长高维向量的过程,用于计算相似度。比如,“猫” 和 “宠物” 的向量距离很近,而与 “飞机” 的距离较远。
向量数据库就是用于存储这类高维向量,并支持基于相似度的快速检索。常见的向量库包括:
- FAISS(Facebook 开源)
- Milvus(Zilliz 开源)
- Weaviate(支持 GraphQL)
- Chroma(轻量级本地数据库)
LangChain 默认支持这些库的适配封装,其中 Chroma 是最适合快速上手与本地调试的。
二、LangChain 是什么?
LangChain 是一个用来构建基于语言模型应用的 Python 框架,它提供了统一接口、模块封装、链式组合能力,方便开发者快速构建 LLM+Embedding+Retrieval 的复杂工作流。
LangChain 的重要模块包括:
- LLM:大语言模型接口(如 OpenAI、ChatGLM、Tongyi)
- Embeddings:文本向量化模型
- VectorStore:向量数据库封装(Chroma、FAISS 等)
- Retriever:检索器组件
- Chains:链式调用(支持流水线组合)
三、构建一个简单的向量检索系统
1. 环境准备
pip install langchain langchain-community chromadb
确保你还安装了对应的 Embedding 模型(如通义 DashScope)和 LLM(如 Tongyi、OpenAI)。
本文使用的是阿里的通义千问模型
2. 加载依赖
import os
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.llms import Tongyi
from langchain_community.vectorstores import Chroma
from langchain_core.documents import Document
3. 初始化模型和数据
# 设置 API Key
os.environ["DASHSCOPE_API_KEY"] = "your-api-key"
# 初始化 LLM 和 Embedding
llm = Tongyi()
embedding = DashScopeEmbeddings(model="text-embedding-v1")
# 构造原始文档
documents = [
Document(page_content="猫是非常独立的动物。", metadata={"source": "动物百科"}),
Document(page_content="狗是忠诚的伙伴,经常陪伴人类。", metadata={"source": "动物百科"})
]
4. 构建向量数据库
vector_store = Chroma.from_documents(documents, embedding=embedding)
这一步会自动把文本转换成向量,并存入内存中的 Chroma 数据库。
5. 相似度检索
result = vector_store.similarity_search_with_score("宠物", k=1)
for doc, score in result:
print(f"内容:{doc.page_content},相似度得分:{score}")
输出:
6. 封装为 Retriever(检索器)组件
from langchain_core.runnables import RunnableLambda
retriever = RunnableLambda(vector_store.similarity_search_with_score).bind(k=1)
# 批量查询
print(retriever.batch(["猫", "忠诚的动物"]))
四、与 RAG 构建结合
当你有了检索器,就可以把它和 LLM 结合成 RetrievalQA 或 ConversationalRetrievalChain:
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=vector_store.as_retriever())
response = qa_chain.invoke("猫有哪些特点?")
print(response)
这段代码背后自动做了:
- 语义检索最相关文档
- 把文档与问题一起发给 LLM
- 生成最终回答
五、持久化与加载
1. 向量库保存
vector_store = Chroma.from_documents(documents, embedding=embedding, persist_directory="./chroma_db")
vector_store.persist()
2. 向量库读取
vector_store = Chroma(persist_directory="./chroma_db", embedding_function=embedding)
六、非文本数据的处理
如果你需要处理图像、音频、视频等非文本数据,常见做法包括:
- 图像 → OCR提取文字 或 图像caption生成
- 音频 → ASR语音识别成文本
- 视频 → 拆帧+图像识别 + 语音转写
一旦你将这些内容提取为结构化文本或描述,就可以用上述向量化 → 存储 → 检索 → 生成 的流程处理。
七、结语
LangChain + 向量数据库是一种非常高效的知识管理与智能问答解决方案。通过向量化原始信息、构建数据库、结合大模型检索与生成能力,可以快速实现如“智能客服”、“文档问答”、“知识库”等实战项目。