三年前我第一次将BERT模型接入企业知识库时,需要手动构建复杂的pipeline来处理用户查询、文档检索和答案生成。如今RAG(Retrieval-Augmented Generation)技术让这个过程变得优雅而高效。这种结合信息检索与文本生成的技术范式,正在重塑智能问答、内容创作等领域的生产力工具。
RAG的核心思想很像人类专家的工作方式——当被问到专业问题时,我们先查阅相关资料(检索阶段),然后组织语言回答(生成阶段)。技术实现上,它通过向量数据库快速定位相关知识片段,再由大语言模型生成符合语境的响应。这种架构既规避了传统生成模型"胡言乱语"的风险,又解决了纯检索系统缺乏语言组织能力的痛点。
在AWS EC2 g5.2xlarge实例上,我对比测试了多种开源方案后,最终确定的工具组合:
关键提示:生产环境建议将Milvus部署在独立服务器,我曾因与LLM共享GPU导致OOM崩溃
bash复制conda create -n rag python=3.10
pip install torch==2.0.1 --extra-index-url https://download.pytorch.org/whl/cu117
pip install transformers[rag] sentence-transformers pymilvus
特别注意torch与CUDA版本的匹配问题,这是最常遇到的环境报错。测试GPU是否就绪:
python复制import torch
print(torch.cuda.is_available()) # 必须返回True
处理公司内部PDF手册时,我总结出这套预处理流程:
^Page \d+$)python复制from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
length_function=len
)
documents = splitter.create_documents([raw_text])
为提升检索质量,我采用混合嵌入策略:
Milvus集合创建参数示例:
python复制collection = Collection(
name="tech_docs",
schema=CollectionSchema(
fields=[
FieldSchema("id", DataType.INT64, is_primary=True),
FieldSchema("embedding", DataType.FLOAT_VECTOR, dim=768),
FieldSchema("content", DataType.VARCHAR, max_length=65535)
]
),
consistency_level="Strong"
)
单纯向量搜索在专业术语查询时表现不佳,我的解决方案是组合:
python复制def hybrid_retrieval(query):
# 并行执行两种检索
vector_results = vector_search(query)
keyword_results = keyword_search(query)
# 加权融合(0.7:0.3)
combined = []
for doc in vector_results:
combined.append((doc, 0.7*doc.score))
for doc in keyword_results:
existing = next((x for x in combined if x[0].id == doc.id), None)
if existing:
existing[1] += 0.3*doc.score
else:
combined.append((doc, 0.3*doc.score))
return sorted(combined, key=lambda x: -x[1])[:5]
这个模板经过200+次迭代验证,显著降低幻觉率:
text复制基于以下上下文精确回答问题。如果信息不足,明确回复"根据现有资料无法确定"。
上下文:
{context_str}
问题:{query}
要求:
1. 使用中文回答
2. 不超过3句话
3. 标注引用来源[1][2]
通过Redis实现三级缓存:
python复制import redis
from hashlib import md5
r = redis.Redis(host='localhost')
def get_cache(key):
cache_key = md5(key.encode()).hexdigest()
return r.get(cache_key)
def set_cache(key, value, ttl):
cache_key = md5(key.encode()).hexdigest()
r.setex(cache_key, ttl, value)
在4核vCPU/16GB内存/NVIDIA T4环境下:
实测发现超过50%的延迟来自文本嵌入步骤,建议对高频查询预计算嵌入
某电商平台实施数据:
使用LoRA微调后的特殊版本:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 返回无关内容 | 检索阈值过低 | 调整similarity_threshold > 0.75 |
| 响应包含[UNK] | tokenizer不匹配 | 统一使用模型原配tokenizer |
| 延迟波动大 | GPU显存不足 | 启用gradient_checkpointing |
生产环境必须监控的4个黄金指标:
Prometheus配置示例:
yaml复制- job_name: 'rag_metrics'
metrics_path: '/metrics'
static_configs:
- targets: ['rag-service:8080']
多模态RAG实践表明,结合图像识别能提升30%的问答准确率。我的实验方案:
python复制image_emb = clip_model.encode(image)
text_emb = text_model.encode(text)
combined = np.concatenate([image_emb, text_emb])
这个方案在设备维修手册场景效果显著,能正确回答"图3中红色指示灯代表什么"这类跨模态问题。