LangChain 向量数据库集成指南:面向 RAG 开发者
引言
向量数据库是构建 RAG(检索增强生成)应用的核心组件。本文将详细介绍主流向量数据库的特点、费用和接入方式。
一、主流向量数据库对比
| 数据库 | 类型 | 是否免费 | 免费额度 | 是否需要 API Key | 官方地址 |
|---|---|---|---|---|---|
| Chroma | 开源本地 | 免费 | 完全免费 | 否 | https://www.trychroma.com |
| FAISS | 开源本地 | 免费 | 完全免费 | 否 | https://faiss.ai |
| Weaviate | 开源/云 | 部分免费 | 免费层限制 | 否(本地)/是(云) | https://weaviate.io |
| Milvus | 开源 | 免费 | 完全免费 | 否 | https://milvus.io |
| Pinecone | 云服务 | 有免费层 | 每月 100K 向量,单项目 | 是 | https://pinecone.io |
| Qdrant | 开源/云 | 部分免费 | 免费层限制 | 否(本地)/是(云) | https://qdrant.tech |
| pgvector | PostgreSQL 扩展 | 免费 | 完全免费 | 否 | https://github.com/pgvector/pgvector |
二、轻量级方案(免费,无需 API Key)
2.1 Chroma(推荐入门)
特点:零配置,轻量级,Python 原生支持,完全免费
安装:
pip install langchain-chroma
代码示例:
python
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
# 使用本地 Ollama 的嵌入模型(免费,无需 API Key)
embeddings = OpenAIEmbeddings(
base_url="http://localhost:11434/v1/",
api_key="ollama",
model="nomic-embed-text"
)
# 创建向量数据库(本地保存到 ./chroma_db 目录)
db = Chroma(
embedding_function=embeddings,
persist_directory="./chroma_db"
)
# 添加文档
db.add_texts(
texts=["RAG 是检索增强生成技术", "向量数据库用于存储文本嵌入"],
metadatas=[{"source": "doc1"}, {"source": "doc2"}]
)
# 相似度搜索
results = db.similarity_search("什么是 RAG?", k=2)
for doc in results:
print(doc.page_content)
2.2 FAISS(Meta 开源)
特点:高性能,纯 Python,完全免费
安装:
pip install faiss-cpu langchain-community
代码示例:
python
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(
base_url="http://localhost:11434/v1/",
api_key="ollama",
model="nomic-embed-text"
)
# 创建 FAISS 索引
texts = ["RAG 技术", "向量检索", "大模型应用"]
db = FAISS.from_texts(texts, embeddings)
# 搜索
results = db.similarity_search("RAG", k=2)
for doc in results:
print(doc.page_content)
# 保存到本地
db.save_local("./faiss_index")
# 从本地加载
db_loaded = FAISS.load_local("./faiss_index", embeddings)
三、企业级方案
3.1 Pinecone(云服务)
费用说明:免费层每月 100K 向量,超出按用量计费
获取 API Key:
- 访问 https://pinecone.io 注册
- 进入控制台创建 API Key
- 复制 API Key
配置环境变量:
setx PINECONE_API_KEY "xxxxxxxxxxxxxxxxxxxxxxxx"
代码示例:
python
import os
from langchain_pinecone import PineconeVectorStore
from langchain_openai import OpenAIEmbeddings
from pinecone import Pinecone, ServerlessSpec
# 初始化 Pinecone 客户端
pc = Pinecone(api_key=os.environ.get("PINECONE_API_KEY"))
# 创建索引(如果不存在)
index_name = "my-rag-index"
if index_name not in pc.list_indexes().names():
pc.create_index(
name=index_name,
dimension=1536, # 匹配嵌入维度
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1")
)
# 创建向量存储
embeddings = OpenAIEmbeddings() # 需要 OPENAI_API_KEY
vector_store = PineconeVectorStore(
index=pc.Index(index_name),
embedding=embeddings,
text_key="text"
)
# 添加文档
vector_store.add_texts(["文档内容1", "文档内容2"])
# 搜索
results = vector_store.similarity_search("查询内容", k=3)
3.2 Weaviate(开源 + 云)
费用说明:本地部署完全免费,云服务有免费层
本地部署(Docker):
bash
docker run -d --name weaviate \
-p 8080:8080 \
semitechnologies/weaviate:latest
代码示例:
python
from langchain_weaviate import WeaviateVectorStore
import weaviate
from langchain_openai import OpenAIEmbeddings
# 连接本地 Weaviate(无需 API Key)
client = weaviate.connect_to_local(port=8080)
embeddings = OpenAIEmbeddings(
base_url="http://localhost:11434/v1/",
api_key="ollama",
model="nomic-embed-text"
)
# 创建向量存储
db = WeaviateVectorStore(
client=client,
index_name="Document",
text_key="content",
embedding=embeddings
)
# 添加文档
db.add_texts(["RAG 技术详解", "向量检索原理"])
# 搜索
results = db.similarity_search("RAG", k=2)
四、完整 RAG 实战示例
python
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# 1. 准备文档(示例数据)
documents = [
"RAG(检索增强生成)是一种结合检索系统和大模型的技术",
"向量数据库用于存储和检索高维向量表示的文本",
"LangChain 是一个用于构建大模型应用的框架",
"Chroma 是一个轻量级向量数据库,完全开源免费",
]
# 2. 初始化嵌入模型(使用本地 Ollama,免费)
embeddings = OpenAIEmbeddings(
base_url="http://localhost:11434/v1/",
api_key="ollama",
model="nomic-embed-text"
)
# 3. 创建向量数据库(本地 Chroma,免费)
db = Chroma.from_texts(
texts=documents,
embedding=embeddings,
persist_directory="./rag_db"
)
# 4. 创建检索器
retriever = db.as_retriever(search_kwargs={"k": 2})
# 5. 定义 RAG 提示词
prompt = ChatPromptTemplate.from_template("""
你是一个专业的 AI 助手。请根据下面提供的上下文回答问题。
如果上下文中没有答案,请说"抱歉,我没有找到相关信息"。
上下文:{context}
问题:{question}
回答:
""")
# 6. 初始化大模型(本地 Ollama,免费)
llm = ChatOpenAI(
base_url="http://localhost:11434/v1/",
api_key="ollama",
model="qwen3.5:4b"
)
# 7. 构建 RAG 链
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 8. 使用 RAG 查询
question = "什么是 RAG?"
answer = rag_chain.invoke(question)
print(f"问题:{question}")
print(f"回答:{answer}")
五、快速选择指南
| 场景 | 推荐方案 | 是否免费 | 复杂度 |
|---|---|---|---|
| 入门学习 / 原型开发 | Chroma | 免费 | 低 |
| 纯本地部署 | FAISS / pgvector | 免费 | 中 |
| 大规模生产 | Milvus | 免费(自托管) | 高 |
| 云原生 / 无服务器 | Pinecone | 有免费层 | 低 |
| 语义搜索 + 知识图谱 | Weaviate | 有免费层 | 中 |
六、常见问题
Q: 为什么需要向量数据库?
A: 向量数据库能高效存储和检索文本嵌入向量,让大模型可以访问外部知识。
Q: Chroma 和 FAISS 哪个更好?
A: Chroma 更简单易用,FAISS 性能更优。入门推荐 Chroma,追求性能选 FAISS。
Q: 如何选择嵌入维度?
A: 取决于使用的嵌入模型,常见维度为 768、1024、1536。
Q: 免费方案能支持多大数据量?
A: Chroma/FAISS 本地可支持数万到数十万条文档,取决于硬盘大小。
LangChain 的向量数据库集成让 RAG 开发变得简单:
- 统一接口:所有数据库使用相似的 API
- 本地免费:Chroma/FAISS 完全免费,无需 API Key
- 灵活扩展:可从本地方案平滑迁移到云服务
- 生态丰富:支持主流的向量数据库
推荐入门路径:先用 Chroma 构建原型,根据需求再考虑升级到 Pinecone 或 Milvus。