08阶段:大模型RAG开发

📅 2026/7/14 19:50:25
08阶段:大模型RAG开发
第二章 提示词工程2.1提示词工程学习目标● 了解什么是提示工程● 掌握提示工程的设计技巧1.基本概念●提示工程(Prompt Engineering)也称为In-Context Prompting是指在不更新模型权重的情况下如何与大模型交互以引导其行为以获得所需结果的方法。● 在人工智能领域Prompt指的是用户给大型语言模型发出的指令。例如“「讲个笑话」”、“「用Python编个贪吃蛇游戏」”、“「写封情书」等。虽然看似简单但实际上Prompt的设计对于模型的结果影响很大。因此如何设计prompt进而与模型更好的交互是研究人员必备的必不可少的技能(提示工程)。● 提示工程不仅仅是关于设计和研发提示词。它包含了与大语言模型交互和研发的各种技能和技术。提示工程在实现和大语言模型交互、对接以及理解大语言模型能力方面都起着重要作用。用户可以通过提示工程来提高大语言模型的安全性也可以赋能大语言模型比如借助专业领域知识和外部工具来增强大语言模型能力。2.提示工程的原则基于OpenAI官网文档我们提炼出了5条大原则1.清晰的指令2.文本参考3.负责任务拆分简单子任务4.给模型“思考”的时间5.借助外部工具【约束写提示词的人】接下来我们将对每一种具体的原理进行原理讲解以及举例实时以帮助我们在日常工作准确的使用LLM。2.1清晰的指令● 任何Promp技巧都不如清晰的表达你的需求。这就类似人与人沟通如果话说不明白不可能让别人理解你的思想。因此写出清晰的指令是核心。● 那么如何写出清晰的指令呢?下面罗列几个小技巧:2.1.1详细的描述● 当我们进行模型的提问时不要描述的太笼统而是尽量多的提供重要的详细信息或上下文eg:不要直接说帮我写一封情书;而是说:用一些温柔的话语写一封情书来表达我对你的仰慕和思念。最后我要求书写字体数要不低于500个字2.1.2让模型充当某个角色● 当我们使用大模型时可以让模型充当一个角色这样模型会更专业更明确的对你的问题进行回复Eg我需要你充当一个A算法面试官的角色要求你自主的对我进行A面试过程中常考的面试题你可以一次说一个问题然后我回答完你再出第二道题2.1.3使用分隔符标明输入的不同部分● 中括号、XML标签、三引号等分隔符可以帮助划分要区别对待的文本也可以帮助模型更好的理解文本内容。常用把内容框起来eg用20个字符总结由三引号分割的文本。在此插入文本2.1.4对任务指定步骤● 对于可以拆分的任务可以尽量拆开最好能为其指定一系列步骤明确步骤可以让模型更容易实现它们。eg:利用下面分步情况来响应用户的输入。步骤1:用户输入文本用一句话总结这段文本并加上前缀Summary步骤2:将步骤1中的摘要翻译成英语并添加前缀翻译:2.1.5提供例子● 本质类似于few-shot leaning。先扔给大模型举例然后让模型按照例子来输出eg按照这句评论文本的格式:用户输入文本帮我创造新的样本2.1.6指定输出长度● 可以要求模型生成给定目标长度的输出。目标输出长度可以根据单词、句子、段落、要点等的计数来指定。中文效果不明显同时你给定的长度只是个大概多少个字这种肯定会不精准但是像多少段这种效果相对较好eg:用三个段落、30个字符概括由三引号分隔的文本。在此插入你的文本2.2文本参考● 文本参考目的基于文本文档辅助大模型问答降低模型幻觉(一本正经的胡说八道)问题什么是幻觉?大模型回答用户的问题是不具备相关的知识(意味着训练数据中没有包含相关的知识)但是大模型是一个概率分布模型于是出现回答错误甚至答非所问的情况。2.2.1使用参考文本作答● 经典的知识库用法让大模型使用我们提供的信息来回答问题。请根据下面的内容回答用户的问题如果下面的内容不足以回答用户的问题请说“信息不足无法回答”。记住你不要随意回答用户的问题。 ### [上下文] ### [你的问题]2.3复杂任务拆分为简单子任务● 类似于人工如果你作为领导让下属一次性完成一个非常大的事那么出错的概率是很大的很多大项目也是这样你甚至无从下手。所以我们经常在工作中都要讲任务拆各种细节、子任务、子目标等等。大模型也是同样的道理。● 把复杂的任务给拆为更为简单的子任务大模型会有更好的表现。2.3.1对用户query进行意图识别● 意图识别是一个很经典的例子。比如在客服场景中用户问了一个问题“我断网了咋整”你让大模型直接回复其实是挺鸡肋的但是这时候就可以拆先拆大分类下的意图识别再回答具体类别的问题。● 步骤1先判断问题类别接下来将为您提供客户服务查询将每个查询分为主要类别和次要类别。提供jison格式的输出具体内容如下主要类别计费、技术支持、账户管理● 计费次要类别1.取消订阅2.条件付款方式3.收费说明4.对收费提出争议● 技术支持次要类别1.故障排除2.设备兼容性3.软件更新● 账户管理次要类别1.重置密码2.更新个人信息3.关闭帐户4.账户安全如果大模型根据步骤1知道“我断网了咋整是属于技术支持中的故障排除了我们可以继续第二个步骤● 步骤2根据类别在得到具体的解决方案您将收到需要在技术支持上下文中进行故障排除的客户服务查询。通过以下方式帮助用户要求他们检查与路由器相连的所有电缆是否连接。请注意随着时间的推移电缆常常会松动。如果所有电缆连接正常且问题仍然存在请询问他们使用的路由器型号。2.3.2处理长对话总结或过滤信息因为大模型都具有固定的上下文长度因此用户和模型之间的对话无法无限期地继续。解决此问题有多种解决方法● 第一个方法是总结之前的对话记录。一旦输入的大小达到预定的阈值长度模型就会自动把一部分内容进行总结● 另外一种办法就是在整个对话过程中让模型在背后不断地把对话内容进行总结。这就像你在读一本书的时候可能会时不时地在脑子里回顾一下之前的情节这样就不会忘记故事的主线● 还可以把过去的所有聊天记录存成向量库后续跟用户对话的时候动态查询嵌入2.3.3分段总结长文本并递归构建完整摘要类似于ChatGPT大模型是个有点像有记忆力限制的机器人他记住的东西长度有限。因此如果让他一口气读完一本非常长的书然后再总结他可能会记不住所有的内容。那怎么办呢?我们可以用一种“分段总结再汇总”的方法来解决这个问题。就好比你在学习很长的一篇文章或者一本书的时候你可能会先总结每一小节的内容然后再把这些小节的总结放在一起再做一次总结这样就能得到整个文章或者书的总结了。处理长对话和长文的基本方法基本是一样的总结前一部分的时候带上之前的内容。不同点是:有的长文章节之间关系较弱可以用分段总结再汇总的方法不用每次总结都带上之前的总结。2.4给模型思考的时间思维链(CoT Chain-of-Thought Prompting)是一种通过在提示中引导模型“逐步推理”来生成中间推理步骤从而提升其最终答案准确性的提示技术。它模仿人类解决问题的过程:不是直接给出答案而是先分析问题、列出关键信息、进行逻辑推导最后得出结论。核心思想● 不直接问答案而是要求模型“展示思考过程”。● 利用大模型强大的上下文学习能力在few-shot示例中示范“如何一步步思考”2.4.1引导模型在得出结论前生成自己的答案有时候我们希望ChatGPT能够在得出最终答案之前先生成一些自己的答案然后再进行选择和调整。这样可以引导模型思考问题并激发一些新的创意。● zero-shot的CoT问题:如果一个人每天喝 10升水这对健康有益吗? 回答:不一定。直接回答缺乏依据需要引导模型一步一步回答问题:如果一个人每天喝 10升水这对健康有益吗? 让我们一步一步地思考。 回答正常成年人每天建议饮水量约为2-3升。10 升远超肾脏处理能力可能导致水中毒(低钠血症)出现头痛、恶心甚至昏迷。因此每天喝 10升水对健康有害。答案:不有益● few-shot的CoTQ莉莉有 10支铅笔。她借给朋友3支又买了5支新铅笔。她现在有多少支铅笔? A莉莉一开始有 10 支铅笔。她借出3支后剩下 10-37支。然后她又买了5支所以现在有7 5 12支。答案是12。 Q汤姆存了20元花了8元买书又收到10元零花钱。他现在有多少钱? A汤姆最初有20元。花掉8元后剩下 20 - 8 12 元。加上10元零花钱总共 12 10 22 元。 答案是22。 Q艾米有5个苹果她吃了2个又买了4个。她现在有多少个苹果? A模型会模仿前面的推理格式输出攻米一开始有5个苹果。她吃了2个剩下 5 - 2 3 个。然后她又买了4个所以现在有 3 4 7 个。答案是 7。● 多跳问答(Multi-hop QA)问题谁是《哈利·波特》中赫敏·格兰杰最好的朋友的扮演者的丈夫?回答这个问题需要先明确1.赫敏·格兰杰最好的朋友是谁2.这位朋友在电影中由谁扮演3.这位演员的丈夫是谁?模型可能回答赫敏最好的朋友是哈利·波特。 哈利·波特由丹尼尔·雷德克里夫(Daniel Radcliffe)扮演。 但丹尼尔未婚..等等实际上赫敏在原著中与罗恩·韦斯莱是情侣而罗恩由鲁伯特·格林特(RupertGrint)扮 演。鲁伯特尚未结婚。 ......(此处模型可能出错但至少展示了推理路径)总结任务类型是否适合CoT原因简单事实问答(如“法国首都是哪里?”)❌️不必要直接回答更快更准数学/逻辑推理题✅️强烈推荐需要分步计算常识推理、因果推断✅️推荐避免跳跃性错误文本摘要、翻译❌️通常无效非推理型任务代码生成(带逻辑)✅️可结合如“先描述算法步骤再写代码”2.4.2隐藏推理过程只展示最终答案● 在某些情况下我们可能更关注最终答案而不是模型的推理过程。通过隐藏推理过程我们可以简化回答并使其更加直接和易于理解。用户:如何用Python反转一个字符串。要求:只需要输出代码不输出其它任何文字。 ChatGPT: string Hello, World! reversed_string string[::-1] print(reversed_string)2.4.3处理答案不完整的问题● 有时ChatGPT可能会生成一些不完整的回答缺少一些重要的细节或信息。在这种情况下我们可以通过补充细节或提供额外的信息来完善回答。用户JavaScript是世界上最好的语言吗?要求只需要回答最终结论。 ChatGPT没有绝对的最好的编程语言因为每种语言都有自己的优点和适用场景。不同的语言适用于不同的任务和需求。所以JavaScript并不是世界上最好的语言但它在Web开发中具有广泛的应用和强大的生态系统。 用户在前端开发中JavaScript是世界上最好的语言吗?要求只需要回答最终结论 ChatGPT在前端开发中JavaScript是最主要的语言并且具有广泛的应用和强大的生态系统。因此可以说在前端开发中JavaScript是世界上最好的语言之一。通过补充细节和提供额外的信息我们可以完善回答使其更加全面和有用。2.5借助外部工具大模型并不是万能的比如一些实时问题等等大模型不能很好的回答所以需要一些外部工具来帮助处理。接下来我们将学习如何使用外部工具来增强ChatGPT的功能。2.5.1基于嵌入(embedding)的搜索技术● 动态知识库比如我们向大模型提问如何评价马上要上映的电影《敢死队4》由于大模型的知识都是基于以往的经验得到的并不具备实时信息根本不知道《敢死队4》要上映了所以需要先去联网进行查询查完以后将资料进行整体让大模型根据自己查到的这些资料进行回答。这是动态的信息。● 静态知识库就是用的向量匹配的方式常见步骤加载文件-读取文本-文本分割-文本向量化-问句向量化-在文本向量中匹配出与问句向量最相似的topk个-匹配出的文本作为上下文和问题一起添加到promp中-提交给大模型生成回答。【后续实战应用讲解】query topK上下 → LLM → 回答2.5.2使用代码执行来进行更准确的计算或调用外部API一般情况大模型计算能力表现一般所以OpenA建议如果遇到需要计算的东西最好让大模型写一段计算的Python代码因为大模型对于Python等其他编程语言的计算题很成熟了。比如求以下多项式的所有实值根:3x^5-5x^4-3x^3-7x-10。您需要通过将Python代码括在三个反引号中来编写和执行例如代码放在这里。用它来执行计算。本节小结本章节主要讲解了关于Prompt Engineering的使用技巧重点要求掌握提示词的编写技巧以及优化的方法2.2接入商用大模型API目标● 掌握使用openai SDK接入商用平台大模型的方法百炼平台的API接入(阿里)1.完成登录注册● 进入阿里云的百炼大模型平台完成注册登录实名(使用支付宝扫一下)2.创建 API Key● 安装sdk测试代码# 如果运行失败您可以将pip替换成pip3再运行 pip install openai3.测试接口4.配置到环境变量5.代码封装总结大模型NLP任务实战项目第三章 基于大模型的RAGEduRAG扩展内容第四章 大模型智能体第五章 大模型微调