共计 1624 个字符,预计需要花费 5 分钟才能阅读完成。
RAG 技术的核心价值
- RAG 通过实时检索外部知识库,突破了大模型静态训练数据的局限性
- 动态注入领域专业知识,显著减少生成内容的幻觉问题
- 无需重新训练模型,就能实现知识快速更新和领域适配
微调 vs RAG 方案对比
| 维度 | 传统微调 | RAG 方案 |
|---|---|---|
| 成本 | 高(需 GPU 资源) | 低(仅需构建检索系统) |
| 效果 | 依赖训练数据质量 | 实时获取最新知识 |
| 迭代速度 | 慢(需重新训练) | 快(更新知识库即可) |
| 领域适应性 | 单一领域 | 多领域灵活切换 |
MCP Skill 三层架构详解
1. 知识预处理层
# PDF 文本提取示例(PyPDF2 库)from PyPDF2 import PdfReader
def extract_pdf_text(file_path):
"""
参数说明:file_path: PDF 文件路径
返回: 清理后的纯文本(移除页眉页脚等噪声)"""text =""
with open(file_path, 'rb') as f:
reader = PdfReader(f)
for page in reader.pages:
# 添加段落分隔符保持原文结构
text += page.extract_text() + '\n\n'
return text.strip()
# HTML 解析示例(BeautifulSoup)from bs4 import BeautifulSoup
def clean_html(html_content):
"""
处理要点:1. 移除 <script>/<style> 标签
2. 保留标题层级结构
3. 合并连续空白字符
"""soup = BeautifulSoup(html_content,'html.parser')
for tag in soup(['script', 'style']):
tag.decompose()
return ' '.join(soup.stripped_strings)
2. 向量检索层
| 检索工具 | 召回率 @10 | 延迟 (ms) | 适用场景 |
|---|---|---|---|
| FAISS | 92% | 15 | 千万级向量快速检索 |
| ES | 88% | 50 | 需要复杂过滤条件 |
# FAISS 索引构建示例
import faiss
import numpy as np
dim = 768 # bert-base 向量维度
index = faiss.IndexFlatIP(dim) # 内积相似度
# 建议调参方向:# nprobe=32 平衡召回率和速度
# 当数据量 >1M 时改用 IndexIVFFlat
3. 生成优化层
# RAG Prompt 模板示例
template = """ 基于以下上下文回答问题:{context}
问题:{question}
要求:1. 如果上下文不包含答案,明确回复 "不知道"
2. 引用上下文中的具体段落
3. 使用中文回答,保持专业但易懂
"""
实战 Colab Notebook
点击访问完整示例 包含:

- 中文文本分块算法(考虑句号 / 问号等标点边界)
- 基于 LlamaIndex 的 RAG 管道实现
- 异常处理逻辑(网络超时 / 空检索结果等)
生产环境注意事项
增量更新策略
- 每日全量重建索引 vs 实时增量更新
- 推荐方案:
- 使用 FAISS 的 add_with_ids 接口
- 设置版本化索引(v1/v2 热切换)
敏感信息过滤
import re
# 匹配身份证 / 手机号等
sensitive_pattern = re.compile(r'\b(1[3-9]\d{9}|\d{17}[0-9Xx])\b')
def sanitize_text(text):
return sensitive_pattern.sub('[REDACTED]', text)
缓存击穿防护
- 布隆过滤器预处理请求
- 两级缓存策略(内存 +Redis)
- 对相同问题签名做请求合并
进阶思考题
- 相关性评估:是否可以设计可解释的评分函数?
- TB 级优化:分布式索引如何设计分片策略?
- 多轮对话:如何避免重复检索相同内容?
实践心得
在实际部署医疗问答系统时,RAG 方案使准确率从 58% 提升到 89%。关键收获是:
– 文本分块大小对召回影响极大(最终采用 256 字符重叠分块)
– 简单 prompt 约束比复杂规则更有效
– 监控检索失败率比监控响应时间更重要
建议从小的垂直领域开始验证,逐步扩展知识库复杂度。
正文完
