摘要:本文揭秘如何构建一个生产级的AI Agent办公自动化系统。基于ReAct框架与函数调用(Function Calling)技术,我们打造了一个能自主操作ERP、写邮件、生成报表的"数字员工"。文章将深入解析Agent的任务规划、工具调用、记忆管理等核心模块,并提供可直接落地的Python实现。实测在真实企业场景中,日均自动处理200+工单,准确率达94%,较传统RPA方案灵活度提升5倍。
一、痛点:为什么ChatGPT无法真正替代人工?
去年为某中型制造企业部署AI助手时,发现一个简单的需求无法解决:
"帮我把ERP里所有逾期未付款的客户找出来,生成催款邮件,并创建跟进任务"
ChatGPT只能生成"伪代码",无法真的登录系统、点击按钮、发送邮件。传统RPA虽然能操作软件,但:
-
规则僵化:界面微调就崩溃
-
无理解能力:客户留言"下周安排付款",RPA无法识别意图
-
无记忆能力:每次都要重新配置流程
这就是AI Agent的价值------让大模型具备"动手"能力。
二、技术方案:ReAct + Function Calling架构
2.1 核心设计:让LLM成为"大脑"
python
from typing import List, Dict
from pydantic import BaseModel, Field
class OfficeAgent:
def __init__(self):
self.llm = ChatOpenAI(model="gpt-4-turbo", temperature=0)
self.tools = self._initialize_tools()
self.memory = ConversationBufferWindowMemory(k=10)
def _initialize_tools(self) -> List:
"""注册所有可执行工具"""
return [
ERPQueryTool(),
EmailSendTool(),
ExcelGenerateTool(),
CalendarCreateTool(),
WebSearchTool()
]
def run(self, task: str) -> Dict:
"""ReAct循环:思考-行动-观察"""
max_iterations = 10
thought_history = []
for i in range(max_iterations):
# 1. LLM决定下一步行动
action = self.llm.plan(
task=task,
tools=self.tools,
memory=self.memory,
thought_history=thought_history
)
if action.type == "final":
return {"status": "success", "result": action.content}
# 2. 执行工具调用
tool_output = self._execute_tool(action)
# 3. 记录观察结果
thought_history.append({
"thought": action.thought,
"action": action.tool_call,
"observation": tool_output
})
self.memory.save_context(
{"input": action.tool_call},
{"output": tool_output}
)
return {"status": "failed", "reason": "达到最大迭代次数"}
2.2 工具定义:让LLM理解"能做什么"
关键技巧:函数描述比实现更重要,直接决定LLM调用准确率。
python
class ERPQueryTool(BaseModel):
"""查询ERP系统数据,这是Agent操作企业系统的核心接口"""
query_type: str = Field(
description="查询类型: 'overdue_invoices', 'inventory', 'customer_info'"
)
params: Dict = Field(
description="查询参数,例如: {'days_overdue': 30, 'min_amount': 1000}"
)
def execute(self) -> Dict:
"""真实ERP调用需对接SAP/金蝶/用友API"""
# 模拟调用
if self.query_type == "overdue_invoices":
# 实际代码:调用ERP OData接口
# response = requests.post("https://erp.api.com/query", json=...)
return {
"count": 15,
"clients": [
{"name": "宏远科技", "amount": 45000, "overdue_days": 45},
{"name": "信达贸易", "amount": 23000, "overdue_days": 32}
]
}
return {"error": "不支持的查询类型"}
# 工具注册(关键:描述必须精准)
TOOLS_SPEC = [
{
"name": "erp_query",
"description": "查询企业ERP系统,获取财务/库存/客户数据。支持逾期账款、库存预警等场景",
"parameters": {
"type": "object",
"properties": {
"query_type": {"type": "string", "enum": ["overdue_invoices", "inventory"]},
"params": {"type": "object"}
},
"required": ["query_type"]
}
},
{
"name": "send_email",
"description": "发送企业邮件。支持HTML模板、附件、抄送。需传入收件人、主题、正文",
"parameters": { ... }
}
]
三、核心优化:让Agent"聪明且可靠"
3.1 记忆管理:短期+长期记忆分离
python
class AgentMemory:
def __init__(self):
# 短期记忆:最近10轮对话
self.short_term = ConversationBufferWindowMemory(k=10)
# 长期记忆:重要业务规则
self.long_term = Chroma.from_documents(
documents=self._load_business_rules(),
embedding=OpenAIEmbeddings()
)
def get_context(self, query: str) -> str:
# 检索相关长期记忆
relevant_rules = self.long_term.similarity_search(query, k=3)
return f"""
业务规则记忆:
{chr(10).join([rule.page_content for rule in relevant_rules])}
近期对话历史:
{self.short_term.load_memory_variables({})}
"""
def _load_business_rules(self):
"""加载企业业务规则"""
return [
Document("客户逾期超过60天,需升级至法务部"),
Document("催款邮件必须抄送销售负责人"),
Document("周末不发送催款邮件")
]
3.2 错误处理与自我纠错
Agent必须能处理工具调用失败:
python
def _execute_tool_with_retry(self, action, max_retries=3):
for attempt in range(max_retries):
try:
result = self._execute_tool(action)
if "error" in result:
# LLM分析错误并调整策略
fix_strategy = self.llm.analyze_error(action, result["error"])
action = self.llm.replan(fix_strategy)
continue
return result
except Exception as e:
if attempt == max_retries - 1:
# 最终失败,转人工
self.alert_human(action, str(e))
return {"status": "handoff", "reason": "工具调用失败"}
return {"error": "Max retries exceeded"}
3.3 任务拆分与并行执行
复杂任务自动拆解:
python
class TaskPlanner:
def decompose(self, user_task: str) -> List[Dict]:
"""将复杂任务拆分为子任务"""
prompt = f"""
将以下任务拆分为可执行的子任务,考虑依赖关系:
任务:{user_task}
输出格式:
1. [子任务1] (依赖: 无)
2. [子任务2] (依赖: 子任务1)
3. [子任务3] (依赖: 无) -> 可与1并行
"""
plan_text = self.llm.invoke(prompt)
return self._parse_plan(plan_text)
def _parse_plan(self, plan_text: str) -> List[Dict]:
# 解析执行计划,识别可并行任务
tasks = []
for line in plan_text.split("\n"):
if line.strip().startswith(tuple("123456789")):
task_info = {
"task": line.split("]")[1].strip(),
"depends_on": self._extract_dependencies(line)
}
tasks.append(task_info)
return tasks
四、生产部署:异步架构与监控
4.1 异步任务队列
python
from celery import Celery
app = Celery('agent_tasks', broker='redis://localhost:6379')
@app.task(bind=True, max_retries=3)
def execute_agent_task(self, task_id: str, user_input: str):
"""异步执行Agent任务"""
agent = OfficeAgent()
try:
result = agent.run(user_input)
# 保存结果到DB
TaskResult.objects.create(
task_id=task_id,
status="completed",
result=result
)
return result
except Exception as exc:
# 失败重试
raise self.retry(exc=exc, countdown=60)
# API接口
@app.post("/tasks")
async def create_task(request: TaskRequest):
task = execute_agent_task.delay(request.task_id, request.user_input)
return {"task_id": task.id, "status": "queued"}
4.2 可观测性:追踪Agent"脑回路"
python
# LangSmith集成,可视化Agent执行链
from langsmith import Client
class AgentTracer:
def __init__(self):
self.client = Client()
def trace_execution(self, task_id: str, execution_steps: List):
"""记录完整执行链路"""
for step in execution_steps:
self.client.create_run(
name=f"step_{step['iteration']}",
run_type="tool",
inputs={"action": step["action"]},
outputs={"observation": step["observation"]},
parent_run_id=task_id
)
# 生成执行报告
self.generate_report(task_id, execution_steps)
五、实战效果:某物流企业案例
场景:自动处理客户投诉工单
-
输入:客户邮件"货物延迟3天,要求赔偿"
-
Agent执行流程:
-
查询物流系统 → 确认订单LS2024001状态"运输中"
-
检查合同 → 调用
contract_query工具,确认 SLA条款"延迟超48小时可赔" -
计算赔偿 → 调用
compensation_calculate,得出应赔¥600 -
生成回复 → 撰写道歉邮件并附上赔偿方案
-
创建任务 → 在CRM中生成"24小时内跟进"任务
-
效果对比:
| 指标 | 人工处理 | RPA | AI Agent |
|---|---|---|---|
| 处理时长 | 15分钟 | 3分钟 | 1.5分钟 |
| 准确率 | 95% | 78% | 94% |
| 异常处理 | 支持 | 不支持 | 支持 |
| 规则变更成本 | 培训成本 | 重新开发 | 修改Prompt |
| 7×24运行 | 否 | 是 | 是 |
六、挑战与对策
挑战1:API调用成本失控
- 方案 :引入
Intent-based Routing,简单任务走小模型(Qwen-7B),复杂任务才调GPT-4
挑战2:Agent"幻觉"操作
- 方案:所有写操作增加"确认环节",关键操作(如删除数据)必须人工二次确认
挑战3:企业系统API老旧
当前系统已在3家企业稳定运行,累计处理任务超5万次。下一步我们将探索Multi-Agent协作:一个Agent负责数据分析,一个负责撰写报告,一个负责审核,形成真正的"数字团队"。
-
方案 :通过
RPA Bridge模式:Agent调用RPA机器人操作无API的系统pythonclass RPABridgeTool: """Agent无法直接操作的系统,通过RPA桥接""" def execute(self, action: str, params: Dict): # 调用已录制的RPA流程 rpa_bot = UiPathRobot() return rpa_bot.execute_workflow(action, params)
七、总结:Agent落地的三个关键
-
工具定义 > 模型选择:清晰的工具描述比用GPT-5更重要
-
记忆设计决定智能上限:没有记忆的Agent只是高级RPA
-
监控可观测性是生命线:必须能看见Agent的"思考过程"