RAG检索增强生成:原理、技术架构与工程实践|大模型落地核心技术
在大模型规模化落地的背景下,事实幻觉、知识时效性不足、私有知识无法复用,已成为制约应用价值的关键瓶颈。检索增强生成(Retrieval-Augmented Generation,RAG)通过引入外部知识库增强模型生成能力,无需微调即可显著提升输出的准确性、可控性与可解释性,是当前企业级AI系统的主流架构。
一、核心原理
RAG的核心逻辑是检索优先,生成在后:先从私有/外部知识库中召回与用户查询语义相关的上下文,再将上下文与问题一同输入大模型,约束模型基于事实生成回答,从机制上抑制幻觉,并实现知识的实时更新与安全可控。
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.llms import Ollama
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from datetime import datetime
import logging
# 初始化组件
embedding_model = HuggingFaceEmbeddings(model_name="BAAI/bge-small-en-v1.5")
llm = Ollama(model="llama3", temperature=0.3) # 降低温度参数减少随机性
# 知识库管理类
class KnowledgeBaseManager:
def __init__(self, db_path="knowledge_db"):
self.db_path = db_path
try:
self.vector_db = FAISS.load_local(db_path, embedding_model)
except:
self.vector_db = FAISS.from_texts([""], embedding_model)
self.vector_db.save_local(db_path)
def retrieve_context(self, query: str, k=3):
return self.vector_db.similarity_search(query, k=k)
def update_knowledge(self, new_docs: list[str]):
new_db = FAISS.from_texts(new_docs, embedding_model)
self.vector_db.merge_from(new_db)
self.vector_db.save_local(self.db_path)
logging.info(f"Knowledge base updated at {datetime.now()}")
# 事实约束提示模板
fact_check_prompt = ChatPromptTemplate.from_template(
"""基于以下已知信息,严格回答用户问题。如果信息不足或不确定,必须回答'根据现有知识无法确定'。
已知上下文:
{context}
用户问题:
{question}
请按照以下规则回答:
1. 只使用提供的上下文信息
2. 禁止编造不存在的事实
3. 保持回答简洁准确"""
)
# 构建RAG流程
kb_manager = KnowledgeBaseManager()
retriever = kb_manager.retrieve_context
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| fact_check_prompt
| llm
| StrOutputParser()
)
# 示例使用
def generate_answer(question: str):
response = rag_chain.invoke(question)
print(f"Q: {question}\nA: {response}\n")
# 测试
generate_answer("我们产品的核心功能是什么?")
kb_manager.update_knowledge(["新产品X支持AI图像识别和实时数据分析"])
generate_answer("产品X有哪些功能?")
二、标准技术流程(工程化五步法)
1. 文档处理与分块
对PDF、HTML、非结构化文本进行清洗、去重与结构化,采用递归分块、语义分块等策略,平衡检索精度与上下文完整性。
以下是一个Python代码示例,用于文档处理与分块,支持多种分块策略(如固定大小、重叠分块、按段落分块等):
固定大小分块
from typing import List
def fixed_size_chunk(text: str, chunk_size: int, overlap: int = 0) -> List[str]:
chunks = []
start = 0
while start < len(text):
end = min(start + chunk_size, len(text))
chunks.append(text[start:end])
start += chunk_size - overlap
return chunks
按段落分块
def paragraph_chunk(text: str) -> List[str]:
paragraphs = text.split('\n\n')
return [p.strip() for p in paragraphs if p.strip()]
按句子分块(需要NLTK)
import nltk
nltk.download('punkt')
def sentence_chunk(text: str) -> List[str]:
sentences = nltk.sent_tokenize(text)
return [s.strip() for s in sentences if s.strip()]
动态分块(基于语义)
from transformers import AutoTokenizer
def semantic_chunk(text: str, model_name: str = "bert-base-uncased", max_length: int = 512) -> List[str]:
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokens = tokenizer.tokenize(text)
chunks = []
current_chunk = []
current_length = 0
for token in tokens:
current_chunk.append(token)
current_length += 1
if current_length >= max_length:
chunks.append(tokenizer.convert_tokens_to_string(current_chunk))
current_chunk = []
current_length = 0
if current_chunk:
chunks.append(tokenizer.convert_tokens_to_string(current_chunk))
return chunks
完整文档处理器
class DocumentChunker:
def __init__(self, strategy: str = "fixed", **kwargs):
self.strategy = strategy
self.kwargs = kwargs
def chunk(self, text: str) -> List[str]:
if self.strategy == "fixed":
return fixed_size_chunk(text, **self.kwargs)
elif self.strategy == "paragraph":
return paragraph_chunk(text)
elif self.strategy == "sentence":
return sentence_chunk(text)
elif self.strategy == "semantic":
return semantic_chunk(text, **self.kwargs)
else:
raise ValueError(f"Unknown strategy: {self.strategy}")
# 使用示例
doc = "这是一个示例文档。\n\n包含多个段落。\n每个段落可能有不同长度。"
chunker = DocumentChunker(strategy="paragraph")
chunks = chunker.chunk(doc)
print(chunks)
2. 文本向量化
通过Embedding模型将文本块编码为高维语义向量,实现文本语义的数值化表征。
3. 向量库存储与检索
将向量存入Milvus、Chroma、FAISS等向量数据库,基于近似最近邻搜索(ANN)快速召回Top-K相关片段。
4. 精排与增强
通过重排序(Rerank)模型对检索结果二次精排,过滤噪声、提升相关性,为生成提供高质量上下文。
5. 提示工程与生成
构建规范Prompt模板,将问题与检索上下文输入大模型,生成事实准确、逻辑严谨、可追溯的回答。
三、关键优势
1.低门槛快部署:无训练开销,小时级上线
2.知识实时更新:文档即知识库,无需重训
3.数据安全合规:本地部署,隐私数据不出域
4.事实性更强:答案可溯源、可校验
5.通用性极高:适配知识库、文档解析、专业问答等场景
四、典型应用场景
1.企业内部智能知识问答
2.私域文档理解与抽取
3.法律、医疗、政务等高事实性场景
4.长文本摘要、多文档融合问答
五、总结
大模型是能力基座,RAG是落地关键。它以最轻量的方式解决了大模型最核心的缺陷,是从Demo走向生产的必备技术。理解并掌握RAG全流程,是AI开发者、算法工程师与业务落地者的核心竞争力。
更多推荐
所有评论(0)