我会介绍的模型思维方式包括这些: direct prompting -> Instruction Prompting -> COT-Let's think step by step -> COT-Plan & Solve Agent -> COT- self-ask -> ReAct -> Self-Refine&Reflexion -> Self-Consistency ->Tree of Thoughts -> Graph of Thoughts
这些内容太令人兴奋,我会根据不同的模型结合coze、dify、大模型接口等方式演示这些模型思维的使用方式。
然后最终我将使用思维树(TOT)构建一个智能体模型,然后将代码开源出来。敬请期待哦,0.0 哈哈。可以提前关注我博客和github:github.com/astordu
因为这次我要把这个模型思维的演化过程讲透。我还得做个项目出来,所以文章篇幅会较长。 我们就分开4️部分来讲:
- 模型自己的思考、反思和改进:direct prompting -> Instruction Prompting -> COT-Let's think step by step -> COT-Plan & Solve Agent -> COT- self-ask
- Agent的构建,将function call整合进去,并结合模型的反思和改进能力,可以开始构建智能体了: ReAct -> Self-Refine&Reflexion
- 多思维链构建,让智能体从多角度思考问题并解决复杂问题,包括:Tree of Thoughts -> Graph of Thoughts
- 思维树项目实战,带你从实战方面,考虑如何构建TOT,并且整合这些思维模块Planner,Reasoner,Evaluator,Function call,Memory等
模型真正的价值
使用模型真正的价值在于以下两点:
1.使用模型的思考能力,更好的思考才能带来更好的答案。
2.把准确资料给到模型,让模型消除幻象,让回答有据可依。
我们的文章着重第一点,现在咱们开始研究模型思维了。 let's go。
思考方式的演进
直接问答(Direct Prompting)
直接和模型对话,输入你提问的问题。 一般不能直接解决你的问题,因为给到LLM的背景信息(即上下文信息)太少了。 你需要反复的和模型交互,用于日常的一些聊天还可以,其他的都不行。
这里边需要注意: 你不能直接把模型当知识库用呀,它告诉你的不一定是对的,因为有可能是胡说的。 如果你真要用它当作知识库,最佳用法是:找一个像kimi这种能上网搜索并回答你问题的软件(小程序就可以)。
如果你就是聊天解闷的话,下载一个"豆包"就可以。
单这种随意聊天的方式,不怎么能解决实际的工作复杂问题。因为指令太随意了。
我们得把指令精修一下。所以来看:提示语工程。
提示语工程(Instruction Prompting)
这部分是指通过几个方面把我们的问题背景描述清楚,并且指明要输出的格式要求。
openai推出了一个提示语工程手册[1],手册大概描写了如何向模型提问的6个策略:
lua
1.提供更详细的问题背景信息
2.让模型扮演一个角色
3.用分隔符,清晰的表达不同部分的逻辑
4.如果是复杂问题,给他个拆解步骤,让它按步骤执行
5.提供一些输入input和输出output的例子
6.指定输出的格式(比如json格式等)
其中第一点,就是补充system与user的角色的信息: 可以理解system是场景设置:一些全局的信息,不如说此对话的目标要解决的问题是什么。 user则是在这个场景下用户提出的问题是什么
其中第六点,则是我们熟知的few-shot(就是给它几个例子),这部分则让模型理解我们上边描述的所有说明,比如:
systemt提示语:
makefile
你是一个售后客服人员,你的任务是将用户的问题分类进行分类。只输出分类的名称。
一共有三个分类:退货问题,保修问题,退款问题。
Example1:
user:我想退掉我买的毛衣
assitant:退货问题
Example2:
user:我刚买的手表还不到1年就坏了
assitant:保修问题
其中Example1和Example2部分就是few shot,它让模型"学习"到了应该如何思考和回复。
使用提示语工程,我们可以解决很多复杂的问题了,比如:
- 数据的萃取:从文本中,提取人物信息,地点信息,关系信息等
- 把论文进行合理的总结,加快我们的阅读筛选速度
- 将格式做合理转换,比如:java接口直接转成文档。 。。。
一切关于文本处理的事情,通过提示语工程手册,大部分都能实现。
但是它最大的问题就是:整合提示语的工作都是你自己做的。需要慢慢调整和耐心。而且有时候它欠缺思考,也会给你错误的答案。
我们想要模型除了听从我们的指令外,还能自己也多思考思考,然后能给我们更准确的答案。 所以,下一步:希望模型能有点思考能力。
思维链(COT-Let's think step by step)
前边的两种方法都是通过人工补充背景信息(上下文)的方式指导模型更好的解决我们的问题。但其实很少用到模型的思考能力,我们也更希望可以使用到模型自己的推理和思考能力。
最简单的方式是在提示语中增加:让我们仔细一步一步的思考用户这个问题。就会让模型思考的更多,也会改善我们答案的准确程度。
论文中给到的案例是如上图所示,为了更好的理解,我们自己构建一个事例来展现使用它的方式。
我们使用客服人员对用户问题进行分类的案例。
不加思考的提示语如下:
arduino
你是一个售后客服人员,你的任务是将用户的问题分类进行分类。 一共有三个分类:退货问题,保修问题,退款问题。
用户的问题:"我裤子坏了我要退钱"
增加让模型思考的提示语如下:
arduino
你是一个售后客服人员,你的任务是将用户的问题分类进行分类。
一共有三个分类:退货问题,保修问题,退款问题。
用户的问题:"我裤子坏了我要退钱"
让我们仔细一步一步的思考用户这个问题
可以看到模型使用了更多的推理和思考能力,只是在提示语中增加了"让我们仔细一步一步的思考用户这个问题",
这种方法的问题在于每个模型都是按照模型自己的理解进行"一步步思考和分析"的。没有什么规律可循。
比如下边是GLM模型:
这两个模型(DeepSeek和GLM)都进行了一步步思考,但是思考的逻辑都不怎么一样。都是走一步看一步的。而且对同一个问题,每一次的一步步思考也是很不一样的。
思维链(COT-Plan & Solve Agent)
我们希望模型能按照我们的思考框架来解决问题:
- 先制定一个分析问题的计划
- 然后逐个解决问题
这样做的好处是:减少了模型思考的随机性,并且提升了模型的思考水平。(因为是先从全局看问题,也就是设计一个分析问题的计划。然后在逐个子问题的突破:逐个解决子问题)
提示语如下:
arduino
你是一个售后客服人员,你的任务是将用户的问题分类进行分类。
一共有三个分类:退货问题,保修问题,退款问题。
用户的问题:"我裤子坏了我要退钱"
按照如下方式解决这个问题:
1.我们要先理解问题,并制定一个判断这个问题分类的计划。
2.一步步的执行这个计划,最终判断用户的问题属于那个分类问题:退货问题,保修问题,退款问题。
解决问题的方式就是先制定计划然后在逐一执行计划,得到最终答案:
markdown
按照如下方式解决这个问题:
1.我们要先理解问题,并制定一个判断这个问题分类的计划。
2.一步步的执行这个计划,最终判断用户的问题属于那个分类问题:退货问题,保修问题,退款问题。
这样一来,我们已经使用上了模型的规划和思考推理能力,但它更像是一个粗略的方案(总计划和执行),而我更希望模型能按照一定的思考顺序帮我解决问题。最好还有一些自我思考能力。
思维链(COT- self-ask)
我们可以结合提示语工程的few-shot,让它先思考是否需要有子问题,如果有,再提出子问题,然后再陆续回答子问题,直到问题完全解决。
我们的案例是使用Dify进行构建的,给了模型一些思考方式,希望它按照我们这样的思考方式进行思考和回答问题:
makefile
user:奥巴马与特朗普谁先当的美国总统
assistant:
需要思考一些子问题吗:需要
子问题:奥巴马是什么时候当选的美国总统?
思考的答案:奥巴马是2009当选的美国总统
需要思考一些子问题吗:需要
子问题:特朗普是什么时候当选的美国总统?
思考的答案:特朗普是2016当选的美国总统
最终答案是:奥巴马先当的美国总统
搞定提示词之后,我们测试了一个问题:"字节,阿里,百度,腾讯谁成立的时间最早?" 它完全按照我们的思考方式进行了思考和回答:
小结
- 简单玩玩,其他的不行:direct prompting
- 自己好好写提示词,能解决很多问题,但是少了一些思考、反思和推理:Instruction Prompting
- 增加了推理能力:COT-Let's think step by step
- 尝试让推理有有规划,按照我们的想法思考:COT-Plan & Solve Agent
- 增加了自我反思的能力: COT- self-ask
(文章都属于原创,来自"雷哥AI工程化"。 如果对你有帮助,帮我点赞、转发。这将是我最大的动力。万分感谢!!)