news 2026/6/4 15:26:37

利用Agent 基础、ReAct、planning、memory做tool-based agent,利用 JSON Schema做structured output extraction从 从文本提取

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
利用Agent 基础、ReAct、planning、memory做tool-based agent,利用 JSON Schema做structured output extraction从 从文本提取

一、整体系统架构

┌──────────────────┐
│ User │
└────────┬─────────┘


┌─────────────────┐
│ Agent │
│ ReAct + Planner │
└────────┬────────┘

┌───────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌────────────┐
│Order Tool │ │Search Tool │ │SQL Tool │
└────────────┘ └────────────┘ └────────────┘


┌───────────────────┐
│ Structured Output │
│ JSON Schema │
└───────────────────┘


┌──────────────┐
│ Memory │
│ short / long │
└──────────────┘

二、核心概念

Agent 本质:

LLM + 推理 + 工具调用 + 状态

普通 ChatGPT:

输入 → 输出

Agent:

输入 ↓ 思考 ↓ 决定是否调用工具 ↓ 获得结果 ↓ 继续思考 ↓ 最终回答

三、ReAct 是 Agent 的核心

ReAct =

Reasoning + Acting

Agent 会:

Thought: 我要提取订单信息 Action: 调用 extraction_tool Observation: 得到结构化订单 Thought: 订单缺少电话 Action: 继续询问用户

流程:

用户消息 ↓ Thought(思考) ↓ Action(调用工具) ↓ Observation(观察结果) ↓ 继续推理

四、Planning(规划)

复杂任务时:

Agent 会拆任务。

例如:

“帮我处理客户订单并保存数据库”

Agent 会:

1. 提取订单信息 2. 验证字段 3. 查询库存 4. 写入数据库 5. 返回结果

这就是 Planning。


五、Memory(记忆)


1. Short-term memory

当前对话历史。

例如:

chat_history = [ {"role": "user", "content": "..."}, {"role": "assistant", "content": "..."} ]

作用:

  • 多轮对话
  • 上下文理解

2. Long-term memory

长期记忆。

例如:

用户常用地址 用户公司 用户购买偏好

通常存:

  • Vector DB
  • Redis
  • PostgreSQL

六、Tool-based Agent

核心思想:

Agent 自动选择工具。

例如:

用户: 帮我提取订单

Agent:

选择 extraction tool

为什么需要 JSON Schema

LLM 输出不稳定:

可能返回: - 自然语言 - 漏字段 - 格式错误

JSON Schema 用于:

强制AI返回固定结构

七、订单文本示例

用户输入:

你好,我想购买: 2 台 iPhone 15 Pro 1 台 MacBook Air 收货人:张三 电话:13800138000 地址:北京市朝阳区xx路88号

我们希望 AI 输出:

{ "customer_name": "张三", "phone": "13800138000", "address": "北京市朝阳区xx路88号", "items": [ { "product": "iPhone 15 Pro", "quantity": 2 }, { "product": "MacBook Air", "quantity": 1 } ] }

十、JSON Schema

这里是关键。

order_schema = { "type": "object", "properties": { "customer_name": { "type": "string" }, "phone": { "type": "string" }, "address": { "type": "string" }, "items": { "type": "array", "items": { "type": "object", "properties": { "product": { "type": "string" }, "quantity": { "type": "integer" } }, "required": ["product", "quantity"] } } }, "required": [ "customer_name", "phone", "address", "items" ] }

八、项目结构

requirements.txt

openai>=1.30.0 pydantic>=2.0.0 python-dotenv>=1.0.0

安装依赖

在项目目录运行:

pip install -r requirements.txt

.env

OPENAI_API_KEY=你的_openai_api_key

schemas.py

from pydantic import BaseModel from typing import List class Item(BaseModel): product: str quantity: int class Order(BaseModel): customer_name: str phone: str address: str items: List[Item]

memory.py

class Memory: def __init__(self): self.history = [] def add(self, role, content): self.history.append({ "role": role, "content": content }) def get_history(self): return self.history

tools.py

import os import json from dotenv import load_dotenv from openai import OpenAI from schemas import Order load_dotenv() client = OpenAI( api_key=os.getenv("OPENAI_API_KEY") ) def extract_order_info(text: str): response = client.chat.completions.create( model="gpt-4.1-mini", messages=[ { "role": "system", "content": "你是订单信息提取助手" }, { "role": "user", "content": f""" 从下面文本提取订单信息: {text} 如果缺失字段,返回空字符串。 """ } ], response_format={ "type": "json_schema", "json_schema": { "name": "order_schema", "schema": Order.model_json_schema() } } ) result = response.choices[0].message.content return json.loads(result)

main.py

from tools import extract_order_info from memory import Memory memory = Memory() print("Agent 已启动(输入 quit 退出)") while True: user_input = input("\n用户:") if user_input.lower() == "quit": break memory.add("user", user_input) print("\n[Thought]") print("我需要提取订单信息") print("\n[Action]") print("调用 extract_order_info tool") result = extract_order_info(user_input) print("\n[Observation]") print(result) memory.add("assistant", str(result))

运行方式

进入目录:

cd agent_project

激活 venv:

.venv\Scripts\activate

安装:

pip install -r requirements.txt

运行:

python main.py

测试输入

输入:

我要买2台iPhone 15 Pro 1台MacBook Air 收货人:张三 电话:13800138000 地址:北京市朝阳区88号

输出

{ "customer_name": "张三", "phone": "13800138000", "address": "北京市朝阳区88号", "items": [ { "product": "iPhone 15 Pro", "quantity": 2 }, { "product": "MacBook Air", "quantity": 1 } ] }

项目完成

一个:

Tool-based Structured Output Agent

包含:

✅ Agent
✅ ReAct
✅ Tool Calling
✅ Memory
✅ JSON Schema
✅ Structured Output
✅ Pydantic Validation

注:以上内容为 AI 辅助生成的参考回答,仅供参考,请自行核实关键信息。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 15:24:36

【RT-DETR实战】133、神经网络架构搜索(NAS)与RT-DETR结合展望

从一次深夜调参说起 上周在部署RT-DETR到边缘设备时,又遇到了老问题:模型在Jetson Orin上跑起来帧率只有23FPS,离实时检测的30FPS还差一截。 尝试了各种剪枝量化手段,要么精度掉得厉害,要么速度提升有限。盯着TensorRT的profiler输出,突然意识到——我们是不是在错误的…

作者头像 李华
网站建设 2026/6/4 15:24:35

请收下这些软件测试学习干货,不看后悔一辈子

学习软件测试的过程中会遇到很多很多的困难和挑战,只有跨过这些困难和挑战,才有机会挑战软件测试领域的高薪offer。今天我们就来梳理一下,学习软件测试的过程中,我们一般都会遇到哪些困难,我们又当如何克服这些困难。 …

作者头像 李华
网站建设 2026/6/4 15:18:00

Arduino状态机驱动WS2812B灯带:无焊接实现萤火虫动画效果

1. 项目概述:一个无需焊接的节日灯光方案如果你和我一样,每年都想给家里的节日装饰来点新意,但又不想面对一堆烙铁、焊锡和复杂的电路板,那么这个项目就是为你准备的。我这次折腾的是一个“萤火虫灯串”,核心是用一块A…

作者头像 李华