LangChain 构建向量数据库和检索器

发布于:2025-07-06 ⋅ 阅读:(17) ⋅ 点赞:(0)

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)

在这里插入图片描述

这段代码背后自动做了:

  1. 语义检索最相关文档
  2. 把文档与问题一起发给 LLM
  3. 生成最终回答

五、持久化与加载

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 + 向量数据库是一种非常高效的知识管理与智能问答解决方案。通过向量化原始信息、构建数据库、结合大模型检索与生成能力,可以快速实现如“智能客服”、“文档问答”、“知识库”等实战项目。