一、RAG模型是什么,它的原理是什么?
市面上的ai大模型属于是基座模型,就是整理好的数据集训练完成后的数据。这一类的模型会缺少一些个性化的数据的训练,就好像是人,公共知识库里面会有语言知识、物品信息以及课程之类的信息。然后每个人都会有自己想学的东西,这就是不同点。这里的不同点可以是对模型进行微调,也可以是RAG。RAG是 Retrieval-Augmented Generation—检索-增强 生成。这两个之间的区别是
微调是让模型对某个特定的领域专业性更高,是对预训练的模型进行再训练,再训练的数据集是相对的专业领域的数据。
RAG是给模型文档,让模型从文档中检索答案。
二、RAG的步骤和原理
RAG整体流程步骤:
如同它的名字一样:第一步是检索、第二步是增强、第三步是生成。
- 检索:根据用户请求从知识库检索相关上下文
- 增强:将用户请求和检索到的附加上下文填充Prompt
- 生成:检索增强提示输入至LLM生成请求响应
说白了,RAG的原理就是从相关文档中检索最相关的几个段落,然后让大模型按照这几个段落的内容去回答问题。
三、RAG模型的实现
from langchain.chains.combine_documents import create_stuff_documents_chain
#导入提示词模版方法
from langchain_core.prompts import ChatPromptTemplate
#导入ollama本地部署大模型的方法
from langchain_ollama import OllamaLLM
#爬虫库
from langchain_community.document_loaders import WebBaseLoader
import bs4
#这里是利用爬虫方法从网页上爬取数据
loader = WebBaseLoader(
web_path="https://www.gov.cn/xinwen/2020-06/01/content_5516649.htm",
bs_kwargs=dict(parse_only=bs4.SoupStrainer(id="UCAP-CONTENT"))
)
docs = loader.load() #爬虫策略爬取到的数据
#使用bge-m3的嵌入式模型
from langchain.embeddings import OllamaEmbeddings
#设置向量模型,利用ollama下载好的模型
embeddings = OllamaEmbeddings(base_url="http://localhost:11434",model = "bge-m3”)
#使用此嵌入式模型将文档提取到矢量存储中,faiss数据库
from langchain_community.vectorstores import FAISS
#文本切割块
from langchain_text_splitters import RecursiveCharacterTextSplitter
#文本切割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50)
documents = text_splitter.split_documents(docs)
print(len(documents))
vector = FAISS.from_documents(documents,embeddings)
vector.save_local("chineseCivilCode")
#问答模版
prompt_template = ChatPromptTemplate.from_template("""仅根据提供的上下文回答以下问题:
<context>
{context}
</context>
问题:{input}
""")
# 导入ollama部署的大模型
llm = OllamaLLM(model = "deepseek-r1:1.5b")
#create_stuff_documents_chain 通过将多个文档合并为一个上下文窗口来实现文档处理
#设置文档链
document_chain = create_stuff_documents_chain(llm,prompt_template)
from langchain.chains import create_retrieval_chain
#创建Retrievers检索器
retriever = vector.as_retriever()
retriever.search_kwargs = {"k":3}
#创建检索链 该链结合了检索器和文档组合链,实现了从向量数据库中检索相关文档,并将这些文档与用户问题组合成提示
retriever_chain = create_retrieval_chain(retriever,document_chain)
#调用检索链并获取回答
response = retriever_chain.invoke({"input":"建设用地的使用权是什么"})
print(response['answer'])
在上述代码中create_stuff_documents_chain就相当于是将所有的文档块列表全部放入prompt提示器模版的context块中,而create_retrieval_chain整合document_chain和检索chain,将document_chain的输出结果输入到检索chain中,检索chain利用向量相似度对context里面的文档块列表继续筛选。