
大语言模型的三大痛点
在落地大模型应用时,我们常遇到三个棘手问题。首先是幻觉,模型基于概率生成 Token,并不真正理解语义,容易一本正经地胡说八道。比如问它'太阳为什么从西边升起',它可能会编造地球自转改变的理由。
其次是时效性。训练成本高、周期长,导致模型无法掌握最新知识。如果训练数据截止到 2023 年,面对 2026 年的春节日期,它可能无法给出正确答案。
最后是数据安全。通用模型缺乏企业私有数据,直接输入敏感信息存在泄露风险。通常做法是将数据留在本地处理,仅让在线模型做归纳。
from transformers import pipeline
generator = pipeline('text-generation', model='gpt2')
result = generator("太阳为什么从西边升起?", max_length=100, num_return_sequences=1)
print(result[0]['generated_text'])
RAG 技术:检索增强生成
RAG(Retrieval-Augmented Generation)的核心思路是:LLM 在回答问题前,先从外部文档库检索相关信息,再基于这些资料生成回答。这就像学生考试时可以查阅课本,而不是仅凭记忆瞎蒙。
核心架构
RAG 包含两个关键模块:检索器和生成器。
检索器负责从知识库中找出最相关的 k 个文档。构建高质量检索器需解决语义表示、空间对齐等问题。生成器则将这些检索到的片段转化为自然流畅的文本。
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
documents = ["Python 学习资源 1...", "Python 学习资源 2..."]
db = FAISS.from_texts(documents, embeddings)
query = "如何学习 Python"
docs = db.similarity_search(query, k=2)
for doc in docs:
print(doc.page_content)
RAG 的八大优势
相比传统微调,RAG 具备显著优势:
- 可扩展性:无需重新训练整个模型,外挂知识库即可提供额外信息。
- 准确性:引用信息来源增强信任,用户可核实答案。
- 可控性:更新知识库比重新训练模型更灵活。
- 可解释性:检索结果可作为预测依据,提升透明度。
- 及时性:能识别并整合最新信息。
- 定制性:为不同领域提供专业知识支持。
- 安全性:敏感数据存储在本地数据库,通过权限控制访问。
- 多功能性:适用于 QA、摘要、对话等多种任务。
例如,在处理企业内部政策查询时,我们可以加载本地知识库,避免将敏感数据直接发送给公共 LLM。
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
embeddings = OpenAIEmbeddings()
db = FAISS.load_local("enterprise_knowledge_base", embeddings)
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())
result = qa_chain.run("公司的请假政策是什么?")
print(result)
RAG 与 SFT 的对比
| 特性 | RAG | SFT |
|---|---|---|
| 数据类型 | 动态数据,持续查询外部源 | 静态数据,易过时 |
| 外部知识利用 | 擅长利用外部资源增强能力 | 依赖预训练或微调数据 |
| 模型定制 | 侧重信息检索,行为定制弱 | 可调整语气、风格及领域知识 |
| 减少幻觉 | 基于检索证据,幻觉较少 | 可能产生幻觉 |
| 透明度 | 高,可追溯数据来源 | 低,黑盒性质 |
RAG 适合需要频繁更新知识的场景,而 SFT 更适合固定领域的风格对齐。
RAG 的典型实现方法
落地 RAG 通常分为三步:数据索引、数据检索、文本生成。
1. 数据索引
将私域数据向量化后存入数据库。包括提取、分割、Embedding 及建索引。
import PyPDF2
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
def extract_text_from_pdf(pdf_path):
text = ""
with open(pdf_path, "rb") as f:
reader = PyPDF2.PdfReader(f)
for page in reader.pages:
text += page.extract_text()
return text
text_splitter = CharacterTextSplitter()
embeddings = OpenAIEmbeddings()
def create_index(pdf_path):
text = extract_text_from_pdf(pdf_path)
texts = text_splitter.split_text(text)
db = FAISS.from_texts(texts, embeddings)
db.save_local("pdf_index")
create_index("example.pdf")
2. 数据检索
获取有效信息的关键,支持元数据过滤、向量相似度检索等。
db = FAISS.load_local("pdf_index", embeddings)
query = "Python 学习教程"
docs = db.similarity_search(query, k=3)
for doc in docs:
print(doc.page_content)
3. 文本生成
将 Query 和检索文本组合输入模型,本质是 Prompt Engineering。
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())
result = qa_chain.run("如何学习 Python?")
print(result)
RAG 的典型案例
ChatPDF允许用户上传 PDF 并通过聊天提问,底层逻辑正是 RAG。Baichuan搜索增强系统融合了指令理解与智能搜索。多模态 RAG则能同时处理图文视频,如 RA-CM3 模型。
RAG 存在的问题
尽管优势明显,RAG 仍面临挑战:
- 检索效果依赖 Embedding:若语义表示不准,检索到无关信息会干扰输出。
- 信息利用黑盒:模型如何利用检索内容仍不透明,可能产生冲突。
- 效率问题:无差别检索所有任务会增加输入长度,降低生成速度。
- 事实查证难:若数据源不可靠,生成的回答也无法精准查证。
RAG 的拓展方案
为了应对上述问题,社区提出了多种拓展方向:
- 多模态 RAG:处理图像、音频等非文本数据。
- 实时 RAG:集成新闻 API 等实时源,确保信息时效性。
- 个性化 RAG:根据用户历史偏好调整检索策略。
例如,在实时场景中,我们可以调用天气或新闻接口,动态更新向量库。
import requests
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
def get_latest_tech_news():
response = requests.get("https://newsapi.org/v2/top-headlines?country=us&category=technology")
news = response.json()
return news['articles'][0]['content'] if news.get('articles') else "No news"
embeddings = OpenAIEmbeddings()
db = FAISS.from_texts([get_latest_tech_news()], embeddings)
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())
result = qa_chain.run("最新的科技新闻是什么?")
print(result)
通过合理设计检索策略与生成流程,RAG 已成为大模型落地的首选方案之一。


