基于【大语言模型(LLM)】+【检索增强生成(RAG)】+【指令微调(Fine-Tune)】技术,构建智能体的方法
0 引言
引言
术语
AGI:通用人工智能AIGC:人工智能生成LLM:大语言模型,ChatGPT、llama、千问、文心一言、KIMI都是大语言模型。langchain:一个对AI基础功能进行抽象的开发平台。作为一款先进的语言模型应用开发框架,可以让我们从基础、重复的代码中脱离。RAG:检索增强生成。Fine-Tunning:微调,让LLM学习我们整理好的知识,大多是专业细分领域的私有化数据集。
1 概述
关键技术:RAG/检索增强生成
定义与意义
Retrieval Augmented Generation/检索增强生成。
它的主要作用是生成(最终的答案),但是它先做了对现有文档的检索,而不是任由LLM(各大语言模型)来发挥。
优化/解决LLM胡说八道的问题
- 最通俗的解释:LLM都是自己的内容的时间限制,RAG则是添加一个私密的、专业的外挂知识集。
例如,ChatGPT 3.5,知识更新到2021年9月,在这之后的知识他并不了解。同时,一些非网络公开的知识(如企业自己的知识库)也是学习不到的。
为了解决这个问题,我们可以将企业的厚厚的《业务操作指南》交给LLM,让LLM去查询这本《业务操作指南》,并且认真阅读掌握业务方法。
当然,如果他碰到的业务知识比较复杂,他就需要自己去综合这本书上面的多个章节的内容,并融会贯通。
最后,用这本《业务操作指南》中的内容来回来我的问题。
简单来说:就是给LLM我们自己的知识内容,让LLM根据我们给出的知识去回答问题!
那为什么不自己去看?
有时候内容非常多,上百万字,自己去找十分困难。而LLM可以理解知识,并给出符合 我们要求的答案。
和Fine-Tunning有什么不一样?
- Fine-Tunning(微调)其实是在修改模型,给模型增加了新内容,但越是微调,专用性越强,通用性越弱。
- 微调的内容其实是一问一答,即一个明确的问题有确定的回答,避免回答的随机性。
- 即然是一问一答,直接检索就可以了,为什么还是fine-tunning?
因为LLM可以将相似的问题语义表述,认定为同一个问题用这一个答案来回答,这是检索不具备的。- 如:1、我今天吃了火锅有一些窜稀
- 如:2、我今天吃了火锅有一些拉肚子
这在LLM里已经处理为相同的事情了,而如果检索就需要我们自己对输入的内容进行分析。简单说,fine-tunning帮我们将“相同的语义”但不同的“语言表达”归为相同的答案。
而RAG相当于是给LLM加了一个外挂,即我们的知识库,LLM本身并没有变化,只是在回答问题时,从知识库中摘取内容进行回答。
- 怎么才能把我们的知识给LLM?
这就是RAG技术。具体的有如下的几个步骤:- 文档加载 → 文档分割 → 文档嵌入 → 向量化存储 → 文档检索 → 生成回答。
过程看着比较多,有个印象即可。每一步也有自己的优化点,这需要我们动手尝试,并不断的思考优化才能取得可用于生产的效果。
RAG的组成
- 事实上,一个典型的 RAG 框架可以分为:
- 检索器(Retriever)
检索过程包括:
- 为数据(如 Documents)做切分
- 嵌入向量(Embedding)
- 并构建索引(Chunks Vectors)
- 再通过向量检索,以召回相关结果
- 生成器(Generator)
- 生成过程,则是利用基于检索结果(Context)增强的 Prompt 来激活 LLM 以生成回答(Result)。

案例:用KIMI体验文档检索与知识抽取的便捷
在我们正式开始RAG的编码之前,我们先来使用KIMI()这个工具来体验一个用LLM进行检索的乐趣。
进入KIMI,登陆一个账号,就可以开始进行对话了,但今天的重点是文件解析。

例如,将一个PDF的招标书上传到KIMI

然后输入我的提示词:

你看,非常快捷的就把内容给精准的提炼了出来。你也可以快速的用手头的文档来练练手。这里要注意我们的提示词。
- 提示词:LLM的角色 + 角色要求 + 我的目标 + 期望的输出 + 输出格式
具体到上述的问题:
“
kimi你好,这是我司的合同,你作为一个分析师,请你仔细的阅读文档内容。然后帮我分析一下我的下述几个属性:行业属性、产品属性、合同规模属性。行业属性,请你回答“行业:***”
只展示一个行业属性。产品属性请你回答“产品:**”,只展示一个产品属性。合同规模属性,请你回答“规模:**”。
”
我们进行一下拆解:
- LLM的角色 : kimi你好,这是我司的合同,你作为一个分析师
- 角色要求 : 请你仔细的阅读文档内容。
- 期望的输出 : 然后帮我分析一下我的下述几个属性:行业属性、产品属性、合同规模属性。
- 输出格式 : 行业属性,请你回答“行业:”,只展示一个行业属性。产品属性请你回答“产品:”,只展示一个产品属性。合同规模属性,请你回答“规模:*”。”
然后我们继续:

KIMI一样能给出不错的回答。LLM设计之初就更像一个文科生,对于文本的处理能力很强。
当然,处理数学问题比较差,毕竟这是理科问题。
想象一下,当我们有大量的知识后,我们是希望像以前一些通过关键词检索,亦或是一篇篇的查找,还是希望这样快捷的、对话式的获得知识??
关键技术:Ollama(LLM私有部署与运行环境框架)
Ollama是大语言模型的运行环境,LLM并不是一个可执行文件,需要依托于一个运行环境才可以使用。
可百度搜索 Ollama 下载。
Ollama本身就200M+的大小,任何电脑都可以安装。
Ollama没有GUI,需要我们在CMD中运行。
关键技术:LangChain(LLM编程框架)
- `LangChain·: 一个 LLM 编程框架、AI编程框架————其将基础的功能已经整合进来封装,减少我们的工作量。
但langchain本身并不是LLM,需要我们安装好LLM,或使用在线api。
你想开发一个基于 LLM 应用,需要什么组件它都有,直接使用就行;
甚至针对常规的应用流程,它利用链(LangChain中Chain的由来)这个概念已经内置标准化方案了。
LangChain的几大模块:
- 提示模板
- 示例选择器
- 聊天模型
- LLMs
- 输出解析器
- 文档加载器
- 文本拆分器
- 嵌入模型
- 向量存储
- 检索器
- 索引
- 工具
- 代理
- 多模态
- 回调
看起来很多,但是你会发现,langchain已经将我们需要四处寻找的工具,都整合了进来,这样会节省我们大量的时间。
案例:基于 Lang Chain 完成一个最简单的代码任务
- 为了实现这个目标,我们需要先进行如下的准备,然后才能开始进行代码的编写:
- 1、使用
ollama,在本地配置一个LLM; - 2、配置好
PyCharm的环境; - 3、
langchain等依赖库的安装。
Step1 安装本地部署与运行环境: Ollama
我们选择了自己部署,而自己私有化本地部署的一个工具就是Ollama,它可以在本地部署好我们的LLM,如llama`qwen等,Ollama`是这些LLM的运行环境。

完成安装后,输入ollama -v,能看到version就非常OK!Step2 安装大语言模型/LLM : QWen2
但这只是一个空的运行环境,接下来要去安装一个LLM,这里我选择阿里的QWEN2。
回到官网,点击页面右上角的"model",找到QWEN2。

点击进去后,这里可以在旁边看到安装的命令。
ollama run qwen2
- 如果你的电脑性能一般,
ollama的运行会比较慢。
Ollama对电脑的最低要求包括至少8GB的内存以流畅运行7B模型,而14B模型则需要至少16GB内存,72B模型则需要至少64GB内存。- 回到
CMD中,输入上述命令。

看到开始安装。需要多长时间看自己的网速。
- 完成后,回到
CMD,输入ollama run qwen2,就可以运行大模型,并与其对话了。

有了这个模型后,我们可以安装一个webui,这样就可以像chatGPT一样在网页中对话。但我们今天的任务是使用代码进行对话,这样才能将整个过程结合到我们的业务中。
Ollama的接口服务器占用11434端口。所以,我们可以先在浏览器中查看此服务是否可用。

你自己也可以安装一些其它的模型来体验。
Step4 安装Python集成开发环境: PyCharm,并配置 LangChain
- PyCharm我就不多说了,相信来学习Python、AI的都会使用,这里只给出我们需要在编码前,完成的一些依赖库安装。

如果你的pip版本老了,先升级一下。python.exe -m pip install --upgrade pip
然后,执行下面的命令,安装langchain
pip install langchain
pip install langchain-community
pip install beautifulsoup4
- 先放下
langchain是什么的好奇心。现在,在我们完成Ollama及llm,以后Python运行环境的准备后,我们输入这段代码:
def chat():
prompt = ChatPromptTemplate.from_messages([
("system", "{parser_instructions}"),
("human", "列出{cityName}的{viewPointNum}个著名景点。")
])
model = Ollama(model="qwen2")
output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()
# 查看解析器的指令内容
print("----- 解析器 -----")
print(parser_instructions)
final_prompt = prompt.invoke({"cityName": "成都", "viewPointNum": 4, "parser_instructions": parser_instructions})
response = model.invoke(final_prompt)
print("----- response -----")
print(response)
ret = output_parser.invoke(response)
print("------ret-----")
print(ret);
运行后得到了结果:

运行时长依你的电脑配置而定,我的几秒,现在我们来解释一下代码。
- 感受完了,小结一下————langchain最有价值的是组件
用于处理语言模型的抽象概念,以及每个抽象概念的实现集合。
无论你是否使用LangChain框架的其他部分,组件都是模块化的,易于使用。
现成的链:用于完成特定高级任务的组件的结构化组合。现成的链使人容易上手。
对于更复杂的应用和细微的用例,组件使得定制现有链或建立新链变得容易。
这些概念性的知识在实际运用前都是难以理解的,让我们直接开始看代码吧。
- 从我们最直观的感受上来说,一个Chat的过程肯定是:
** 准备好提示词 -> 输入给LLM -> LLM => 反馈**
prompt = ChatPromptTemplate.from_messages([
("system", "{parser_instructions}"),
("human", "列出{cityName}的{viewPointNum}个著名景点。")
])
### 这里是使用了langchain的提示词模板,system中的
### parser_instructions是对于输出的要求
### human中的cityName和viewPointNum是我们的问题中动态输入的参数。
然后下一段
model = Ollama(model="qwen2")
### 定义了我们要使用的LLM,这里我使用了“千问”
output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()
### 这里定义了输出的解析方式 CommaSeparatedListOutputParser
### 除此之外,还有 DatetimeOutputParser、EnumOutputParser 等多种解析器
完成了提示词、大模型选择、输出定义后,但并没有运行起来。需要我们在后面的代码中,使用invoke。
final_prompt = prompt.invoke({"cityName": "成都", "viewPointNum": 4, "parser_instructions": parser_instructions})
###对prompt使用invoke,将我们的输入绑定到提示词模板,形成final_prompt
response = model.invoke(final_prompt)
print("----- response -----")
print(response)
### 对model使用invoke,将final_prompt提交给LLM,也就是qwen2,
### 最后得到一个response,这是一个message,需要解析成我们需要的格式。
ret = output_parser.invoke(response)
print("------ret-----")
print(ret);
### 将response提交给output_parser,得到分隔开的一个字段串数组类型的输出。
- 怎么样!是不是十分的简单。在这段代理里使用了提示词模板、模型、输出解析器。但前面提到的最重要的链好像并没有用到。
- langchain使用了LCEL表达语言,我们可以将上述的运行部分用这样的方式来替代,一样可以得到结果。
chain = prompt | llm | output_parse
rrrr = chain.invoke({"cityName": "成都", "viewPointNum": 4, "parser_instructions": parser_instructions})
- 这就是langchain的链的表达,虽然这只是一个最简单的链,但我们已经初步的感受到,链就是一个工作流,将我们的工作串起来,避免了Invoke满天飞。
- 在langchain中,实际上已经定义了很多的chain,当我们更加的熟悉后,我们可以使用现有的链。
如何系统的去学习大模型LLM ?
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。
事实上,抢你饭碗的不是AI,而是会利用AI的人。
继科大讯飞、阿里、华为等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?
与其焦虑……
不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。
针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓
👉👈

一、LLM大模型经典书籍
AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

二、640套LLM大模型报告合集
这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)

三、LLM大模型系列视频教程

四、LLM大模型开源教程(LLaLA/Meta/chatglm/chatgpt)

LLM大模型学习路线 ↓
阶段1:AI大模型时代的基础理解
目标:了解AI大模型的基本概念、发展历程和核心原理。
内容:
- L1.1 人工智能简述与大模型起源
- L1.2 大模型与通用人工智能
- L1.3 GPT模型的发展历程
- L1.4 模型工程
- L1.4.1 知识大模型
- L1.4.2 生产大模型
- L1.4.3 模型工程方法论
- L1.4.4 模型工程实践
- L1.5 GPT应用案例
阶段2:AI大模型API应用开发工程
目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
内容:
- L2.1 API接口
- L2.1.1 OpenAI API接口
- L2.1.2 Python接口接入
- L2.1.3 BOT工具类框架
- L2.1.4 代码示例
- L2.2 Prompt框架
- L2.3 流水线工程
- L2.4 总结与展望
阶段3:AI大模型应用架构实践
目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
内容:
- L3.1 Agent模型框架
- L3.2 MetaGPT
- L3.3 ChatGLM
- L3.4 LLAMA
- L3.5 其他大模型介绍
阶段4:AI大模型私有化部署
目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
内容:
- L4.1 模型私有化部署概述
- L4.2 模型私有化部署的关键技术
- L4.3 模型私有化部署的实施步骤
- L4.4 模型私有化部署的应用场景
这份 LLM大模型资料 包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓
👉👈
