首页 > 其他分享 >使用Code-Like Prompt重构ReAct

使用Code-Like Prompt重构ReAct

时间:2024-09-12 19:13:03浏览次数:1  
标签:search Code Prompt Like question thought str query name

ReAct的主要就是备用来调用函数, 现在给出一个使用Code-Like的Prompt, 同样支持外部函数调用

稍微修改一下choose_action, 应该就可以实现一次性调用多个外部工具.

支持Json返回, 而且返回很稳定.

ReAct in Code-Like

# you are a process, follow the code.

import json
from typing import (
    Dict,
    Any,
    List,
    Callable,
)

from llm.core import (
    input,
    output,
    think,
    choose,
    check_and_fix,
)

from llm.tools import remove_code_block


def quark_search(search_query: str) -> str:
    """
    夸克搜索功能

    search_query: str - 搜索关键词或短语

    Response:
    str - 搜索结果摘要
    """
    pass


def image_gen(query: str) -> str:
    """
    生成图像, 给出描述的文本, 生成对应的图像

    query: str - 中文关键词,描述了希望图像具有什么内容

    Response:
    str - 生成图像的URL
    """
    pass


tools: Dict[str, Callable] = {
    "quark_search": quark_search,
    "image_gen": image_gen
}


def next_thought(query: str, steps: [str], tools: Dict[str, Callable] ) -> str:
    """
    思考下一步行动
    Args:
        query: question
        steps: list of step, like:
            [
                "Question: {the input question you must answer}",
                "Thought: {you should always think about what to do",
                "Action: {the action to take and parameters}, must be one of tools",
                "Observation: {the result of the action}",
                ...
            ]
        actions:
            dict of action name and function
    Returns:
        str - base on the query, steps, actions, answer what is next key question to solve
        for example:
         1. "i need to know what is {keyword}?"
         2. if you can get the final answer, you can return "Final Answer: `result`"
    """
    tmps = []
    for i in range(5):
        think(query, steps, tools)
    # choose best response for query from tmps
    return choose(tmps, question=query)

def deepthink(query: str):
    """
    深度思考query, 原理是迭代调用think函数5次, 选择最佳的回答, 并且返回该回答
    """
    tmps = []
    for i in range(5):
        tmps.append(think(query))
    # choose best response for query from tmps
    return choose(tmps, question=query)

def choose_action(query: str) -> (str, dict):
    function_name, parameters = deepthink(query)
    if function_name not in tools:
        raise
    parameter_dict = check_and_fix(parameters, description="a python dict which can call function in **parameters")
    return function_name, parameter_dict


steps: List[str] = [

]


def react_agent(question: str) -> str:
    """
    用于回答问题和执行操作

    question: str - 用户输入的问题

    Response:
    str - 处理过程和最终答案
    """

    while True:
        # 思考下一步行动
        thought = next_thought(question, steps, tools)

        # 如果已经知道最终答案,则结束循环
        if "Final Answer" in thought:
            return thought
        else:
            steps.append(f"Thought: {thought}")

        # 决定行动并执行
        function_name, parameters_dict = choose_action(thought)
        j = {
            "thought": thought,
            "action": {
                "name": f"{function_name}",
                "parameters": parameters_dict
            }
        }
        return json.dumps(j)


# only do this
if __name__ == "__main__":
    user_question = "什么狗屁不通现象?"
    result = react_agent(user_question)
    result = remove_code_block(result)
    output(result)

效果

使用DeepSeek, 温度设为0.5, 其他没有限制

返回内容

{
    "thought": "我需要知道什么是狗屁不通现象?",
    "action": {
        "name": "quark_search",
        "parameters": {
            "search_query": "狗屁不通现象"
        }
    }
}

完整对话:

# ReAct

## 1. output

**system**: 

‍‍```
# you are a process, follow the code.

import json
from typing import (
    Dict,
    Any,
    List,
    Callable,
)

from llm.core import (
    input,
    output,
    think,
    choose,
    check_and_fix,
)

from llm.tools import remove_code_block


def quark_search(search_query: str) -> str:
    """
    夸克搜索功能

    search_query: str - 搜索关键词或短语

    Response:
    str - 搜索结果摘要
    """
    pass


def image_gen(query: str) -> str:
    """
    生成图像, 给出描述的文本, 生成对应的图像

    query: str - 中文关键词,描述了希望图像具有什么内容

    Response:
    str - 生成图像的URL
    """
    pass


tools: Dict[str, Callable] = {
    "quark_search": quark_search,
    "image_gen": image_gen
}


def next_thought(query: str, steps: [str], tools: Dict[str, Callable] ) -> str:
    """
    思考下一步行动
    Args:
        query: question
        steps: list of step, like:
            [
                "Question: {the input question you must answer}",
                "Thought: {you should always think about what to do",
                "Action: {the action to take and parameters}, must be one of tools",
                "Observation: {the result of the action}",
                ...
            ]
        actions:
            dict of action name and function
    Returns:
        str - base on the query, steps, actions, answer what is next key question to solve
        for example:
         1. "i need to know what is {keyword}?"
         2. if you can get the final answer, you can return "Final Answer: `result`"
    """
    tmps = []
    for i in range(5):
        think(query, steps, tools)
    # choose best response for query from tmps
    return choose(tmps, question=query)

def deepthink(query: str):
    """
    深度思考query, 原理是迭代调用think函数5次, 选择最佳的回答, 并且返回该回答
    """
    tmps = []
    for i in range(5):
        tmps.append(think(query))
    # choose best response for query from tmps
    return choose(tmps, question=query)

def choose_action(query: str) -> (str, dict):
    function_name, parameters = deepthink(query)
    if function_name not in tools:
        raise
    parameter_dict = check_and_fix(parameters, description="a python dict which can call function in **parameters")
    return function_name, parameter_dict


steps: List[str] = [

]


def react_agent(question: str) -> str:
    """
    用于回答问题和执行操作

    question: str - 用户输入的问题

    Response:
    str - 处理过程和最终答案
    """

    while True:
        # 思考下一步行动
        thought = next_thought(question, steps, tools)

        # 如果已经知道最终答案,则结束循环
        if "Final Answer" in thought:
            return thought
        else:
            steps.append(f"Thought: {thought}")

        # 决定行动并执行
        function_name, parameters_dict = choose_action(thought)
        j = {
            "thought": thought,
            "action": {
                "name": f"{function_name}",
                "parameters": parameters_dict
            }
        }
        return json.dumps(j)


# only do this
if __name__ == "__main__":
    user_question = "什么狗屁不通现象?"
    result = react_agent(user_question)
    result = remove_code_block(result)
    output(result)
‍‍```

**user**: 

‍‍```
output
‍‍```

**assistant**: 

‍‍```

{
    "thought": "我需要知道什么是狗屁不通现象?",
    "action": {
        "name": "quark_search",
        "parameters": {
            "search_query": "狗屁不通现象"
        }
    }
}

‍‍```

解释

Tools

def quark_search(search_query: str) -> str:
    """
    夸克搜索功能

    search_query: str - 搜索关键词或短语

    Response:
    str - 搜索结果摘要
    """
    pass


def image_gen(query: str) -> str:
    """
    生成图像, 给出描述的文本, 生成对应的图像

    query: str - 中文关键词,描述了希望图像具有什么内容

    Response:
    str - 生成图像的URL
    """
    pass

以上就是Tools的注入, 可以直接写成一个函数定义, 非常的好用

next_thought

这函数还有很大的进步空间, 但是我已经不太想修改它了.

主要就是定义了Thought, 这一步应该是最影响效果的.

主要是结束最终的FinalAnswer, 这个需要好好设计一下.

我暂时没有心情去做, 回来补上再说

标签:search,Code,Prompt,Like,question,thought,str,query,name
From: https://www.cnblogs.com/pDJJq/p/18410880/use-codelike-prompt-to-reconstruct-react-z15etge

相关文章

  • 我的搬砖工具由 VS Code 变成 Cursor 了
    作者:老余捞鱼原创不易,转载请标明出处及原作者。写在前面的话:     本文介绍了我从VSCode转向Cursor的原因,强调了Cursor的人工智能交互流畅性以及其他一些优于VSCode的特性。    VSCode是免费的,而且运行起来非常出色。我一直很喜欢VS......
  • 像写代码一样写Prompt
    我称之为Code-likePromptLLMSelfPackage如果吧LLM打包成一个Package,那么他会有哪些能力呢?基本能力​input​:获取用户的输入​output​:Process后输出结果Core​generate_text​:生成文本内容​comprehend_text​:理解和解析文本​summarize​:生成文......
  • 【每日一题】LeetCode 2576.求出最多标记下标(贪心、数组、双指针、二分查找、排序)
    【每日一题】LeetCode2576.求出最多标记下标(贪心、数组、双指针、二分查找、排序)题目描述给定一个整数数组nums,数组下标从0开始。你需要执行以下操作,直到无法再执行为止:选择两个互不相同且未标记的下标i和j。满足条件2*nums[i]<=nums[j],则标记下标i和j。......
  • 使用 Visual Studio Code 配置 C/C++ 开发环境
    VisualStudioCode(简称VSCode)是一款非常流行的代码编辑器,提供了丰富的扩展和配置支持,使其成为进行C/C++开发的一款理想工具。本文将详细介绍如何在VSCode中配置C/C++开发环境,涵盖安装必要的工具和插件、编写简单的C/C++程序、配置调试环境等内容。更多内容一、安装......
  • PbootCMS附件上传失败报错UNKNOW: Code: 8192; Desc: stripos()
    在PBootCMS中遇到附件上传失败的报错 UNKNOW:Code:8192;Desc:stripos():Non-stringneedleswillbeinterpretedasstringsinthefuture.Useanexplicitchr()calltopreservethecurrentbehavior,这通常是因为PHP版本升级后某些函数的行为发生了变化。具体来说,st......
  • 010-BUG: org.springframework.cglib.core.CodeGenerationException: java.lang.refle
    参考:Unabletomakeprotectedfinaljava.lang.Classjava.lang.ClassLoader.defineClass-CSDN博客1.完整报错:"msg":"org.springframework.cglib.core.CodeGenerationException:java.lang.reflect.InaccessibleObjectException-->Unabletomakeprotect......
  • LeetCode_0224. 基本计算器,带括号和空格的加减法算式
    题目描述给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如eval()。示例1:输入:s="1+1"输出:2示例2:输入:s="2-1+2"输出:3示例3:输入:s="(1+(4+5+2)-3)+(6+8)"输出:23......
  • SQL.LeetCode(1321)餐馆营业额变化增长
    表: Customer+---------------+---------+|ColumnName|Type|+---------------+---------+|customer_id|int||name|varchar||visited_on|date||amount|int|+---------------+---------+在SQL中,(customer......
  • 爬楼梯(LeetCode)&冒泡和选择排序
    目录一、爬楼梯(LeetCode)1、题目2、代码二、冒泡排序三、选择排序一、爬楼梯(LeetCode)1、题目2、代码二、冒泡排序三、选择排序......
  • 【技巧】一个命令让VS code快速生成固定的代码片段
    比如我们经常使用固定的代码格式来生成代码片段。第一步,编写需要生成代码片段的代码,代码示例如下:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"&......