检索增强生成(RAG):大模型落地的「智慧外脑」实践指南
在ChatGPT掀起的人工智能浪潮中,大语言模型(LLM)的问题始终是落地应用的痛点。检索增强生成(Retrieval-Augmented Generation,RAG)技术的出现,正在为这个难题提供突破性解决方案——它让大模型学会「查阅资料」,从此回答有据可依。总的来说,RAG是一种结合了信息检索和自然语言生成的方法,旨在处理自然语言处理任务中的信息检索和生成问题。在问答系统中,RAG可以利用外
在ChatGPT掀起的人工智能浪潮中,大语言模型(LLM)的幻觉问题始终是落地应用的痛点。检索增强生成(Retrieval-Augmented Generation,RAG)技术的出现,正在为这个难题提供突破性解决方案——它让大模型学会「查阅资料」,从此回答有据可依。
1 为什么需要RAG?
1.1 大模型的先天局限
尽管LLM展现出惊人的语言理解能力,但其知识边界仍受限于训练数据:
- 时效性缺失(无法获取最新信息)
- 专业领域知识不足
- 「幻觉」导致的虚构回答
1.2 RAG的破局之道
通过引入外部知识库,RAG构建起动态的「记忆外挂」:
- 实时更新:知识库可随时补充新数据
- 精准可控:确保回答基于可信来源
- 成本优化:避免频繁微调的高昂代价
总的来说,RAG是一种结合了信息检索和自然语言生成的方法,旨在处理自然语言处理任务中的信息检索和生成问题。在问答系统中,RAG可以利用外部知识库中的信息来支持生成更准确和全面的答案,特别是对于需要最新信息或广泛背景知识的问题。在摘要生成任务中,RAG可以帮助理解和总结长篇文本,提高摘要的质量和准确性。
2 RAG核心架构拆解
RAG核心架构如下图,包括三个主要模块:知识库构建、知识检索、智能问答。
图来源:https://blog.csdn.net/qq_35054222/article/details/137087487
2.1 知识库构建
(1)文件预处理:PDF/HTML/Markdown多格式解析
#导入语言模型
import os
from langchain_community.llms import Tongyi
from langchain_community.llms import SparkLLM
import pandas as pd
#导入模版
from langchain.prompts import PromptTemplate
#导入聊天模型
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
AIMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
from langchain_community.chat_models import ChatSparkLLM
from langchain_community.chat_models.tongyi import ChatTongyi
#输入模型的key
os.environ["DASHSCOPE_API_KEY"] = "your-api-key"
model_ty = Tongyi(temperature=0.1)
# 文档预处理(如下举了pdf\txt\html三种情况)
from langchain.document_loaders import PyPDFLoader
loader_pdf = PyPDFLoader(r"your-pdf.pdf")
docs_pdf = loader_pdf.load()
from langchain.document_loaders import TextLoader
loader_txt = TextLoader(r'your-txt.txt', encoding='utf8')
docs_txt = loader_txt.load()
from langchain_community.document_loaders import WebBaseLoader
WEB_URL = "https://news.ifeng.com/c/8Y3TlIcTsj0"
loader_html = WebBaseLoader(WEB_URL)
docs_html = loader_html.load()
(2)文件切分:滑动窗口策略平衡上下文
Langchain 中文件切分都根据 chunk_size (块大小)和 chunk_overlap (块与块之间的重叠大小)进行切分。
- chunk_size 指每个块包含的字符或 Token(如单词、句子等)的数量
- chunk_overlap 指两个块之间共享的字符数量,用于保持上下文的连贯性,避免分割丢失上下文信息
Langchain 提供多种文档分割方式,区别在怎么确定块与块之间的边界、块由哪些字符/token组成、以及如何测量块大小
分割器名称 | 核心作用 |
---|---|
RecursiveCharacterTextSplitter() | 通过多级分隔符智能拆分文本,最大限度保持段落结构完整性 |
CharacterTextSplitter() | 按固定字符数硬切割,处理格式标准化文本 |
MarkdownHeaderTextSplitter() | 根据Markdown标题层级切割文档,保留章节关联性 |
TokenTextSplitter() | 基于分词模型精确控制文本块长度,适配NLP模型输入要求 |
SentenceTransformersTokenTextSplitter() | 专门针对嵌入模型优化Token切割,确保分割后的文本符合模型编码规范 |
Language() | 按编程语言语法结构切割代码文件,保持代码块功能完整性 |
NLTKTextSplitter() | 通过规则引擎识别句子边界,实现符合语法规范的英文文本切割 |
SpacyTextSplitter() | 利用语义分析模型识别句子边界,支持多语言的上下文感知式切割 |
'''
* RecursiveCharacterTextSplitter 递归字符文本分割
RecursiveCharacterTextSplitter 将按不同的字符递归地分割(按照这个优先级["\n\n", "\n", " ", ""]),
这样就能尽量把所有和语义相关的内容尽可能长时间地保留在同一位置
RecursiveCharacterTextSplitter需要关注的是4个参数:
* separators - 分隔符字符串数组
* chunk_size - 每个文档的字符数量限制
* chunk_overlap - 两份文档重叠区域的长度
* length_function - 长度计算函数
'''
#导入文本分割器
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 导入递归字符文本分割器
text_splitter_txt = RecursiveCharacterTextSplitter(chunk_size = 384, chunk_overlap = 0, separators=["\n\n", "\n", " ", "", "。", ","])
# 导入文本
documents_txt = text_splitter_txt.split_documents(docs_txt)
(3)向量化:Embedding模型捕捉语义
from langchain.embeddings import DashScopeEmbeddings
embeddings = DashScopeEmbeddings(
model="text-embedding-v1")
(4)构建索引数据入库:向量数据库高效检索
from langchain.vectorstores import Chroma
#persist_directory允许我们将目录保存到磁盘上
#注意from_documents每次运行都是把数据添加进去
vectordb = Chroma.from_documents(documents=documents_txt, embedding=embeddings, persist_directory="你的保存路径" )
下一次,需要直接引用保存的数据库时:
from langchain.vectorstores import Chroma
vectordb_load = Chroma(
persist_directory="你的保存路径",
embedding_function=embeddings
)
vectordb_load._collection.count()
2.2 知识检索
(1)相似度检索
vectordb_load.similarity_search("你检索的内容")
(2)MMR 检索
最大边际相关性(MMR, Maximum Marginal Relevance)是一种信息检索算法,旨在平衡搜索结果的相关性和多样性。
核心公式:
-
参数:
-
- :控制相关性与多样性的权重
- :用户查询
- :候选文档集合
- :已选文档集合
-
工作原理:
-
- 通过向量相似度计算文档与查询的相关性(第一项)
- 惩罚与已选文档的高相似性(第二项)
- 迭代选择综合得分最高的文档
MMR算法核心思想是在已经选择了一个相关性高的文档之后,再选择一个与已选文档相关性较低但是信息丰富的文档。这样可以在保持相关性的同时,增加内容的多样性,避免过于单一的结果。。
vectordb_load.max_marginal_relevance_search("你检索的内容")
2.3 智能问答
构造检索式问答链
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
# 创建提示词模板
prompt = ChatPromptTemplate.from_template("""使用下面的语料来回答本模板最末尾的问题。如果你不知道问题的答案,直接回答 "我不知道",禁止随意编造答案。
为了保证答案尽可能简洁,你的回答必须不超过三句话,你的回答中不可以带有星号。
请注意!在每次回答结束之后,你都必须接上 "感谢你的提问" 作为结束语
以下是一对问题和答案的样例:
请问:秦始皇的原名是什么
秦始皇原名嬴政。感谢你的提问。
以下是语料:
<context>
{context}
</context>
Question: {input}""")
#创建检索链
document_chain = create_stuff_documents_chain(model_ty, prompt)
retriever = vectordb_load.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)
response = retrieval_chain.invoke({
"input": "你的问题?"
})
print(response["answer"])
👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈
3 LangChain实现智能问答
根据上述内容,端到端问答流程,构建一个检索式问答RAG的全过程如下:
# 注意把用到的python库都import进来,这里不再赘述
model_ty = Tongyi(temperature=0.1)
loader_txt = TextLoader(r'你的text文件.txt', encoding='utf8')
docs_txt = loader_txt.load()
text_splitter_txt = RecursiveCharacterTextSplitter(chunk_size = 384, chunk_overlap = 0, separators=["\n\n", "\n", " ", "", "。", ","])
documents_txt = text_splitter_txt.split_documents(docs_txt)
embeddings = DashScopeEmbeddings(
model="text-embedding-v1")
vectordb = Chroma.from_documents(documents=documents_txt, embedding=embeddings, persist_directory="你的保存路径" )
prompt = ChatPromptTemplate.from_template("""使用下面的语料来回答本模板最末尾的问题。如果你不知道问题的答案,直接回答 "我不知道",禁止随意编造答案。
为了保证答案尽可能简洁,你的回答必须不超过三句话,你的回答中不可以带有星号。
请注意!在每次回答结束之后,你都必须接上 "感谢你的提问" 作为结束语
以下是一对问题和答案的样例:
请问:秦始皇的原名是什么
秦始皇原名嬴政。感谢你的提问。
以下是语料:
<context>
{context}
</context>
Question: {input}""")
#创建检索链
document_chain = create_stuff_documents_chain(model_ty, prompt)
retriever = vectordb.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)
构建一个检索式文档对话模型
from langchain.memory import ConversationBufferMemory, ConversationSummaryMemory
from langchain.chains import ConversationalRetrievalChain
memory = ConversationSummaryMemory(
llm=model_ty, memory_key="chat_history", return_messages=True
)
qa = ConversationalRetrievalChain.from_llm(llm=model_ty, retriever=retriever, memory=memory)
res = qa.invoke(
{"question": "你的问题"}
)
print(res["answer"])
4 RAG应用全景图
领域 | 典型场景 | 价值体现 |
---|---|---|
企业服务 | 政策申报助手 | 准确解读最新政策 |
医疗健康 | 诊疗知识问答 | 规避医疗建议风险 |
金融法律 | 合规审查助手 | 确保条款引用准确 |
教育培训 | 智能学习导师 | 个性化知识推荐 |
转载请注明出处,关注我们,获取更多大模型落地实战指南!
如何学习AI大模型?
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业
?”“谁的饭碗又将不保了?
”等问题热议不断。
不如成为「掌握AI工具的技术人
」,毕竟AI时代,谁先尝试,谁就能占得先机!
想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高
那么针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料
分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程
等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓
👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈
学习路线
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)