随着生成式人工智能技术的快速发展,检索增强生成(Retrieval-Augmented Generation,简称RAG)成为提升生成内容准确性与相关性的关键技术。RAG 结合了向量检索系统与生成模型,能够基于大规模知识库生成更为精准和丰富的回答。其中,Milvus 作为高性能的开源向量数据库,凭借其卓越的向量处理能力,成为构建RAG系统的理想选择。本文将详细介绍如何利用 Milvus 构建一个高效的RAG流程,从环境准备到系统优化,涵盖具体的实现步骤与最佳实践。
检索增强生成(RAG)系统通过将检索系统与生成模型结合,利用外部知识库来提升生成内容的准确性和相关性。具体流程包括:
这种方法能够弥补生成模型在特定知识领域上的不足,使其生成的内容更具准确性和上下文相关性。
Milvus 是一个开源的高性能向量数据库,专门用于存储和检索海量的高维向量数据。其主要特点包括:
Milvus 的高效向量检索能力使其在 RAG 系统中发挥重要作用,能够迅速找到与用户查询最相关的文档片段,从而支持生成模型生成高质量的回答。更多信息可参考 Milvus 官方文档。
在开始构建 RAG 流程之前,需要准备相应的环境和依赖:
pip install pymilvus transformers sentence-transformers langchain openai
import json
from sentence_transformers import SentenceTransformer
# 初始化模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 示例文档
documents = [
"这是第一篇文档的内容。",
"这是第二篇文档的内容。",
# 更多文档
]
# 生成向量
embeddings = model.encode(documents, convert_to_tensor=True)
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection
# 连接Milvus
connections.connect(alias="default", host="127.0.0.1", port="19530")
# 定义schema
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384), # 根据模型调整维度
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=500)
]
schema = CollectionSchema(fields, description="RAG支持文档存储")
# 创建集合
collection = Collection("rag_collection", schema=schema)
collection.insert([
[1, 2, 3], # 文档ID
embeddings.cpu().numpy().tolist(), # 向量
documents # 文本内容
])
index_params = {
"index_type": "IVF_FLAT",
"metric_type": "L2",
"params": {"nlist": 128}
}
collection.create_index("embedding", index_params)
collection.load()
query = "如何使用 Milvus 构建 RAG 流程?"
query_vector = model.encode([query], convert_to_tensor=True).cpu().numpy().tolist()
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = collection.search(
data=query_vector,
anns_field="embedding",
param=search_params,
limit=5,
output_fields=["text"]
)
for result in results[0]:
print(result.entity.get("text"))
将检索到的文档内容与用户查询一同传递给生成模型(如 GPT)以生成最终回答。
context = "\n".join([doc["text"] for doc in results[0]])
prompt = f"问题: {query}\n上下文:\n{context}\n回答:"
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs)
answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(answer)
为了简化流程管理,可以使用框架如 Langflow
或 LangChain
来整合检索与生成步骤。
from langchain.vectorstores import Milvus
from langchain.embeddings import OpenAIEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 创建向量存储
vector_store = Milvus(
embedding_function=embeddings,
collection_name="rag_collection",
connection_args={"host": "localhost", "port": "19530"}
)
# 初始化聊天模型
llm = ChatOpenAI()
# 创建检索链
qa_chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=vector_store.as_retriever()
)
# 执行问答
def rag_query(query, chat_history=[]):
result = qa_chain({"question": query, "chat_history": chat_history})
return result["answer"]
为了提升 RAG 系统的整体性能与用户体验,建议采取以下优化措施:
nlist
和 nprobe
等参数以平衡搜索速度与准确性。在企业内部,构建一个基于Milvus的RAG系统,可以将公司技术文档、内部知识库等内容加载到Milvus中,员工或客户通过提问获得精准且上下文相关的回答,提升工作效率和客户满意度。
结合文本和图像(如产品图片、说明文档),实现更复杂的多模态RAG系统,能够处理和生成更加丰富的信息。例如,用户上传产品图片并提问相关问题,系统可以结合图像和文本信息生成详细回答。示例项目详见 多模态RAG示例。
官方文档:
博客与教程:
通过结合 Milvus 的高性能向量检索能力与生成模型的强大生成能力,您可以构建一个高效、可靠的RAG系统,有效提升问答系统、推荐系统等应用的性能和用户体验。本文详细介绍了从环境准备、数据处理、向量存储到查询与生成的具体步骤,并提供了优化建议与实际应用示例。根据具体需求,您还可以进一步扩展系统功能,如支持多模态数据或集成更多高级特性。建议参考相关资源与教程,深入了解各个环节的实现细节,不断优化和调整,以构建最适合您应用场景的RAG系统。