向量数据库入门:为 AI 打造长期记忆
传统的数据库(如 MySQL, MongoDB)基于精确的关键字匹配或复杂的 SQL 查询进行数据检索。但当我们面对大语言模型时,我们更需要根据"语义"来搜索内容,这就是向量数据库诞生的意义。
1. 什么是向量数据库?
向量数据库专门用于存储、管理和检索高维向量(Embeddings)。当我们在搜索引擎中搜 "苹果公司的手机",虽然文中可能只写了 "iPhone",但由于它们的语义相近(在向量空间中距离很近),向量数据库就能找到这些相关内容。
- 存储: 既存储原始文本/文档块,也存储它们对应的浮点数向量。
- 索引: 使用特殊的算法(如 HNSW、IVF)对高维数据建立索引,加速搜索。
- 检索: 根据余弦相似度(Cosine Similarity)或欧几里得距离寻找最接近目标向量的结果。
2. 文本到向量的转换 (Embedding)
要将文档存入向量数据库,首先需要将它们转化为 Embedding 向量。目前最常用的是 OpenAI 的 text-embedding-3-small 模型或者是开源宇宙中的
BGE-m3 等。
from langchain.embeddings import OpenAIEmbeddings
# 初始化 Embedding 模型
embeddings = OpenAIEmbeddings()
# 将一段文字转化为向量
text = "人工智能正在改变世界。"
vector = embeddings.embed_query(text)
print(f"生成的向量维度: {len(vector)}") # 通常是 1536 维
3. 实战:使用 Chroma 搭建本地知识库
Chroma 是一个开源的轻量级向量数据库,非常适合本地开发和测试。我们将结合 LangChain 来演示。
pip install chromadb langchain openai
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
# 1. 加载本地文档
loader = TextLoader("my_knowledge.txt")
documents = loader.load()
# 2. 拆分文档 (长文档必须切分成 Chunk 才能获得更好的检索效果)
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(documents)
# 3. 初始化 Embedding 模型
embeddings = OpenAIEmbeddings()
# 4. 创建并持久化向量数据库
db = Chroma.from_documents(docs, embeddings, persist_directory="./chroma_db")
db.persist()
💡 为什么要 Chunk 分块?
如果将一整本书转化为一个向量,其语义会被严重稀释。将长文档切割成一小段一小段的 Chunk,能确保每个 Chunk 的向量精准表达其本身的内容,从而提高检索的召回率。
4. 相似度检索 (Similarity Search)
数据写入后,我们就可以通过自然语言来查询它了:
# 加载现有的数据库
db = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
# 执行相似度检索 (找回最相关的 3 个段落)
query = "公司明年的战略规划是什么?"
results = db.similarity_search(query, k=3)
for doc in results:
print(doc.page_content)
print("---")
5. RAG 系统架构纵览
将上述检索结果作为提示词的上下文喂给 ChatGPT,这就是大名鼎鼎的 RAG (Retrieval-Augmented Generation, 检索增强生成)。
# 简单的 RAG 伪代码
context = "\n".join([doc.page_content for doc in results])
prompt = f"基于以下参考信息回答问题。\n信息:\n{context}\n\n问题:{query}"
response = llm(prompt)
总结
向量数据库为 LLM 提供了外挂的大脑(长期记忆)。精通文档的分块策略 (Chunking)、Embedding 模型的选择,以及多路召回/重排等高级技巧,是打造高质量 RAG 应用的关键。