RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合了信息检索和生成模型的技术,能够显著提升生成内容的准确性和相关性。通过使用向量数据库(如 Chroma),可以高效地存储和检索文档嵌入(embeddings),从而实现 RAG 的核心功能。
上篇文章介绍了什么是向量数据库chroma。这篇文章主要介绍如何利用 Chroma实现 RAG 检索增强生成。
1. 环境准备
安装依赖
首先,确保安装了必要的库:
pip install chromadb sentence-transformers transformers torch
Chroma:用于存储和检索向量数据。
sentence-transformers:用于生成文本嵌入。
transformers 和 torch:用于加载生成模型(如 GPT 或 T5)。
2. 数据准备
假设我们有一个小型的知识库(例如一组问答对),需要将其嵌入并存储到 Chroma 中。
# 示例知识库
knowledge_base = [
{"id": "1", "text": "Python 是一种高级编程语言,广泛用于数据分析和机器学习。"},
{"id": "2", "text": "深度学习是机器学习的一个分支,常用于图像识别和自然语言处理。"},
{"id": "3", "text": "Chroma 是一个轻量级的向量数据库,适合存储和检索高维向量。"},
{"id": "4", "text": "RAG 结合了检索和生成技术,用于提升生成内容的相关性。"}
]
3. 文本嵌入与存储
(1)生成嵌入
使用 sentence-transformers 将文本转换为向量表示。
from sentence_transformers import SentenceTransformer
# 加载预训练的嵌入模型
embedding_model = SentenceTransformer("all-MiniLM-L6-v2")
# 生成嵌入
embeddings = embedding_model.encode([item["text"] for item in knowledge_base])
(2)存储到 Chroma
将嵌入、元数据和原始文本存储到 Chroma 数据库中。
import chromadb
# 创建 Chroma 客户端
client = chromadb.Client()
# 创建集合
collection = client.create_collection(name="rag_knowledge_base")
# 添加数据
collection.add(
ids=[item["id"] for item in knowledge_base], # 唯一 ID
embeddings=embeddings.tolist(), # 嵌入向量
metadatas=[{"text": item["text"]} for item in knowledge_base], # 元数据
)
4. 检索相关信息
当用户提出一个问题时,我们需要从 Chroma 中检索与问题最相关的文档片段。
(1)生成查询嵌入
# 用户问题
query = "什么是 RAG?"
# 生成查询嵌入
query_embedding = embedding_model.encode(query)
(2)执行相似性搜索
# 检索最相关的文档
results = collection.query(
query_embeddings=[query_embedding.tolist()], # 查询向量
n_results=2 # 返回最相似的 2 个结果
)
# 提取检索结果
retrieved_texts = [item["text"] for item in results["metadatas"][0]]
print("检索到的相关文档:", retrieved_texts)
5. 生成增强内容
将检索到的相关文档作为上下文输入到生成模型中,生成最终的回答。
(1)加载生成模型
使用 Hugging Face 的 transformers 加载一个生成模型(如 GPT 或 T5)。
from transformers import pipeline
# 加载生成模型
generator = pipeline("text-generation", model="gpt2")
(2)构造输入提示
将检索到的文档拼接成上下文,并与用户问题一起构造输入提示。
# 构造输入提示
context = " ".join(retrieved_texts)
prompt = f"根据以下背景信息回答问题:\n{context}\n\n问题:{query}\n回答:"
(3)生成回答
# 生成回答
response = generator(prompt, max_length=100, num_return_sequences=1)
print("生成的回答:", response[0]["generated_text"])
6. 完整代码示例
以下是完整的代码整合:
import chromadb
from sentence_transformers import SentenceTransformer
from transformers import pipeline
# 示例知识库
knowledge_base = [
{"id": "1", "text": "Python 是一种高级编程语言,广泛用于数据分析和机器学习。"},
{"id": "2", "text": "深度学习是机器学习的一个分支,常用于图像识别和自然语言处理。"},
{"id": "3", "text": "Chroma 是一个轻量级的向量数据库,适合存储和检索高维向量。"},
{"id": "4", "text": "RAG 结合了检索和生成技术,用于提升生成内容的相关性。"}
]
# 初始化 Chroma 客户端
client = chromadb.Client()
collection = client.create_collection(name="rag_knowledge_base")
# 加载嵌入模型
embedding_model = SentenceTransformer("all-MiniLM-L6-v2")
# 生成嵌入并存储到 Chroma
embeddings = embedding_model.encode([item["text"] for item in knowledge_base])
collection.add(
ids=[item["id"] for item in knowledge_base],
embeddings=embeddings.tolist(),
metadatas=[{"text": item["text"]} for item in knowledge_base],
)
# 用户问题
query = "什么是 RAG?"
# 生成查询嵌入
query_embedding = embedding_model.encode(query)
# 检索相关文档
results = collection.query(
query_embeddings=[query_embedding.tolist()],
n_results=2
)
retrieved_texts = [item["text"] for item in results["metadatas"][0]]
# 加载生成模型
generator = pipeline("text-generation", model="gpt2")
# 构造输入提示
context = " ".join(retrieved_texts)
prompt = f"根据以下背景信息回答问题:\n{context}\n\n问题:{query}\n回答:"
# 生成回答
response = generator(prompt, max_length=100, num_return_sequences=1)
print("生成的回答:", response[0]["generated_text"])
7. 输出示例
假设用户的问题是“什么是 RAG?”,程序可能会输出类似以下的回答:
生成的回答: RAG 是一种结合了检索和生成技术的方法。它通过从知识库中检索相关信息,并将这些信息作为上下文输入到生成模型中,从而生成更准确和相关的内容。这种方法广泛应用于问答系统和对话系统中。
8. 关键点总结
9. 扩展与优化
(1)支持多模态数据
如果知识库包含图像或视频,可以使用多模态嵌入模型(如 CLIP)生成嵌入。
(2)优化检索性能
使用更高效的 ANN 算法(如 HNSW 或 IVF)加速向量检索。
对大规模数据集进行分片存储。
(3)提升生成质量
使用更大、更先进的生成模型(如 GPT-3、GPT-4 或 T5)。
引入强化学习微调(RLHF)提升生成内容的质量。
通过以上方法,你可以轻松实现基于 Chroma 的 RAG 检索增强生成系统,并将其应用于问答系统、对话系统等场景。