在构建智能问答、知识驱动生成等应用时,我们常常会遇到这样的挑战:如何让机器高效检索海量知识并生成准确回答?RAG(检索增强生成)架构正是解决这一问题的关键。作为专业的向量数据库,Milvus 在 RAG 中扮演着核心角色。今天,咱们就来一步步拆解如何用 Milvus 构建高性能 RAG 管道,并深入探讨优化策略。
RAG 系统的核心逻辑是 “检索 - 生成”:先通过向量数据库找到与问题最相关的知识片段,再由大模型基于这些片段生成回答。Milvus 作为高性能向量存储引擎,负责高效存储和检索向量数据,是 RAG 管道的 “知识库大脑”。
首先安装必要的库:
python
运行
# 安装Milvus客户端、OpenAI工具包及辅助库
!pip install --upgrade pymilvus openai requests tqdm
如果使用 Google Colab,需要重启运行时确保依赖生效。接着配置 OpenAI API 密钥(注意敏感信息需脱敏处理):
python
运行
import os
os.environ["OPENAI_API_KEY"] = "sk-***********" # 替换为你的API密钥
我们以 Milvus 官方文档作为知识源,下载并解析 Markdown 文件:
python
运行
from glob import glob
# 加载所有FAQ文档并按标题分割内容
text_lines = []
for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
with open(file_path, "r") as file:
file_text = file.read()
# 按标题分割文档段落,生成独立知识片段
text_lines += file_text.split("# ")
使用 OpenAI 的文本嵌入模型将文本转换为向量:
python
运行
from openai import OpenAI
openai_client = OpenAI()
def emb_text(text):
"""将输入文本转换为向量嵌入"""
return (
openai_client.embeddings.create(input=text, model="text-embedding-3-small")
.data[0]
.embedding
)
# 测试嵌入生成
test_embedding = emb_text("This is a test")
embedding_dim = len(test_embedding)
print(f"嵌入维度:{embedding_dim},前10维值:{test_embedding[:10]}")
初始化 Milvus 客户端并创建存储向量的集合:
python
运行
from pymilvus import MilvusClient
# 使用Milvus Lite本地存储(大规模数据建议使用服务器版本)
milvus_client = MilvusClient(uri="./milvus_demo.db")
collection_name = "my_rag_collection"
# 删除已存在集合(避免重复)
if milvus_client.has_collection(collection_name):
milvus_client.drop_collection(collection_name)
# 创建集合:指定向量维度、度量类型和一致性级别
milvus_client.create_collection(
collection_name=collection_name,
dimension=embedding_dim,
metric_type="IP", # 内积度量,适合文本相似性检索
consistency_level="Strong" # 强一致性保证数据可见性
)
将预处理好的知识片段生成嵌入并插入集合:
python
运行
from tqdm import tqdm
data = []
for i, line in enumerate(tqdm(text_lines, desc="创建嵌入")):
data.append({
"id": i, # 自定义ID
"vector": emb_text(line), # 文本嵌入
"text": line # 原始文本数据,作为动态字段存储
})
# 批量插入数据
insert_result = milvus_client.insert(
collection_name=collection_name,
data=data
)
print(f"插入成功,插入数量:{insert_result.insert_count}")
定义查询函数,实现从 Milvus 中检索相关知识片段:
python
运行
def retrieve_knowledge(question, top_k=3):
"""根据问题检索相关知识片段"""
# 生成问题嵌入
query_emb = emb_text(question)
# 执行向量搜索
search_res = milvus_client.search(
collection_name=collection_name,
data=[query_emb],
limit=top_k,
search_params={"metric_type": "IP"},
output_fields=["text"] # 返回存储的原始文本字段
)
# 解析结果,提取文本和相似度得分
retrieved = [
(hit.entity["text"], hit.distance)
for hit in search_res[0]
]
return retrieved
将检索结果与大模型结合,生成最终回答:
python
运行
def generate_answer(question):
"""结合检索结果和LLM生成回答"""
# 第一步:检索相关知识
retrieved = retrieve_knowledge(question)
context = "\n".join([line[0] for line in retrieved])
# 第二步:构建提示词
SYSTEM_PROMPT = "你是一个知识助手,需根据提供的上下文回答问题。"
USER_PROMPT = f"""
{context}
{question}
"""
# 第三步:调用OpenAI生成回答
response = openai_client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": USER_PROMPT}
]
)
return response.choices[0].message.content
在实际应用中,基础 RAG 管道往往面临 “检索不准”“生成模糊” 等问题。别担心,我们可以通过一系列针对性优化,让 RAG 系统的性能实现质的飞跃。下面从四个关键环节展开,看看如何让你的 RAG 管道更聪明、更高效。
当用户提问与知识库表述存在语义偏差时,直接检索可能会 “答非所问”。这时候,我们需要先 “翻译” 问题,让机器更好地理解真实意图。
传统向量检索依赖 “问题 - 文档” 直接匹配,但用户问题与文档表述可能存在跨域差异(比如口语化 vs 专业化)。HyDE 技术巧妙解决了这个问题:
遇到 “Milvus 和 Zilliz Cloud 有什么区别” 这类复杂问题时,直接检索可能找不到完整答案。我们可以:
当用户问题过于宽泛(如 “怎么优化 Milvus 性能?”),我们需要引导检索更聚焦:
在预处理阶段,我们可以主动为每个文档块生成 “假设性问题”,构建 “问题 - 文档” 的双向索引,解决传统检索中 “用户问题→文档” 的单向匹配局限:
如果把知识库比作图书馆,索引就是书架上的标签。合理设计索引结构,能让检索效率大幅提升。
当文档被拆分为过小的段落(如一句话一个块),检索结果可能零散无序。我们可以:
面对百万级以上文档,单层索引可能力不从心。分层索引分两步走:
单一向量检索可能漏掉关键词匹配的结果,我们可以结合多种检索方式:
检索器是 RAG 的 “眼睛”,优化它能直接提升 “找对知识” 的能力。
如果知识库包含时间、类别等元数据,别忘了善用它们:
"create_time > 2023-01-01 AND category = '技术文档'"
,将搜索范围缩小到近一年的技术类文档。基础 RAG 中,每个文档块可能只有 200 字,导致上下文不足。我们可以:
即使检索准确,生成环节若处理不当,仍可能输出 “幻觉” 答案。这三步能提升生成质量:
当检索结果包含大量无关信息时:
研究发现,LLM 对提示中的首尾内容更敏感。我们可以:
如果首次生成的答案可信度低(如包含 “可能”“不确定” 等词),可以:
除了单点优化,我们还可以在整体流程上做文章:
不是所有问题都需要走完整 RAG 流程:
当新增文档时,避免全量重建索引:
通过 Milvus 构建 RAG 管道,我们实现了从 “数据存储” 到 “智能生成” 的全流程优化。从基础的向量检索到高级的性能调优,每个环节都需要根据业务需求精细设计。随着 RAG 应用的普及,如何在检索效率与生成质量间找到平衡,将成为持续优化的核心课题。
如果你在搭建过程中遇到问题,欢迎在评论区交流!觉得本文有用的话,别忘了点赞收藏,后续我们会带来更多 Milvus 实战技巧和 RAG 优化策略~