惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LINUX DO - 热门话题
Blog — PlanetScale
Blog — PlanetScale
博客园 - Franky
J
Java Code Geeks
腾讯CDC
博客园 - 聂微东
The Cloudflare Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
Last Week in AI
Last Week in AI
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Schneier on Security
C
CERT Recently Published Vulnerability Notes
Latest news
Latest news
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
有赞技术团队
有赞技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Securelist
AWS News Blog
AWS News Blog
GbyAI
GbyAI
L
LINUX DO - 最新话题
大猫的无限游戏
大猫的无限游戏
Forbes - Security
Forbes - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Attack and Defense Labs
Attack and Defense Labs
C
CXSECURITY Database RSS Feed - CXSecurity.com
Y
Y Combinator Blog
W
WeLiveSecurity
T
Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
P
Proofpoint News Feed
D
DataBreaches.Net
博客园 - 三生石上(FineUI控件)
V
V2EX
N
News and Events Feed by Topic
Google DeepMind News
Google DeepMind News
D
Docker
The Hacker News
The Hacker News
A
About on SuperTechFans
Security Latest
Security Latest
NISL@THU
NISL@THU
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
博客园_首页
H
Hacker News: Front Page

StudyingLover's Blog

Diffusion Policy笔记 rwkv笔记 act笔记 nanovllm-block_manager opencode多智能体 nanobot-pre-train nanobot-rl nanobot-sft nanobot-checkpoint_manager nanobot-gpt nanobot-mid-train Vision Mamba (Vim)笔记 BPE演示 最后一遍学习Transformer YOLOv5 目标检测笔记 下载根服务器解析记录 Dynaseal A Backend-Controlled LLM API Key Distribution Scheme with Constrained Invocation Parameters 判断链表有环 王道25数据结构勘误 关于perplexity的open-sourcing-r1-1776 AI为什么不像人类一样进行多轮对话 新博客改造日记和功能测试 linuxqq只显示登陆背景图 数字设计和计算机体系结构(机械工业出版社)勘误(自制) Dynaseal:面向未来端侧llm agent的llm api key分发机制 A Definitive Guide to Markdown Style This post is using MDX, Where you can embed JSX and Astro components RT-Patch学习 fastapi 和 uvicorn 设置监听 ipv6 pydantic+openai+json 控制大模型输出的最佳范式 解决 Matplotlib Scatter 不支持 Marker 列表的问题:mscatter 实现 roofline model zhipuAI接口兼容openai 在docker部署fastapi宝塔里使用nginx反代套上cloudflare获取请求的真实ip clion搭建libbpf-bootstrap开发环境 coze+coze-discord-proxy+ChatNextWebUI实现AI自由 安卓内核时间使用的是UTC时间 colab运行google最新开源模型Gemma Sora技术报告 视频生成模型作为世界模拟器 笔记 archlinux flutter开发踩坑 fastapi集成google auth登录 linux下NTFS磁盘报错输入输出错误 Venn-Abers 预测器 基于Venn-Abers预测器的系统日志异常检测方法_顾兆军 手机平板远程访问kvm虚拟机的windows phi-2弱智吧测评 poe的gemini pro或是百度开发 google gemini api使用 google gemini api申请 构建用于复杂数据处理的高效UDP服务器和客户端 matplotlib中文字体渲染 TruFor笔记和代码复现 深入分析:GitHub Trending 项目 "multipleWindow3dScene" pua大模型 ggml教程|mnist手写体识别量化推理 xgboost2.0最佳实践 xgboost使用GPU最佳实践 马踏棋盘 cloudlflare推理llama2 docker搭建elasticsearch并使用python连接 FreeU-文字生成图片的免费午餐笔记 使用xgboost的c接口推理模型 Archlinux使用CMake调用xgboost的c接口 m2cgen生成机器学习c语言推理代码 xgboost模型序列化存储并推理 speculative-sampling笔记 prompt2model笔记 RoboTAP笔记 自建obsidian同步服务 MediaPipe即将推出图像生成服务 Dual-Stream Diffusion Net for Text-to-Video Generation笔记 ViT在DDPM取代UNet(DiT) arch4edu搞崩了我的flutter LISA(推理分割)笔记 在终端绘制GPU显存使用曲线 GPTBot介绍 arch蓝牙无法连接 GPU部署llama-cpp-python(llama.cpp通用) 花式求GCD 使用llama构建一个蜜罐(前端) 使用llama构建一个蜜罐(后端) llama-cpp-python快速上手 快速上手llama2.c(更新版) Paper Gestalt笔记 DINO-v2笔记 快速上手llama2.c AnyDoor笔记 Archlinux安装scrcpy加载共享库出错 error while loading shared libraries:libusb-1.0.so.0:wrong ELF class:ELFCLASS32 npc_gzip笔记 python调用c++函数 Filesystem type ntfs3,ntfs not configured in kernel open_clip编码图像和文本 PicGo配置CloudflareR2图片储存 ArchlinuxGnome快捷键打开终端 clip-interrogator代码解析 GroundingDINO安装报错解决 2023华为鲲鹏畅想日暨西安高新国际会议中心零食午饭测评 RoboMaster开源仓库汇总(长期更新) 没有手都可以在腾讯云创建镜像 I3D笔记
pydantic实现的LLM ReAct
About the Author StudyingLover · 2024-08-11 · via StudyingLover's Blog

在今天的 AI 项目中,大模型的集成几乎成为了一种常态,但如何在保证输出的可控性和解释性的同时利用这些模型执行各种下游任务,一直是一个技术挑战。本文将介绍一个名为 ReAct 的系统,该系统通过结合大规模语言模型的输出与 Python 开发紧密合作,提供了一种新颖的解决方案。

代码开源在GitHub

什么是 ReAct?

ReAct(推理与行动)是一个增强大型语言模型(LLM)能力的框架,通过结合推理和基于行动的响应来实现。这种方法使 LLM 能够同时生成语言推理轨迹和特定任务的行动,从而提高它们在决策任务中的互动性和有效性

ReAct 的核心在于思考-行动-观察周期:在执行期间,LLM 遵循思考、行动和观察的循环:

  • 思考:模型生成关于手头任务的思考或推理轨迹。这可能涉及分解问题、规划搜索策略或做出假设。
  • 行动:基于思考,模型采取特定行动,例如查询数据库、搜索互联网或进行计算。
  • 观察:模型观察行动的结果,这将指导其下一步行动。这可能涉及分析检索到的数据或根据新信息优化搜索【23†来源】。

具体实现案例

考虑一个场景,我有两只狗,一只边境牧羊犬和一只苏格兰梗犬。我知道他们各自的体重,那它们的总体重是多少?

我们首先需要两个函数,一个获取一只狗的体重,一个计算数学表达式

def calculate(what):
    return eval(what)


def average_dog_weight(name):
    if name in "Scottish Terrier":
        return "Scottish Terriers average 20 lbs"
    elif name in "Border Collie":
        return "a Border Collies average weight is 37 lbs"
    elif name in "玩具贵宾犬":
        return "玩具贵宾犬的平均体重为 7 磅"
    else:
        return "An average dog weights 50 lbs"

我们需要一个 system prompt 来定义 llm 的行为

system_prompt = f"""
你是一个结构化数据的处理器,你精通json格式的数据,并且可以输出结构化的json数据。你可以根据给定的文字和json scheme,输出符合scheme的json数据。请注意,你的输出会直接被解析,如果格式不正确,会导致解析失败,你会被狠狠地批评的。
"""

一个 ReAct prompt 来告诉 llm 怎么做

react_prompt = f"""
你在一个思考、行动、暂停、观察的循环中运行。

你可用的操作是:

1. 计算:
例如计算:4 * 7 / 3
运行计算并返回数字 - 使用 Python,因此请确保在必要时使用浮点语法

2. 平均狗体重:
例如平均狗体重:牧羊犬
在给定品种的情况下返回狗的平均体重

下面是acions的文档:
{action_doc}

你的输出应该是一个json格式的字符串,输出需要遵循的json scheme如下:{LLMOutput.model_json_schema()}
其中
- thinkint 是你的思考
- actions 是你的行动
- parameter 是你需要执行行动的参数
- observation 是你的观察
- answer 是你的答案


当你认为自己已经找到了答案时,不输出actions,同时输出answer。
输出时,**直接返回json字符串**,不需要任何额外的输出,你的输出将被直接解析为json字符串,所以请确保你的输出是一个合法的json字符串。
不要在输出中包含任何额外的信息,只需返回json字符串。你的输出将被使用LLMOutput.model_validate_json建立一个LLMOutput对象
每次输出之进行一步操作,不要在一个输出中包含多个操作。
"""

通过以上方式,ReAct 利用大模型的能力,结合 Python 的强大后端处理,实现了从非结构化文本到结构化数据的转换,提高了信息的可用性和操作的精确度。

我们定义一个Agent 类来实现大模型能干什么

class Agent:
    def __init__(self, system="你好"):
        self.system = system
        self.messages = []
        if self.system:
            self.messages.append({"role": "system", "content": system})

    def __call__(self, message):
        self.messages.append({"role": "user", "content": message})
        result = self.execute()
        self.messages.append({"role": "assistant", "content": result})
        return result

    def execute(self):
        completion = client.chat.completions.create(
            model="deepseek-chat", messages=self.messages
        )
        return completion.choices[0].message.content

ReAct 部分我们单独放在一个 query 函数里面

def query(question, max_turns=5):
    i = 0
    bot = Agent(system_prompt)
    next_prompt = react_prompt + question
    while i < max_turns:
        i += 1
        result = extract_json(bot(next_prompt))
        print("*" * 80)
        print("Output: ", result)
        llm_output = LLMOutput.model_validate_json(result)
        if llm_output.actions:
            print("Actions:", llm_output.actions)
            # There is an action to run

            if llm_output.actions not in Actions.__members__.keys():
                raise Exception(
                    "Unknown action: {}: {}".format(
                        llm_output.actions, llm_output.parameter
                    )
                )
            print(" -- running {} {}".format(llm_output.actions, llm_output.parameter))
            observation = eval(Actions[llm_output.actions])(**(llm_output.parameter))
            print("Observation:", observation)
            next_prompt = "Observation: {}".format(observation)
        else:
            return llm_output.answer

这个流程是什么意思呢?就是说我们会把大模型的输出转成一个 json,包含思考、行动、参数、观察、结果五个字段,每次大模型的输出里面如果还有 action,那说明还需要使用工具,就把行动和参数拿出来运行一下,结果就是新的观察,循环往复,知道不需要 action,这个时候就把结果拿出来返回

下面是一个实际的输出

Output:  {
  "thinkint": "我需要计算两只狗的总体重",
  "actions": "average_dog_weight",
  "parameter": {
    "name": "Border Collie"
  },
  "observation": "获取边境牧羊犬的平均体重",
  "answer": ""
}
Actions: Actions.average_dog_weight
 -- running Actions.average_dog_weight {'name': 'Border Collie'}
Observation: a Border Collies average weight is 37 lbs
********************************************************************************
Output:  {
  "thinkint": "我已经知道边境牧羊犬的平均体重是37磅,现在需要获取苏格兰梗犬的平均体重",
  "actions": "average_dog_weight",
  "parameter": {
    "name": "Scottish Terrier"
  },
  "observation": "获取苏格兰梗犬的平均体重",
  "answer": ""
}
Actions: Actions.average_dog_weight
 -- running Actions.average_dog_weight {'name': 'Scottish Terrier'}
Observation: Scottish Terriers average 20 lbs
********************************************************************************
Output:  {
  "thinkint": "我已经知道苏格兰梗犬的平均体重是20磅,现在可以计算两只狗的总体重",
  "actions": null,
  "parameter": null,
  "observation": "计算两只狗的总体重",
  "answer": "两只狗的总体重是57磅"
}
两只狗的总体重是57磅

可以看到正确的输出两只狗的总体重是57磅

结论

ReAct 不仅展示了大模型与现代编程语言如 Python 的结合潜力,还提供了一个框架,使得 AI 集成变得更加灵活和有力。这种方法极大地推动了开发者在实际应用中实现自动化和智能化,无疑将在未来的技术发展中扮演重要角色。