利用Prompt工程为LLM提升推理能力

news2024/11/28 13:26:57

利用Prompt工程为LLM提升推理能力

  • 基于策略的推理详解
  • ReAct: 推理与行动
  • 思维链:逐步解决问题
  • 反思:深入分析和自我审查
  • 与代理架构的集成
  • 实际应用
  • 代码附录

众所周知,一个精心设计的Prompt能够显著增强大型语言模型(LLMs)的推理能力,助力AI应用更高效地解决实际问题。本文将深入探讨如何通过有效的Prompt工程技术,实现这一目标。【⭐文章结尾附全部代码⭐】

有效的Prompt工程技术对于帮助大型语言模型(LLMs)产生更可靠、结构化且推理严谨的回答至关重要。通常,这些Prompt技术都是基于以下几个关键原则写出来的:

  • 任务分解:将复杂任务细分为更小、更易管理的步骤,帮助LLMs更系统地进行信息处理,减少错误,提升逻辑一致性。
  • 清晰格式:制定明确的输出结构,引导LLMs有序组织思路,以更易懂的方式呈现信息。
  • 自我反思:鼓励LLMs回顾自身推理过程,有助于发现潜在错误,考量多元观点。
  • 情境模拟:设定特定框架,如“利弊分析”或“多角度考量”,助力模型从不同维度解决问题。

这些原则构成了我们编写Prompt的基石,每种策略都充分发挥了LLMs的不同能力,确保回答的一致性和可靠性。

基于策略的推理详解

虽然白板的LLM也可以直接处理任务,但是要是想让LLM有高级推理能力的话,就需要设计结构化的解决问题方法。为此,我们首先定义了一个策略模式父类,进而派生出多种推理策略。接下来,让我们一探究竟:

class ExecutionStrategy(ABC):
    @abstractmethod
    def build_prompt(self, task: str, instruction: Optional[str] = None) -> str:
        """Build the prompt according to the strategy."""
        pass
 
    @abstractmethod
    def process_response(self, response: str) -> str:
        """Process the LLM response according to the strategy."""
        pass

这个抽象的父类为实现各种推理策略提供了基础。每种策略都提供了一种独特的方法来:

  • 构建问题解决过程;
  • 分解复杂任务;
  • 组织代理的思考过程;
  • 确保对问题进行彻底考虑。

下面让我们更深入地看看三种不同的技术:ReAct、思维链和反思。

ReAct: 推理与行动

ReAct策略(Reasoning和Action)实现了一个思考、行动和观察三个行为的循环执行,这样可以使LLM的决策过程变得清晰且可追溯。下面是实现代码:

class ReactStrategy(ExecutionStrategy):
    def build_prompt(self, task: str, instruction: Optional[str] = None) -> str:
        base_prompt = """Approach this task using the following steps:
1) Thought: Analyze what needs to be done
2) Action: Decide on the next action
3) Observation: Observe the result
4) Repeat until task is complete
 
Follow this format for your response:
Thought: [Your reasoning about the current situation]
Action: [The action you decide to take]
Observation: [What you observe after the action]
... (continue steps as needed)
Final Answer: [Your final response to the task]
 
Task: {task}"""

这个策略确保了:

  • 明确推理:每一步思考过程都表达得清晰明了。
  • 行动导向:决策与具体行动紧密相连。
  • 迭代优化:通过循环观察和调整,逐步完善解决方案。

思维链:逐步解决问题

思维链策略将复杂问题分解成可管理的步骤,使推理过程更加透明和可验证。下面是它的工作原理:

class ChainOfThoughtStrategy(ExecutionStrategy):
    def build_prompt(self, task: str, instruction: Optional[str] = None) -> str:
        base_prompt = """Let's solve this step by step:
 
Task: {task}
 
Please break down your thinking into clear steps:
1) First, ...
2) Then, ...
(continue with your step-by-step reasoning)
 
Final Answer: [Your conclusion based on the above reasoning]"""

这种方法提供了:

  • 线性进展:通过步骤化推进复杂问题。
  • 清晰联系:步骤与结论之间逻辑清晰。
  • 易于验证:推理过程更简单易懂。
  • 深度理解:更好地把握结论的来龙去脉。

反思:深入分析和自我审查

反思策略增加了一个元认知层,鼓励代理检查自己的假设并考虑替代方法。代码如下:

class ReflectionStrategy(ExecutionStrategy):
    def build_prompt(self, task: str, instruction: Optional[str] = None) -> str:
        base_prompt = """Complete this task using reflection:
 
Task: {task}
 
1) Initial Approach:
   - What is your first impression of how to solve this?
   - What assumptions are you making?
 
2) Analysis:
   - What could go wrong with your initial approach?
   - What alternative approaches could you consider?
 
3) Refined Solution:
   - Based on your reflection, what is the best approach?
   - Why is this approach better than the alternatives?"""

与代理架构的集成

这些策略通过工厂模式和策略设置器,与代理架构实现了无缝集成。

class Agent:
    @property
    def strategy(self) -> Optional[ExecutionStrategy]:
        return self._strategy
 
    @strategy.setter
    def strategy(self, strategy_name: str):
        """Set the execution strategy by name."""
        self._strategy = StrategyFactory.create_strategy(strategy_name)

执行流程包含了所选策略:

def execute(self, task: Optional[str] = None) -> str:
        if task is not None:
            self._task = task
        
        messages = self._build_messages()
        
        try:
            response = client.chat.completions.create(
                model=self._model,
                messages=messages
            )
            
            response_content = response.choices[0].message.content
            
            # Process response through strategy if set
            if self._strategy:
                response_content = self._strategy.process_response(response_content)

实际应用

下面以一个实际的例子,展示如何在实际中使用这些策略:

task = """一位同学想成为全职剧本杀DM,他有如下限制条件:

        预算:100元
        限时:10天
        他们应该如何完成这个白日梦?"""

print("\n===ReAct Strategy ===")
agent.strategy = "ReactStrategy"
agent.task = task
response = agent.execute()
print("\nResponse:")
print(response)

print("\n===Chain of Thought Strategy ===")
agent.strategy = "ChainOfThoughtStrategy"
agent.task = task
response = agent.execute()
print("\nResponse:")
print(response)

print("\n===Reflection Strategy ===")
agent.strategy = "ReflectionStrategy"
agent.task = task
response = agent.execute()
print("\nResponse:")
print(response)

三种策略的效果如下所示:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在实际应用中,这些策略展现了显著优势:

  • 灵活选择:针对不同任务,灵活选用适宜的推理方法。
  • 一致格式:无论采用何种策略,输出都保持结构化。
  • 清晰路径:问题解决过程记录透明,易于追踪。
  • 策略对比:方便评估同一问题的不同解决方法。

代码附录

from abc import abstractmethod, ABC
from typing import Optional, List, Dict

from openai import OpenAI


class ExecutionStrategy(ABC):
    @abstractmethod
    def build_prompt(self, task: str, instruction: Optional[str] = None) -> str:
        """Build the prompt according to the strategy."""
        pass

    @abstractmethod
    def process_response(self, response: str) -> str:
        """Process the LLM response according to the strategy."""
        pass


class ReactStrategy(ExecutionStrategy):
    def build_prompt(self, task: str, instruction: Optional[str] = None) -> str:
        base_prompt = """Approach this task using the following steps:
                        1) Thought: Analyze what needs to be done
                        2) Action: Decide on the next action
                        3) Observation: Observe the result
                        4) Repeat until task is complete
                        
                        Follow this format for your response:
                        Thought: [Your reasoning about the current situation]
                        Action: [The action you decide to take]
                        Observation: [What you observe after the action]
                        ... (continue steps as needed)
                        Final Answer: [Your final response to the task]
                        
                        Task: {task}"""
        if instruction:
            base_prompt += f"\nAdditional Instruction: {instruction}"

        return base_prompt.format(task=task)

    def process_response(self, response: str) -> str:
        """Process the LLM response according to the strategy."""
        return response


class ChainOfThoughtStrategy(ExecutionStrategy):
    def build_prompt(self, task: str, instruction: Optional[str] = None) -> str:
        base_prompt = """Let's solve this step by step:

                        Task: {task}
                        
                        Please break down your thinking into clear steps:
                        1) First, ...
                        2) Then, ...
                        (continue with your step-by-step reasoning)
                        
                        Final Answer: [Your conclusion based on the above reasoning]"""
        if instruction:
            base_prompt += f"\nAdditional Instruction: {instruction}"

        return base_prompt.format(task=task)

    def process_response(self, response: str) -> str:
        """Process the LLM response according to the strategy."""
        return response


class ReflectionStrategy(ExecutionStrategy):
    def build_prompt(self, task: str, instruction: Optional[str] = None) -> str:
        base_prompt = """Complete this task using reflection:

                        Task: {task}
                        
                        1) Initial Approach:
                           - What is your first impression of how to solve this?
                           - What assumptions are you making?
                        
                        2) Analysis:
                           - What could go wrong with your initial approach?
                           - What alternative approaches could you consider?
                        
                        3) Refined Solution:
                           - Based on your reflection, what is the best approach?
                           - Why is this approach better than the alternatives?"""
        if instruction:
            base_prompt += f"\nAdditional Instruction: {instruction}"

        return base_prompt.format(task=task)

    def process_response(self, response: str) -> str:
        """Process the LLM response according to the strategy."""
        return response


class StrategyFactory:
    """Factory class for creating execution strategies."""

    _strategies = {
        'ReactStrategy': ReactStrategy,
        'ChainOfThoughtStrategy': ChainOfThoughtStrategy,
        'ReflectionStrategy': ReflectionStrategy
    }

    @classmethod
    def create_strategy(cls, strategy_name: str) -> ExecutionStrategy:
        """Create a strategy instance based on the strategy name."""
        strategy_class = cls._strategies.get(strategy_name)
        if not strategy_class:
            raise ValueError(f"Unknown strategy: {strategy_name}")
        return strategy_class()

    @classmethod
    def available_strategies(cls) -> List[str]:
        """Return a list of available strategy names."""
        return list(cls._strategies.keys())


class Agent:
    def __init__(self, name: str, system_prompt: str, instruction: str, api_key: str, url: str, model_name: str):
        self.task = None
        self.name = name
        self.system_prompt = system_prompt
        self.instruction = instruction
        self._strategy = None
        self.model_name = model_name
        self.client = OpenAI(
            api_key=api_key,
            base_url=url
        )

    @property
    def strategy(self) -> Optional[ExecutionStrategy]:
        return self._strategy

    @strategy.setter
    def strategy(self, strategy_name: str):
        """Set the execution strategy by name."""
        self._strategy = StrategyFactory.create_strategy(strategy_name)

    def execute(self, task: Optional[str] = None) -> str:
        if task is not None:
            self.task = task

        messages = self._build_messages()

        try:
            completion = self.client.chat.completions.create(
                model=self.model_name,
                messages=messages
            )

            response_content = completion.choices[0].message.content

            if self._strategy:
                response_content = self._strategy.process_response(response_content)

            return response_content
        except Exception as e:
            return f"An error occurred: {str(e)}"

    def _build_messages(self) -> List[Dict[str, str]]:
        messages = [{"role": "system", "content": self.system_prompt}]

        if self.instruction:
            messages.append({
                "role": "user",
                "content": f"Global Instruction: {self.instruction}"
            })

        current_task = self._strategy.build_prompt(self.task, self.instruction)

        if current_task:
            messages.append({"role": "user", "content": current_task})

        return messages


system_prompt = """你是一个分析解决问题的助手。你擅长分解复杂的问题并解释你的思维过程。你的解释透彻、有逻辑、清晰。"""
instruction = "确保你的回答清晰、详细、结构合理。始终保持以中文回答。"
url = "https://open.bigmodel.cn/api/paas/v4/"
api_key = "xxx"

agent = Agent(
    name="难题粉碎机",
    system_prompt=system_prompt,
    instruction=instruction,
    api_key=api_key,
    url=url,
    model_name="glm-4-flash"
)

task = """一位同学想成为全职剧本杀DM,他有如下限制条件:

        预算:100元
        限时:10天
        他们应该如何完成这个白日梦?"""

print("\n===ReAct Strategy ===")
agent.strategy = "ReactStrategy"
agent.task = task
response = agent.execute()
print("\nResponse:")
print(response)

print("\n===Chain of Thought Strategy ===")
agent.strategy = "ChainOfThoughtStrategy"
agent.task = task
response = agent.execute()
print("\nResponse:")
print(response)

print("\n===Reflection Strategy ===")
agent.strategy = "ReflectionStrategy"
agent.task = task
response = agent.execute()
print("\nResponse:")
print(response)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2249088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C++ 核心编程]笔记 4.1 封装

4.1.1 封装的意义 封装是C面向对象三大特性之一 封装的意义: 将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制 封装意义一: 在设计类的时候,属性和行为写在一起,表现事物 语法: class 类名{ 访问权限: 属性 /行为 }…

基于Qt实现的自定义树结构容器:设计与应用

在Qt框架中,尽管其提供了许多强大的容器类(如 QList, QMap, QTreeWidget 等),但缺少一个通用的、灵活的树结构容器,直接支持多层级数据管理。为了满足这些需求,本文设计并实现了一个可复用的自定义树结构容…

Web登录页面设计

记录第一个前端界面,暑假期间写的,用了Lottie动画和canvas标签做动画,登录和注册也连接了数据库。 图片是从网上找的,如有侵权私信我删除,谢谢啦~

钟睒睒的“傲慢与偏见”

文章内容根据网络内容整理形成 最近,钟睒睒关于绿瓶水不适合长期饮用的言论,在网上引起了一番新的热议,让刚平静不久的包装饮用水竞争,再次掀起一阵波澜,同时,其对于企业家直播带货的等系列看法&#xff0c…

【ArcGISPro】使用AI提取要素-土地分类(sentinel2)

Sentinel2数据处理 【ArcGISPro】Sentinel-2数据处理-CSDN博客 土地覆盖类型分类 处理结果

【技术文档:技术传播的灯塔】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Qt-系统相关(2)多线程网络

Qt多线程 在 Qt 中,多线程的处理⼀般是通过 QThread类 来实现。 QThread 代表⼀个在应⽤程序中可以独⽴控制的线程,也可以和进程中的其他线程共享数据。 QThread 对象管理程序中的⼀个控制线程。 QThread 常⽤ API: 使用线程 关于创建线程…

永久免费使用最好的Markdown编辑器——Typora

介绍 Typora 是一款轻量级的 Markdown 编辑器,其最为出众的特点是: 所见即所得。 Typora 于2021年11月23日推出了第一个正式版,并转为收费。不过价格也算合理,89元/3台设备,为一次买断制。 直到2022年年中&#xff0…

Linux环境实现c语言编程

Linux环境实现c语言编程 准备工作 准备一台Linux虚拟机/机器 操作流程 打开Linux机器 打开终端 查看是否有GCC编译器 GCC是什么 GCC是GNU编译器集合(GNU Compiler Collection)的简称。它是一套免费的开源编程语言编译器,支持多种编程语…

VTK中对于相机camera的设置

1. 相机的核心属性 在 VTK 中,vtkCamera 的核心属性有默认值。如果你不设置这些属性,相机会使用默认值来渲染场景。 Position(默认值:(0, 0, 1)): 默认情况下,相机位于 Z 轴正方向的 (0, 0, 1)…

glog在vs2022 hello world中使用

准备工作 设置dns为阿里云dns 223.5.5.5,下载cmake,vs2022,git git clone https://github.com/google/glog.git cd glog mkdir build cd build cmake .. 拷贝文件 新建hello world并设置 设置预处理器增加GLOG_USE_GLOG_EXPORT;GLOG_NO_AB…

Python开发环境搭建+conda管理环境

下载Miniconda 推荐从清华镜像下载安装包 Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 打开网页后,下拉到最后找到Miniconda3-latest前缀的文件,或者网页中直接搜索Miniconda3-latest,都可以找…

深度学习:GPT-2的MindSpore实践

GPT-2简介 GPT-2是一个由OpenAI于2019年提出的自回归语言模型。与GPT-1相比,仍基于Transformer Decoder架构,但是做出了一定改进。 模型规格上: GPT-1有117M参数,为下游微调任务提供预训练模型。 GPT-2显著增加了模型规模&…

C++设计模式-策略模式-StrategyMethod

动机(Motivation) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。 如何在运…

Harbor安装、HTTPS配置、修改端口后不可访问?

Harbor安装、HTTPS配置、修改端口后不可访问? 大家好,我是秋意零。今天分享Harbor相关内容,安装部分可完全参考官方文档,写的也比较详细。 安装Harbor 官方文档:https://goharbor.io/docs/2.12.0/install-config/ …

DMS2024|思腾合力受邀参加第二届CCF数字医学大会

随着人工智能技术的不断进步,其在医学领域的应用日益广泛。从医学影像分析、疾病诊断到个性化治疗方案设计,人工智能正在逐步改变传统的医疗模式。未来,数字医学将更加注重数据的整合与挖掘,推动医学研究的深入与创新。 2024年11…

Python 绘制 向量减法

Python 绘制 向量减法 flyfish import matplotlib.pyplot as plt# 向量数据 a [1, 2] b [3, 2]# 计算-a 和 a-b minus_b [-x for x in b] # 反转向量b得到-b a_minus_b [a[i] minus_b[i] for i in range(2)] # 计算a - b# 绘制原点 plt.plot([0], [0], ko) # 黑色圆点…

工作坊报名|使用 TEN 与 Azure,探索你的多模态交互新场景

GPT-4o Realtime API 发布,语音 AI 技术正在进入一场新的爆发。语音AI技术的实时语音和视觉互动能力将为我们带来更多全新创意和应用场景。 实时音频交互: 允许应用程序实时接收并响应语音和文本输入。自然语音生成: 减少 AI 技术生成的语音…

node.js基础学习-http模块-创建HTTP服务器、客户端(一)

http模块式Node.js内置的模块,用于创建和管理HTTP服务器。Node.js使用JavaScript实现,因此性能更好。 使用http模块创建服务器,我们建议使用commonjs模块规范,因为很多第三方的组件都使用了这种规范。当然es6写法也支持。 下面就是…

黑马程序员Java项目实战《苍穹外卖》Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示: ​ 管理端-外卖商家使用 ​ 用户端-点餐用户使用 当我们完成该项目的学习,可以培养以下能力: 1. 软件开发整体介绍 作为一…