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

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. 环境准备

bash 复制代码
pip install langchain langchain-community chromadb

确保你还安装了对应的 Embedding 模型(如通义 DashScope)和 LLM(如 Tongyi、OpenAI)。

本文使用的是阿里的通义千问模型

2. 加载依赖

python 复制代码
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. 初始化模型和数据

python 复制代码
# 设置 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. 构建向量数据库

python 复制代码
vector_store = Chroma.from_documents(documents, embedding=embedding)

这一步会自动把文本转换成向量,并存入内存中的 Chroma 数据库。

5. 相似度检索

python 复制代码
result = vector_store.similarity_search_with_score("宠物", k=1)

for doc, score in result:
    print(f"内容:{doc.page_content},相似度得分:{score}")

输出:

6. 封装为 Retriever(检索器)组件

python 复制代码
from langchain_core.runnables import RunnableLambda

retriever = RunnableLambda(vector_store.similarity_search_with_score).bind(k=1)

# 批量查询
print(retriever.batch(["猫", "忠诚的动物"]))

四、与 RAG 构建结合

当你有了检索器,就可以把它和 LLM 结合成 RetrievalQA 或 ConversationalRetrievalChain:

python 复制代码
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. 向量库保存

python 复制代码
vector_store = Chroma.from_documents(documents, embedding=embedding, persist_directory="./chroma_db")
vector_store.persist()

2. 向量库读取

python 复制代码
vector_store = Chroma(persist_directory="./chroma_db", embedding_function=embedding)

六、非文本数据的处理

如果你需要处理图像、音频、视频等非文本数据,常见做法包括:

  • 图像 → OCR提取文字 或 图像caption生成
  • 音频 → ASR语音识别成文本
  • 视频 → 拆帧+图像识别 + 语音转写

一旦你将这些内容提取为结构化文本或描述,就可以用上述向量化 → 存储 → 检索 → 生成 的流程处理。

七、结语

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

相关推荐
步步为营DotNet2 小时前
5-2EFCore性能优化
数据库·性能优化·.net
2501_920047033 小时前
Redis-集群
数据库·redis·bootstrap
半夏陌离3 小时前
SQL 拓展指南:不同数据库差异对比(MySQL/Oracle/SQL Server 基础区别)
大数据·数据库·sql·mysql·oracle·数据库架构
旋转的油纸伞3 小时前
SQL表一共有几种写入方式
数据库·sql
半夏陌离3 小时前
SQL 入门指南:排序与分页查询(ORDER BY 多字段排序、LIMIT 分页实战)
java·前端·数据库
isyoungboy3 小时前
SQL高效处理海量GPS轨迹数据:人员gps轨迹数据抽稀实战指南
数据库·sql
敬业小码哥4 小时前
记一次:mysql的json及json数组使用组合使用
数据库·mysql·json
练小杰4 小时前
【Mysql-installer-community-8.0.26.0】Mysql 社区版(8.0.26.0) 在Window 系统的默认安装配置
数据库·sql·mysql·adb·配置文件·mysql安装·关系型数据库
陈陈爱java5 小时前
Spring八股文
开发语言·javascript·数据库
拾忆,想起6 小时前
Redis复制延迟全解析:从毫秒到秒级的优化实战指南
java·开发语言·数据库·redis·后端·缓存·性能优化