本文是作者给兄弟团队做的大模型入门分享,介绍了基本大模型模式,分享出来希望帮助更多的同学参与到LLM应用建设。
前言
大模型作为新兴领域,不断地冒出来新的专有术语和新的概念,让大家觉得很神秘,捉摸不透。但是大部分复杂性的背后都会有一个极其简单便于理解的模型,本次分享最主要就是大模型的基本范式,通过范式将这些神秘感去除。
大模型虽然很厉害,很神秘,但作为使用人员,门槛是非常非常非常低的。
模型基础
虽然市面上的大型语言模型(LLMs)种类繁多,但在使用层面大家平等的都是API调包侠,因此从接口层面来剖析大模型有哪些能力。LLM的接口通常都遵循或类似于 OpenAI 的规范。这里我们以 OpenAI 的接口为例进行说明。
在与大型模型交互时,除了控制模型输出随机性的参数外,最核心的参数只有两个:ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.034em;font-style: normal;font-weight: normal;">messages和ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.034em;font-style: normal;font-weight: normal;">tools。可以说,市面上各种各样的大模型应用,都是基于这两个参数的基础上设计而来。
messages-大模型是怎么实现记忆的?
messages是一个对话数组,其中角色主要有:
system:代表当前对话的系统指令,一般放提示词
user:用户指令
assistant:LLM的回复
...:不同厂商会有不同的扩展定义
大模型所谓的对话记忆实际上就是依赖该数组做信息传递,如下图所示,第一轮我告诉我的名字叫屈定,第二轮的时候在问他是谁,他已经知道了我的名字,之所以知道因为我在messages的上下文中传递给了他这个信息。
使用user传递用户的对话
使用system设置系统指令
提示词的不稳定容易被指令注入攻击
三张图看完,先总结下:
大模型为什么能记住之前的对话?
只是因为后台系统给了他之前的对话,并不是他自己记住。大模型的请求调用就是一个无状态的,取决于每次给的对话内容。
大模型的提示词有什么用?
大模型的提示词可以进一步控制(覆盖)模型的行为,具备高优先级,但存在不稳定性。
接下来我们就可以来理解第一个重要的大模型范式:检索增强生成,也就是RAG(Retrieval Augmented Generation)。
直白的理解为用检索到的知识,来增量生成答案的质量。比如我有一个关于数仓各种问题处理的Q&A,想要做一个问答机器人,这个问答机器人要基于我的Q&A回复用户。这个 检索Q&A -> 基于检索到的Q&A回复用户,这个流程就是一个典型的RAG链路。也显而易见,RAG的最终目标是生成靠谱的答案给到用户。
RAG链路的搭建是很简单,但是效果却很难,从流程里面我们能发现两个关键点:
1.知识库检索召回:这里要解决如何召回最靠谱的答案。
2.LLM基于知识回答:这里要解决的是如何让模型在一堆知识中给出自信准确的回答。
这些都是业界在不断探索的东西,没有所谓的标准答案,只有适合当前业务的最佳方案。
经常有同学会问一些大模型是否能查询odps,或者大模型能够把数仓数据导入到ob之类的问题。这些问题的背后是对LLM存在错误的理解,也就是tools参数的理解。
tools也是一个数组,包含了一堆工具集合,核心为工具的作用描述,和工具需要的参数,如下图天气工具的定义。
接下来就是使用工具,基于工具的回答至少要两次大模型请求调用:
1.将用户的对话和工具一起给到大模型,大模型需要执行的工具以及工具参数;
2.后端系统依据大模型选择结果,去执行对应的工具,拿到结果;
3.再次请求大模型,此时上下文中给到了工具执行结果,大模型基于信息回复;
先总结下:
1.大模型并不能够执行任何工具,但是大模型能够选择接下来要执行的工具。选择后工具由配合的系统来执行获取结果。
接下来我们就可以来理解第二个重要的大模型范式ReAct(Reason+Act)。
这里需要强调下,大模型的很多范式都是对生活中人类行为的模拟,因此我们也是从生活中的案例来理解大模型。
案例主题:老板让写一份调研外部大模型框架的报告
工具:互联网搜索,PPT,思维导图
思考 (Reasoning): 需要调研外部大模型框架,明确调研目标是了解行业内的主要框架、特点和应用场景。需要先明确有哪些主流框架,然后针对性地收集资料。行动 (Acting):行动: 使用互联网搜索“主流大模型框架2024/2025”、“开源大模型框架”。观察 (Observation):观察: 搜索结果显示:PyTorch、TensorFlow、JAX等是主流框架,还有一些新兴框架如MindSpore、Paddle等。
思考 (Reasoning): 我已经拿到了想要的资料,接下来使用思维导图搭建汇报思路行动 (Acting):行动: 使用思维导图工具,搭建报告的初步框架,包括:框架名称、开发语言、主要特点、优势、劣势、应用场景。观察 (Observation):观察: 初步框架包括:框架名称、开发语言、主要特点(动态图/静态图、分布式训练支持等)、优势、劣势、应用场景(NLP、CV等)。
思考 (Reasoning): 信息基本收集完毕,需要将所有信息整理成结构化的报告,并使用PPT进行总结和分析。行动 (Acting):行动: 使用PPT工具,将思维导图中的内容整理成PPT,并撰写文字说明。观察 (Observation):观察: 完成了PPT初稿,内容比较全面,但需要进行排版美化。
这个思考的流程就是ReAct,后面有实际案例,这里先理解这个概念。
模型使用
大模型的应用五花八门,但都离不开上述两个核心参数,接下来围绕上述的参数,我们能利用的现有的模型交互手段主要有以下三种,包括:
调优提示词:大模型工程中的核心,提示词的优秀与否决定了你是否需要链路上做额外的兜底
增加调用次数:将一个任务拆分为多个子任务执行,最后判断结果。这是一种常用的对提示词能力的补充手段,降低单一提示词的复杂性。
模型微调:通过引入特定业务场景案例,让模型能更好地理解用户的意图和需求。
用大模型+提示词做翻译 [提示词调优]
为了更好的评价,我们选择哪吒中的英文台词,然后将英文翻译成中文,看还原度如何?
Theprejudiceinpeople'sheartsislikeamountain.Nomatterhowhardyoutry,youcan'tmoveit.Lookingbackonit,threeyearsisn'tthatlong.BequicktoobeymycommandI'mthecaptainofmydestiny,notheaven.Ifyouaskmewhetherpeoplecanchangetheirowndestiny,Idon'tknow.ButdefyingfateisNezha'sdestiny.
方案一:直接使用提示词进行翻译
## Role and Goal:你是一个翻译专家,尤其擅长英文到中文的翻译,接下来我给你多段英文台词,帮我翻译成中文.## Constraints-翻译时保持译文格式不变## Background:原文来自《哪吒》系列电影的第二部中的台词,讲述了天劫之后,哪吒、敖丙的灵魂保住了,但很快会魂飞魄散。太乙真人打算用七色宝莲给二人重塑肉身,但是在重塑肉身的过程中却遇到重重困难,哪吒、敖丙的命运将迎来更多的挑战。## Guidelines:1.结合背景将文本直接翻译成中文,保持原始格式,不省略任何信息。## Source:-The prejudice in people's hearts is like a mountain. No matter how hard you try, you can't move it.-Looking back on it, three years isn't that long.-Be quick to obey my command-I'm the captain of my destiny, not heaven.-If you ask me whether people can change their own destiny, I don't know. But defying fate is Nezha's destiny.## Output:{译文}
绝大多数情况下,直接使用提示词能做到的效果就已经能达到60%了(现在的模型确实强大了),下方的问题在于一些短的语句翻译不够传神。
模型 | 方案一翻译结果: |
gemini-2.0-flash |
|
方案二:提示词中引入COT(Chain-of-Thought)
COT被称为思维链,简单点来说是要告诉模型针对问题的思考步骤是什么,引导模型去按照特定思维解决问题。概念很抽象,以翻译为例,我们思考一般人是如何进行翻译的?
1.先直接翻译
2.结合上下文再审视这个翻译是否合理,有哪些改进点
3.针对改进点再斟酌修改
那么我们也让模型按照这个思路来执行翻译。
## Role and Goal:你是一个翻译专家,尤其擅长英文到中文的翻译,接下来我给你多段英文台词,帮我翻译成中文.## Constraints-翻译时保持译文格式不变-严格按照output中定义的范式输出## Background:原文来自《哪吒》系列电影的第二部中的台词,讲述了天劫之后,哪吒、敖丙的灵魂保住了,但很快会魂飞魄散。太乙真人打算用七色宝莲给二人重塑肉身,但是在重塑肉身的过程中却遇到重重困难,哪吒、敖丙的命运将迎来更多的挑战。## Guidelines:翻译的过程分为三部分:1.直译:结合背景将文本直接翻译成中文,保持原始格式,不省略任何信息。2.评估和反思:结合背景道教封神,主人公对命运反抗,识别直接翻译中的具体问题,例如:-非母语常用的中文表达,-笨拙的措辞-过于口语化的表达-等等提供解释,但不要添加或省略内容或格式。3.意译:根据字面翻译和已识别的问题,重新解释翻译,确保它保持与原始输入格式一致,不要删除任何内容。## Source:-The prejudice in people's hearts is like a mountain. No matter how hard you try, you can't move it.-Looking back on it, three years isn't that long.-Be quick to obey my command-I'm the captain of my destiny, not heaven.-If you ask me whether people can change their own destiny, I don't know. But defying fate is Nezha's destiny.## Output:### 直译{直译}***### 评估和反思{评估和反思}***### 意译{意译}
该方案取得了意想不到的效果,针对长句翻译成短句组合形式, 相比官方的来看,更像是修道者的口吻,但针对一些特殊短句用法,仍然不够理想。
模型 | 方案一翻译结果: | 方案二翻译结果: |
gemini2.0 flash |
|
|
方案三:引入动态few shot
few shot指的是提示词中的少样本技巧,动态就是将这部分样本抽离到一个知识库,每一次走翻译前先去知识库里面召回TOP最相关的,然后放入到提示词的Example中。
假设我的知识库中召回了如下两句:
Item1: 原文:Be quick to obey my command意译:急急如律令Item2: 原文:Life isnotlong, but it'snotshorteither.意译:人生,说长不长,说短不短。
结合后提示词如下:
## Role and Goal:你是一个翻译专家,尤其擅长英文到中文的翻译,接下来我给你多段英文台词,帮我翻译成中文.## Constraints-翻译时保持译文格式不变-严格按照output中定义的范式输出## Background:原文来自《哪吒》系列电影的第二部中的台词,讲述了天劫之后,哪吒、敖丙的灵魂保住了,但很快会魂飞魄散。太乙真人打算用七色宝莲给二人重塑肉身,但是在重塑肉身的过程中却遇到重重困难,哪吒、敖丙的命运将迎来更多的挑战。## Guidelines:翻译的过程分为三部分:1.直译:结合背景将文本直接翻译成中文,保持原始格式,不省略任何信息。2.评估和反思:结合背景道教封神,主人公对命运反抗,识别直接翻译中的具体问题,例如:-非母语常用的中文表达,-笨拙的措辞-过于口语化的表达-等等提供解释,但不要添加或省略内容或格式。3.意译:根据字面翻译和已识别的问题,重新解释翻译,确保它保持与原始输入格式一致,不要删除任何内容。## Example:1.原文:Be quick to obey my command意译:急急如律令---2.原文:Life is not long, but it's not short either.意译:人生,说长不长,说短不短。## Source:-The prejudice in people's hearts is like a mountain. No matter how hard you try, you can't move it.-Looking back on it, three years isn't that long.-Be quick to obey my command-I'm the captain of my destiny, not heaven.-If you ask me whether people can change their own destiny, I don't know. But defying fate is Nezha's destiny.## Output:### 直译{直译}***### 评估和反思{评估和反思}***### 意译{意译}
模型 | 方案一翻译结果: | 方案二翻译结果: | 方案三翻译结果: |
gemini2.0 flash |
|
|
|
few shot这种开卷考试方法是大模型链路中一种重要的优化手段,few shot是提示词中为数不多能够动态变化的部分,且对模型整体效果影响较小,更为可控。此外业务流量一般都是符合2:8分布的,且是可收敛的,可能只需要20%的few shot案例,就能满足80%的场景诉求。
用大模型+Agent做计算器 [增加调用次数]
大家应该都看过下面的案例,大模型是很不擅长数学计算的,那么用大模型直接做计算器就非常容易出问题。
这里使用llama_index的agent框架做演示:
1.定义了三个工具函数,乘法,加法,减法
2.构建一个Agent执行模式
importosfrom dotenvimportload_dotenvfrom llama_index.core.agentimportReActAgentfrom llama_index.core.toolsimportFunctionToolfrom llama_index.llms.azure_openaiimportAzureOpenAIdefmultiply(a:int, b:int)->int:"""Multiply two integersandreturns the result integer"""returna * bdefadd(a:int, b:int)->int:"""Add two integersandreturns the result integer"""returna + bdefsubtract(a:int, b:int)->int:"""subtract two integersandreturns the result integer"""returna - b# 加载 .env 文件load_dotenv()# 初始化工具multiply_tool = FunctionTool.from_defaults(fn=multiply)add_tool = FunctionTool.from_defaults(fn=add)subtract_tool = FunctionTool.from_defaults(fn=subtract)llm = AzureOpenAI(model="gpt-4o", # 或者 gpt-4engine='gpt-4o',deployment_name="gpt-4o",api_key=os.getenv('AZURE_KEY'),azure_endpoint="https://ilm-dev.openai.azure.com",api_version="2023-07-01-preview")# 初始化Agentagent = ReActAgent.from_tools([multiply_tool, add_tool, subtract_tool], llm=llm, verbose=True)response = agent.chat("What is 60-(20+(2*4))? Calculate step by step ")
> Running step cba1a160-74c3-4e34-bcc4-88e6a678eaf9. Step input: Whatis60-(20+(2*4))? Calculate stepbystepThought: The current language of the useris: English. I need to use a tool to help me answer the question.To solve the expression \(60- (20+ (2*4))\) stepbystep, I will first calculate the multiplication inside the parentheses.Action: multiplyAction Input: {'a':2,'b':4}Observation:8> Running step5455108e-ac53-4115-8712-68f2457a9b82. Step input: NoneThought: Now that I have the result of the multiplication, I can proceed to the next step, whichistoadd20and8.Action:addAction Input: {'a':20,'b':8}Observation:28> Running step4d8fae00-83bd-4205-9993-f0e0119f408d. Step input: NoneThought: Now that I have the result of the addition, I can proceed to the final step, whichisto subtract28from60.Action: subtractAction Input: {'a':60,'b':28}Observation:32> Running step ce5d1075-ff11-47a2-b286-d7a715dc40ba. Step input: NoneThought: I can answer withoutusingany more tools. I'll use the user's language to answer.Answer: The result of the expression \(60- (20+ (2*4))\)is32.
上次有同学问,那么大模型在这种链路里面到底发挥了什么作用?大模型最大的能力就是自然语言理解,我们可以尝试把规则再复杂化,输入改成张三代表减法,李四代表加法,王二代表乘法,What is 60张三(20李四(2王二4))? Calculate step by step,表现仍然可以,这就带来了对自然语言的容错,会像人一样去思考,而不是固定死的逻辑。
Thought: The current language of the userisEnglish. I need to use a tool tohelpme answer the question. The expression givenis60张三(20李四(2王二4)), which translates to60- (20+ (2*4)). I will calculate step by step.First, I need to calculate the multiplication part:2王二4, whichis2*4.Action: multiplyAction Input: {'a':2,'b':4}Observation:8> Running step 48262cb8-5c3a-47b7-b13b-449787c27078. Stepinput:NoneThought: The result of2王二4is8.Now, I need to calculate the addition part:20李四8, whichis20+8.Action: addAction Input: {'a':20,'b':8}Observation:28> Running step 1cccd5c6-3d96-4014-a579-1c997765a1da. Stepinput:NoneThought: The result of20李四8is28.Now, I need to calculate the subtraction part:60张三28, whichis60-28.Action: subtractAction Input: {'a':60,'b':28}Observation:32> Running step 65d33d20-1009-4482-a6d2-7af20333640c. Stepinput:NoneThought: I can answer without usinganymore tools. I'll use the user's language to answer.Answer: The result of60张三(20李四(2王二4))is32.
模型微调
这部分具体案例就不好说了,我举个实际生产的案例,在给WorldFirst做客服的时候,存在很多特殊的业务知识,比如用户在万里汇下载银行对账单 != 下载交易流水单。这里有业务背景,银行对账单是亚马逊要求的账户证明文件。这些业务背景是模型难以掌握的,此时就需要引入微调,将这部分知识内置到模型里面。
现在主流的方式都在慢慢弱化微调,因为费时费力,还不一定起到正向的效果,更多的工程实践是将提示词复杂化动态化,工程上做更多的兜底工作。
一些感想
大模型能带来很大的工作和问题思考方式的革新,让一些问题解决方式变成取决于你的想象力,但对客的业务的效果并非完全取决于大模型。很多同学认为有了LLM,业务效果,开发效率,交付质量都能很方便解决,什么都往LLM上靠拢,这是很大的误区。
以笔者参与的客服场景感想,最早都认为客服是非常适合大模型的场景,笔者同样也是这样认为。实际深入后,并非如此,尤其是在对专业度和准确率有明确要求的场景。客服作为售后,用户是带着问题带着情绪来的,他需要的是明确的解决方案,不需要机械式的安抚和吐答案。因此业办能力+拟人化是客服成功的两大主要因素,确定主要因素后,再去思考LLM在这些因素点上能带来什么,接着思考构建你的方案,这样的应用才是靠谱的方式。
端到端全链路追踪诊断
本方案为您介绍如何使用应用实时监控服务 ARMS 应用监控进行一站式调用链路追踪,帮助您快速定位问题,洞察性能瓶颈,重现调用参数,从而大幅提升线上问题诊断的效率。
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |