RAG(Retrieval-Augmented Generation)技术将信息检索与文本生成相结合,据2023年Gartner报告显示,采用RAG的企业问答系统准确率平均提升47%,同时降低幻觉风险达60%。
RAG通过三阶段解决上述问题:
RAG系统如同"AI研究员":
模块 | 功能 | 典型实现方案 |
---|---|---|
文本嵌入 | 将文本转换为向量 | BERT/OpenAI embeddings |
向量检索 | 高效相似度搜索 | FAISS/Chroma/Pinecone |
提示工程 | 构造生成上下文 | LangChain/LLamaIndex |
生成优化 | 控制输出质量 | Temperature tuning |
后处理 | 答案验证与过滤 | Self-checking机制 |
维度 | 纯LLM方案 | RAG方案 | 混合方案 |
---|---|---|---|
知识更新成本 | 需全模型微调 | 仅更新文档库 | 部分微调+文档更新 |
事实准确性 | 中等(依赖训练数据) | 高(可追溯来源) | 高 |
响应速度 | 快(单次生成) | 中等(检索+生成) | 慢(多阶段处理) |
硬件需求 | 高(大模型推理) | 中等 | 极高 |
# 基础环境
pip install langchain==0.1.0 openai faiss-cpu sentence-transformers
from langchain.document_loaders import DirectoryLoader
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
# 1. 加载文档
loader = DirectoryLoader('./docs/', glob="**/*.pdf")
documents = loader.load()
# 2. 构建向量库
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
db = FAISS.from_documents(documents, embeddings)
# 3. 检索增强生成
query = "RAG技术的核心优势是什么?"
docs = db.similarity_search(query, k=3)
context = "\n".join([d.page_content for d in docs])
prompt = f"""基于以下上下文回答问题:
{context}
问题:{query}
答案:"""
# 混合关键词与向量检索
from langchain.retrievers import BM25Retriever, EnsembleRetriever
bm25_retriever = BM25Retriever.from_documents(documents)
vector_retriever = db.as_retriever()
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.4, 0.6]
)
输入问题:"如何降低RAG系统的响应延迟?"
检索到文档:
1. 《向量数据库优化指南》- 建议使用量化技术...
2. 《LLM推理加速白皮书》- 模型蒸馏方法...
生成答案:
"可通过以下方法降低延迟:
1. 使用向量量化技术减少检索时间(来源1)
2. 采用小型化语言模型(来源2)..."
方案 | 准确率 | 平均响应时间 | 幻觉率 |
---|---|---|---|
GPT-4 | 68% | 1.2s | 19% |
RAG+GPT-3.5 | 82% | 2.7s | 6% |
混合方案 | 85% | 3.5s | 4% |
# 按文档重要性分级存储
critical_db = FAISS.from_documents(important_docs, embeddings)
normal_db = FAISS.from_documents(regular_docs, embeddings)
# 根据检索置信度调整生成自由度
confidence = compute_retrieval_confidence(query, docs)
temperature = 0.3 if confidence > 0.8 else 0.7
# 生成后验证
answer = llm.generate(prompt)
if not validate_with_retrieved_docs(answer, docs):
answer = "根据现有资料无法确定答案"
# 错误:返回过多文档导致上下文超长
docs = db.similarity_search(query, k=10) # 应控制在3-5篇
现象:检索结果不相关
解决:确保嵌入模型与任务领域匹配(如医疗文本用BioBERT)
plot_embeddings(docs, query_embedding) # 显示向量空间分布
工具类型 | 代表产品 |
---|---|
向量数据库 | Pinecone/Weaviate |
LLM框架 | LangChain/LLamaIndex |
评估工具 | RAGAS/TruLens |
部署平台 | FastAPI/Docker |
挑战任务:
尝试构建支持多轮对话的RAG系统,实现上下文相关的连续问答。欢迎在评论区分享你的架构设计!
建议开发环境配置:
conda create -n rag python=3.10
conda activate rag
pip install -r requirements.txt