微信扫码
添加专属顾问
我要投稿
掌握RAG技术,提升语言模型性能。核心内容:1. RAG系统概念与核心原理解析2. RAG如何解决传统大语言模型的关键问题3. RAG的发展历程及实际应用案例
点击“蓝字” 关注我们
尽管大语言模型具备出色的推理能力和广泛的通用知识,但它们在检索精确信息、获取最新数据或提供可验证的回答时常常遇到困难。检索增强生成(Retrieval-Augmented Generation,RAG)应运而生,这一创新性方法通过将大语言模型与外部知识源相结合,有效提升了其性能。本文将深入探讨RAG的概念、重要性,并使用Python和流行的开源库从零开始构建一个完整的RAG系统。
RAG是一种将信息检索与文本生成相结合的架构。其核心原理是在生成回答之前,从外部知识库中检索相关信息,以此增强语言模型的能力。这一过程主要包含以下几个关键步骤:
RAG的出现有效解决了传统大语言模型存在的多个关键问题:
RAG的概念在2020年由Facebook AI Research(现Meta AI)的研究人员在一篇题为“Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks”的论文中正式提出。该论文建议将稀疏和密集检索器与序列到序列模型相结合,用于处理知识密集型任务。
然而,RAG背后的理念在多个领域有着深厚的根源:
随着GPT-3、GPT-4、Claude以及LLaMA等开源替代模型的兴起,RAG的受欢迎程度迅速飙升。企业很快意识到,尽管这些模型功能强大,但为了在商业应用中可靠使用,它们需要与可信的信息来源相结合。如今,RAG已成为应用大语言模型开发的基石,LangChain、LlamaIndex等框架为简化RAG的实现提供了丰富的工具。
RAG在人工智能领域具有诸多显著优势:
一个典型的RAG系统由多个关键组件构成:
构建RAG系统需要使用多个Python库,包括langchain、langchain-core、langchain-community、langchain-experimental、pymupdf、langchain-text-splitters、faiss-cpu、langchain-Ollama、langchain-openai等。这些库各自承担着不同的功能:
可以使用pip命令安装这些库:
pip install langchain langchain-core langchain-community langchain-experimental pymupdf langchain-text-splitters faiss-cpu langchain-ollama langchain-openai
from langchain_community.document_loaders import PyMuPDFLoader
class PdfLoader:
def __init__(self):
pass
def read_file(self, file_path):
loader = PyMuPDFLoader(file_path)
docs = loader.load()
return docs
上述代码定义了一个PdfLoader类,其read_file方法使用PyMuPDFLoader从指定的PDF文件路径中加载文档。PyMuPDFLoader基于PyMuPDF库(也称为fitz),能够高效地处理各种PDF特性,包括文本、表格,甚至通过OCR处理一些图像。load()方法返回一个Document对象列表,每个对象代表PDF文件中的一页,包含提取的文本内容(page_content)和元数据(metadata),如源文件路径和页码。在实际应用中,可扩展该类以处理其他文档类型。
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.documents import Document
class Chunker:
def __init__(self, chunk_size=1000, chunk_overlap=100):
self.text_splitter = RecursiveCharacterTextSplitter(
separators=["\n\n", "\n", " ", ".", ",", "\u200b", "\uff0c", "\u3001", "\uff0e", "\u3002", ""],
chunk_size=chunk_size,
chunk_overlap=chunk_overlap,
length_function=len,
is_separator_regex=False
)
def chunk_docs(self, docs):
list_of_docs = []
for doc in docs:
tmp = self.text_splitter.split_text(doc.page_content)
for chunk in tmp:
list_of_docs.append(
Document(
page_content=chunk,
metadata=doc.metadata
)
)
return list_of_docs
Chunker类负责将加载的文档分割成较小的文本块。在初始化时,通过设置chunk_size(默认1000个字符)和chunk_overlap(默认100个字符)来控制分块的大小和重叠程度。RecursiveCharacterTextSplitter使用一系列分隔符(包括段落分隔符、换行符、空格、标点符号等)来分割文本,优先在自然边界处分割。chunk_docs方法对输入的文档列表进行处理,为每个文本块创建新的Document对象,并保留原始文档的元数据。
import faiss
from langchain_community.docstore.in_memory import InMemoryDocstore
from langchain_community.vectorstores import FAISS
from langchain_ollama import OllamaEmbeddings
from uuid import uuid4
class VectorStore:
def __init__(self):
self.embeddings = OllamaEmbeddings(model="llama3.2:3b")
self.index = faiss.IndexFlatL2(len(self.embeddings.embed_query("hello world")))
self.vector_store = FAISS(
embedding_function=self.embeddings,
index=self.index,
docstore=InMemoryDocstore(),
index_to_docstore_id={}
)
def add_docs(self, list_of_docs):
uuids = [str(uuid4()) for _ in range(len(list_of_docs))]
self.vector_store.add_documents(documents=list_of_docs, ids=uuids)
def search_docs(self, query, k=5):
results = self.vector_store.similarity_search(
query,
k=k
)
return results
VectorStore类是检索系统的核心。在初始化时,创建一个OllamaEmbeddings嵌入模型(这里使用llama3.2:3b模型),并基于FAISS创建一个用于L2距离计算的索引,同时初始化一个包含嵌入函数、索引和文档存储的向量存储。add_docs方法为每个文档生成唯一ID,并将文档添加到向量存储中,向量存储会计算文档内容的嵌入并进行索引。search_docs方法将输入的查询转换为嵌入,在向量存储中执行相似性搜索,并返回最相似的k个文档。在实际生产中,可考虑使用持久化向量存储、添加元数据过滤功能或实现混合搜索。
from langchain_core.prompts import PromptTemplate
from langchain_openai import OpenAI
from langchain_ollama import OllamaLLM
from pdf_loader import PdfLoader
from vector_store import VectorStore
from chunk_text import Chunker
class RAG:
def __init__(self):
self.instructor_prompt = """Instruction: You're an expert problem solver you answer questions from context given below. You strictly adhere to the context and never move away from it. You're honest and if you do not find the answer to the question in the context you politely say "I Don't know!"
So help me answer the user question mentioned below with the help of the context provided
User Question: {user_query}
Answer Context: {answer_context}
"""
self.prompt = PromptTemplate.from_template(self.instructor_prompt)
self.llm = OllamaLLM(model="llama3.2:3b") # OpenAI()
self.vectorStore = VectorStore()
self.pdfloader = PdfLoader()
self.chunker = Chunker()
def run(self, filePath, query):
docs = self.pdfloader.read_file(filePath)
list_of_docs = self.chunker.chunk_docs(docs)
self.vectorStore.add_docs(list_of_docs)
results = self.vectorStore.search_docs(query)
answer_context = "\n\n"
for res in results:
answer_context = answer_context + "\n\n" + res.page_content
chain = self.prompt | self.llm
response = chain.invoke(
{
"user_query": query,
"answer_context": answer_context
}
)
return response
if __name__ == "__main__":
rag = RAG()
filePath = "investment.pdf"
query = "How to invest?"
response = rag.run(filePath, query)
print(response)
RAG类将前面构建的各个组件整合在一起,形成一个完整的RAG系统。在初始化时,定义一个指导语言模型的提示模板,创建PromptTemplate对象,并初始化语言模型、向量存储、PDF加载器和文本分块器。run方法实现了完整的RAG工作流程:加载PDF文档,分块处理,添加到向量存储,根据用户查询搜索相关文本块,组合检索到的文本块形成上下文,将提示模板与语言模型结合生成回答。在主程序中,创建RAG实例,指定PDF文件路径和查询,运行系统并打印结果。
尽管上述实现为RAG系统奠定了坚实的基础,但在实际生产应用中,还有许多方面可以进一步优化和改进:
在生产环境中,RAG系统处理的数据可能包含敏感信息,如企业的商业机密、客户的个人数据等。因此,实施严格的安全和合规措施至关重要。
为了满足生产环境中大量用户和复杂查询的需求,需要对RAG系统进行全面的性能优化。
合理的基础设施架构是保障RAG系统在生产环境中稳定运行和可扩展的关键。
确保RAG系统中的数据和模型状态能够持久保存,以便在系统重启或故障恢复时能够快速恢复运行。
检索增强生成(RAG)作为大语言模型发展中的重要突破,通过结合外部知识源,显著提升了语言模型的实用性、可靠性和可信度。本文详细介绍了RAG的概念、发展历程、重要性,以及使用Python和开源库从零构建RAG系统的全过程,包括文档加载、文本分块、向量存储和响应生成等核心组件的实现。
同时,针对生产环境的需求,探讨了一系列高级改进策略和扩展要点,涵盖文档处理优化、分块策略改进、嵌入检索增强、大语言模型集成优化、系统评估监测以及生产环境部署等多个方面。通过这些措施,可以不断完善RAG系统,使其更好地适应各种实际应用场景。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-05-15
快速上车!RAGflow 保姆级安装指南!小白也能轻松搞定!
2025-05-15
如何设计 AI 与人的交互?以及为什么真正的创新必然是集中式的?
2025-05-15
RAG系统中的向量数据库怎么选?很多人都忽视了
2025-05-15
当RAG拥有“大脑”:揭秘Agentic RAG的进化之路
2025-05-15
RAG不好用?试试MCP这个“知识库优化大师”
2025-05-14
RAG常见的坑:如何让AI有效的考试作弊
2025-05-14
人人都能看懂的预训练、微调、提示词工程和 RAG(我保证)
2025-05-14
DeepSeek接入个人知识库,回答速度飞快,最新安装包即将发布!
2024-10-27
2024-09-04
2024-05-05
2024-07-18
2024-06-20
2024-06-13
2024-07-09
2024-07-09
2024-05-19
2024-07-07
2025-05-15
2025-05-14
2025-05-14
2025-05-13
2025-05-11
2025-05-08
2025-05-05
2025-04-30