大模型应用实战5——大模型基础知识总结
大模型开发思路注意明确输出格式,如以{"from":"","to":""}这种 JSON 格式输出。2.多轮互动产生原因:大模型会自己发散(幻觉)产生原因:用户可以提问不同类型的事情,比如天气和季节解决方法:不要去给大模型设定好要做什么这里面,框架就要承担很重要的职责:1. 根据用户注册的函数,在首次 Prompt 中生成所有 Tool 的完整接口定义。2. 解析 LLM 的返回值,根据内容执行路
大模型开发思路
1.prompt engineering
注意明确输出格式,如以{"from":"","to":""}这种 JSON 格式输出。
2.多轮互动
产生原因:大模型会自己发散(幻觉)
3.function Calling
产生原因:用户可以提问不同类型的事情,比如天气和季节
解决方法:不要去给大模型设定好要做什么
这里面,框架就要承担很重要的职责:
1. 根据用户注册的函数,在首次 Prompt 中生成所有 Tool 的完整接口定义。
2. 解析 LLM 的返回值,根据内容执行路由,调用对应 Tool。
3. 把函数执行结果返回给大模型。
不断循环2和3,直到大模型认为可以结束。
4.知识问答场景-rag产生= Chunk + Embedding + VectorDB = RAG
产生原因:需要理解语义,比如媳妇理解成妻子。
解决方法:给大模型做一些规定
存在问题:上下文长度有限制
解决方法:检索增强技术(rag):高效而准确地找到和问题相关的知识呢,具体是用Embedding(把词、句、图片转化成向量)&向量相似度检索
存在问题:上下文长度有限制,不能直接把一篇文章扔给模型做 Embedding
解决:切分(chunk),切分完可存储到向量数据库(VectorDB),支持相似性查询
因此完整流程为如图所示
5.RAG的优化点:
a.embedding模型的选择:训练自有模型,开源模型,LLM Embedding
b.如何切分:
-
只要有切分,就有相当概率会丢失一部分上下文,段与段间也有联系。
-
更长的文本会包含更多的冗余信息,这会稀释关键信息的密度,进而影响 Embedding 的质量。
6.AI AGENT:利用外部工具帮你干活
7.MCP:串联AI Agent 生态的协议,它其实是 一种流程 + 流程中使用的通信协议。如果要类比,有点类似于建立 TCP 连接,它包含了具体的握手流程,需要几次交互,每次发送什么内容,以什么格式描述。MCP 也是如此。它分为两个角色:mcp-client
和 mcp-server
。mcp-client 就是上面说的军师(也就是我们自己正在开发的大模型应用),mcp-server 就是各个士兵,提供具体的能力的被调方。
各个 mcp-server 就分别返回自己提供的能力列表[ {tool_name, description, 出入参...} ]
。mcp-client 知道了各个 server 有哪些能力,后续在解决问题时,就可以按需来使用这些能力了。这种方式的好处就是,我们的应用(mcp-client)可以再不改动代码的情况下对接新的能力,各种 AI Agent 能够很方便地被复用。
8.LangChain:
LangChain提供了一系列的工具帮助我们更好的使用大语言模型(LLM)。可以认为主要有6种不同类型的工具:
模型(Models)、
提示词(Prompts)(LangChain提供了一些工具,可以方便我们更容易的构建出我们想要的提示词,主要工具如下:
-
PromptTemplates:
语言模型提示词模板PromptTemplates,提示模板可以让我们重复的生成提示,复用我们的提示。它包含一个文本字符串(“模板”),从用户那里获取一组参数并生成提示,包含:
1. 对语言模型的说明,应该扮演什么角色。
2. 一组少量示例,以帮助LLM生成更好的响应。
3. 具体的问题。
-
ChatPrompt Templates
-
聊天模型提示词模板ChatPrompt Templates,ChatModels接受聊天消息列表作为输入。列表一般是不同的提示,并且每个列表消息一般都会有一个角色。
-
Example Selectors
-
示例选择器Example Selectors,如果有多个案例的时候,使用ExampleSelectors选择一个案例让提示词使用:
1. 自定义的案例选择器。
2. 基于长度的案例选择器,输入长的时候按理会少一点,输入多的时候,案例会多一些。
3. 相关性选择器,选择一个和输入最相关的案例。
-
OutputParsers
-
输出解析器OutputParsers,可以让LLM输出更加结构化的信息:
1. 指示模型如何格式化输出:get_format_instructions
2. 输出解析为所需的格式:parse(str)
-
索引(Indexs)
索引可以让文档结构化,从而LLM可以直接更好的和文档交互;比如用于答疑,知识库等,LLM先从文档中获取答案。
LangChain在索引这块也提供了许多有用的函数和工具,方便我们从外部加载与检索不同的文档数据。
在数据索引这块,LangChain提供的主要工具:
1. Document Loaders:从不同的数据源加载文档,当使用loader加载器读取到数据源后,数据源需要转换成 Document 对象后,后续才能进行使用。
2. Text Splitters:实现文本分割,我们每次不管是做把文本当作 prompt 发给 openai api ,还是还是使用 openai api embedding 功能都是有字符限制的。比如我们将一份300页的 pdf 发给 openai api,让他进行总结,他肯定会报超过最大 Token 错。所以这里就需要使用文本分割器去分割我们 loader 进来的 Document。
3. VectorStores:把文档存储为向量结构,因为数据相关性搜索其实是向量运算。所以,不管我们是使用 openai api embedding 功能还是直接通过向量数据库直接查询,都需要将我们的加载进来的数据 Document 进行向量化,才能进行向量运算搜索。转换成向量也很简单,只需要我们把数据存储到对应的向量数据库中即可完成向量的转换。
4. Retrievers:用于检索文档的数据。
-
存储(Memory)
默认情况下Agent和Chain都是无状态的,也就是用完之后不知道上次的对话内容是什么。每次的query都是独立的。
但是在有些应用中,记住上一次的会话内容是比较重要的,比如聊天,LangChain对于也提供了一些相关的工具类。
-
链(Chains)
链可以让我们把多个组件组合成一个应用,比如我们创建一个链,这个链可以接受用户的输入,然后通过PromptTemplate格式化用户的输入为提示词,然后把这个提示词输入给LLM。
我们也可以把一些链组合在一起,构建更复杂的链。
-
代理(Agents)
代理是使用LLM作为思考工具,决定当前要做什么。我们会给代理一系列的工具,代理根据我们的输入判断用哪些工具可以完成这个目标,然后不断的运行工具,来完成目标。
代理可以看做是增强版的Chain,不仅绑定模板、LLM,还可以给代理添加一些工具。
-
有两种类型的Agent:
1. 动作代理(Action Agents):这种代理一次执行一个动作,然后根据结果决定下一步的操作。
2. 计划-执行代理(Plan-and-Execute Agents):这种代理首先决定一系列要执行的操作,然后根据上面判断的列表逐个执行这些操作。
-
Agent内部涉及的核心概念如下:
1. 代理(Agent):这是应用程序主要逻辑。代理暴露一个接口,接受用户输入和代理已执行的操作列表,并返回AgentAction或AgentFinish。
2. 工具(Tools):这是代理可以采取的动作。比如发起HTTP请求,发邮件,执行命令。
3. 工具包(Toolkits):这些是为特定用例设计的一组工具。例如,为了让代理以最佳方式与SQL数据库交互,它可能需要一个执行查询的工具和另一个查看表格的工具。可以看做是工具的集合。
4. 代理执行器(Agent Executor):这将代理与一系列工具包装在一起。它负责迭代运行代理,直到满足停止条件。
9.微调:在已经训练好的大型预训练模型的基础上,进一步训练该模型以适应特定任务或特定领域的数据。
10.强化学习:是一种机器学习方法,它通过让智能体在环境中执行动作,以获得反馈或奖励信号,从而学习最优策略。通过不断地试错和调整策略,智能体逐渐找到能够最大化长期回报的行为路径。这种学习方法常用于需要决策和动态环境交互的任务,如游戏、机器人导航和自动化控制系统。
11.模型蒸馏(Model Distillation):通过将一个复杂的大型模型(通常称为“教师模型”)中的知识迁移到一个更小的模型(称为“学生模型”)。在这个过程中,教师模型首先对训练数据进行预测,生成软标签即概率分布。这些软标签包含了有关任务的重要信息。学生模型则使用这些软标签进行训练,以接近教师模型的性能。模型蒸馏能够在保持高精度的同时,显著减少模型的大小和计算消耗,适用于在资源受限的环境下部署机器学习模型。
12.大模型微调
方法:让模型通过在特定任务的数据上进行再训练,从而永久掌握该任务所需的技能。
分类:全量微调与高效微调。全量微调是指利用所有可用数据来重新训练模型,以全面优化其参数。高效微调则采用更精简的策略,只使用部分数据进行调整,并主要修改模型的部分参数。
13.高效微调与LoRA、 QLoRA
LoRA微调是一种参数高效的微调方法,旨在通过引入低秩矩阵来减少微 调时需要调整的参数数量,从而显著降低显存和计算资源的消耗。具体来说,LoRA 微调并不直接调整原始模型的所有参数,而是通过在某些层中插入低秩的适配器(Adapter)层来进行训练。
LoRA的原理:
●在标准微调中,会修改模型的所有权重,而在 LoRA 中,只有某些低秩矩阵(适配器)被训练和调整。这意味着原始模型的参数保持不变,只是通过少量的新参数来调整模型的输出。
●低秩矩阵的引入可以在显存和计算能力有限的情况下,依然有效地对大型预训练模型进行微调,从而让 LoRA 成为显存较小的设备上的理想选择。
LoRA的优势:
1.显存优化: 只需要调整少量的参数(适配器),显著减少了显存需求,适合显存有限的GPU。
2.计算效率: 微调过程中的计算负担也更轻,因为减少了需要调整的参数量。
3.灵活性: 可以与现有的预训练模型轻松结合使用,适用于多种任务,如文本生成、分类、问答等。
而QLoRA(Quantized Low-Rank Adaptation) 则是 LoRA 的一个扩展版本,它结合了 LoRA 的低秩适配器和量化技术。QLoRA 进一步优化了计算效率和存储需求,特别是在极端显存受限的环境下。与 LoRA 不同的是, QLoRA 会将插入的低秩适配器层的部分权重进行量化(通常是量化为INT4或INT8),在保持性能的同时显著降低模型的存储和计算需求。
在实际大模型应用场景中,高效微调主要用于以下四个方面:
1.对话风格微调:高效微调可以用于根据特定需求调整模型的对话风格。例如,针对客服系统、虚拟助理等场景,模型可以通过微调来适应不同的语气、礼貌程度或回答方式,从而在与用户互动时提供更符合要求的对话体验。通过微调少量的参数(例如对话生成的策略、情感表达等),可以使模型表现出更具针对性和个性化的风格。
2.知识灌注:知识灌注是指将外部知识或领域特定的信息快速集成到已有的预训练模型中。通过高效微调,模型可以更好地学习新领域的专有知识,而无需重新从头开始训练。例如,对于法律、医疗等专业领域,可以使用少量的标注数据对预训练模型进行微调,帮助模型理解特定行业的术语、规则和知识,进而提升专业领域的问答能力。
3.推理能力提升:高效微调还可以用于提升大模型的推理能力,尤其是在处理更复杂推理任务时。通过微调,模型能够更加高效地理解长文本、推理隐含信息,或者从数据中提取逻辑关系,进而在多轮推理任务中提供更准确的答案。这种微调方式可以帮助模型在解答复杂问题时,提高推理准确性并减少错误。
4.Agent能力(Function calling & MCP能力)提升:在多任务协作或功能调用场景中,高效微调能够显著提升模型Agent能力,使得模型能够有效地与其他系统进行交互、调用外部API或执行特定MCP任务。通过针对性微调,模型可以学会更精准的功能调用策略、参数解析和操作指令,从而在自动化服务、智能助手或机器人控制等领域表现得更加高效和智能。

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