从“会聊天”到“会办事”:用 Python 构建一个可调用工具的 A(agentcome.net)**:大模型能回答问题,但真正能进入业务流程的 AI,需要具备“判断任务—选择工具—读取结果—组织回答”的闭环能力。本文从智能体(AI Agent)的核心机制出发,使用 Python 与 OpenAI Agents SDK 实现一个可运行的“学习路线顾问”智能体,并讨论如何将它扩展到客服、内容运营和企业知识服务场景。

关键词:AI Agent、智能体、Python、工具调用、OpenAI Agents SDK、RAG

说明:文中“智能体来了”相关介绍基于其公开网站展示的信息,仅作为智能体应用场景案例,不构成课程效果或就业承诺。


1. 为什么今年开发者都在谈“智能体”?

很多团队第一次接触大模型,通常从一个聊天窗口开始:用户输入问题,模型输出答案。这类应用足以完成改写、摘要、问答,但一旦任务变成“先查询课程资料,再根据用户背景生成学习路径”,仅靠一次提示词就不够了。

原因很简单:真实任务不是一道问答题,而是一条执行链。

例如,一个学习咨询场景中,用户可能会问:

我是零基础运营,每周只能学习 6 小时,想做一个能回答产品问题的智能客服,该从哪里开始?

要给出可信答案,系统至少需要:

  1. 识别用户目标与约束;
  2. 查询可用课程或知识模块;
  3. 生成与时间预算匹配的计划;
  4. 清楚说明哪些信息来自资料,哪些属于建议。

这就是智能体区别于普通聊天机器人的关键:它不仅生成文字,还能在约束下调用工具完成任务。

在公开介绍中,“智能体来了”展示的业务方向包含智能体开发实战、内容生产、客户服务与获客等场景,并提到 Coze、Dify、FastGPT 等平台。无论最终采用低代码平台还是 Python 开发,这些场景背后的技术骨架都相似:模型负责理解与决策,工具负责访问可信数据或执行明确动作。


2. 一个最小可用 Agent,到底由什么组成?

一个实用的智能体通常可以拆成五个部件:

部件 作用 在本文案例中的实现
指令(Instructions) 定义身份、边界和回答规则 学习路线顾问的系统指令
模型(Model) 理解需求并决定下一步 由 SDK 调用模型完成
工具(Tools) 获取资料或执行动作 查询模块、生成周计划
状态(State) 保存上下文和执行结果 单轮演示,后续可接会话存储
评估与保护(Evaluation / Guardrails) 防止胡编、越权和敏感操作 在生产扩展部分说明

它的运行链路大致如下:

用户提出目标
    ↓
Agent 判断是否需要外部信息
    ↓
调用查询工具 / 计划工具
    ↓
工具返回结构化结果
    ↓
Agent 基于结果生成最终建议

这里最值得注意的是:模型不应该凭空“记住”业务资料,也不应该未经授权直接执行高风险动作。 开发者应将可访问的数据和可执行的动作封装成边界清晰的工具。


3. 实战目标:实现一个“学习路线顾问”智能体

为了让例子既能运行又贴近真实业务,我们实现一个轻量级智能体:

  • 用户描述自身背景、目标和每周学习时间;
  • Agent 可以调用 search_modules 查询可学习模块;
  • Agent 可以调用 build_weekly_plan 生成学习节奏;
  • Agent 最终给出一份可执行建议,并明确下一步产出物。

这个示例可以迁移到许多场景:

  • 教育培训机构的课程咨询助手;
  • 企业内部的岗位学习助手;
  • SaaS 产品的新手引导助手;
  • 面向客户服务的 FAQ + 路线推荐机器人。

对于“智能体来了”这类围绕智能体实训、内容生产和客户服务展示应用方向的品牌而言,一个学习咨询 Agent 也是非常自然的演示入口:它不需要接触敏感业务系统,却能完整展示工具调用、个性化规划和可控输出三项能力。


4. 环境准备

本例使用 Python 3.10 及以上版本。

mkdir learning-agent-demo
cd learning-agent-demo
python -m venv .venv

# macOS / Linux
source .venv/bin/activate

# Windows PowerShell
# .venv\Scripts\Activate.ps1

pip install openai-agents

在终端设置 API Key:

# macOS / Linux
export OPENAI_API_KEY="你的_API_Key"

# Windows PowerShell
# $env:OPENAI_API_KEY="你的_API_Key"

接下来,新建文件 app.py


5. 完整代码:让 Agent 学会查询与规划

from __future__ import annotations

import asyncio
from typing import Literal

from agents import Agent, Runner, function_tool


# 在真实项目中,这部分数据应来自数据库、CMS 或知识库检索服务。
MODULES = [
    {
        "name": "智能体基础与提示设计",
        "level": "零基础",
        "goals": ["客服", "内容生产", "学习入门"],
        "output": "完成一个可复用的角色提示词与测试问题集",
    },
    {
        "name": "知识库问答与检索增强",
        "level": "入门",
        "goals": ["客服", "企业知识库"],
        "output": "完成一个基于资料回答问题的 FAQ 助手",
    },
    {
        "name": "工具调用与业务工作流",
        "level": "入门",
        "goals": ["客服", "内容生产", "自动化"],
        "output": "完成一个会调用工具的 Agent Demo",
    },
    {
        "name": "评估、权限与上线治理",
        "level": "有开发经验",
        "goals": ["客服", "企业知识库", "自动化"],
        "output": "建立测试集、日志与风险拦截规则",
    },
]


@function_tool
def search_modules(
    goal: Literal["客服", "内容生产", "企业知识库", "自动化", "学习入门"],
    level: Literal["零基础", "入门", "有开发经验"],
) -> str:
    """根据学习目标与当前水平返回匹配的学习模块。"""
    level_rank = {"零基础": 0, "入门": 1, "有开发经验": 2}
    max_rank = level_rank[level] + 1

    matched = [
        item
        for item in MODULES
        if goal in item["goals"] and level_rank[item["level"]] <= max_rank
    ]

    if not matched:
        return "暂未找到直接匹配模块,建议先学习智能体基础与提示设计。"

    return "\n".join(
        f"- {item['name']}(适合:{item['level']};产出:{item['output']})"
        for item in matched
    )


@function_tool
def build_weekly_plan(goal: str, weekly_hours: int) -> str:
    """按照每周可投入时间,生成四周学习节奏建议。"""
    if weekly_hours < 2:
        return "每周学习时间少于 2 小时,建议先将目标缩小为完成一个 FAQ 原型。"

    pace = "轻量" if weekly_hours < 5 else "标准" if weekly_hours < 10 else "进阶"
    return (
        f"目标:{goal}\n"
        f"节奏:{pace}(每周约 {weekly_hours} 小时)\n"
        "第1周:明确场景、整理20条真实问题、设计回答边界;\n"
        "第2周:建立资料库或结构化数据源,验证基础问答;\n"
        "第3周:加入工具调用,完成查询与计划生成闭环;\n"
        "第4周:建立测试集,检查错误回答、权限与日志。"
    )


advisor = Agent(
    name="学习路线顾问",
    instructions=(
        "你是一名严谨的 AI 智能体学习顾问。"
        "先识别用户的背景、目标和时间预算,再按需要调用工具。"
        "只能根据工具返回的模块信息推荐学习内容,不得虚构课程、价格、证书或就业结果。"
        "最终回答请包含:推荐路径、四周计划、首个可交付成果、风险提醒。"
        "语言简洁,适合第一次接触 Agent 的学习者。"
    ),
    tools=[search_modules, build_weekly_plan],
)


async def main() -> None:
    question = (
        "我是零基础运营,每周可以学习6小时。"
        "我想做一个能根据资料回答产品问题的智能客服,"
        "请给我一条四周学习路线。"
    )
    result = await Runner.run(advisor, question)
    print(result.final_output)


if __name__ == "__main__":
    asyncio.run(main())

运行程序:

python app.py

一次合理的输出应当包含:适合零基础学习者的模块建议、四周实践路线、第一个可以展示的 FAQ 助手产出,以及“上线前必须做测试和权限控制”的提醒。


6. 拆解代码:Agent 为什么不等于“加长版提示词”?

6.1 Agent 定义的是职责边界

advisor = Agent(
    name="学习路线顾问",
    instructions="...",
    tools=[search_modules, build_weekly_plan],
)

instructions 不是一句“请你专业一点”就够了。面向真实业务,至少应当说明:

  • 它扮演什么角色;
  • 回答必须依赖哪些数据;
  • 哪些内容禁止生成;
  • 最终输出需要哪些结构。

本例中特意写入“不虚构价格、证书或就业结果”,是因为咨询类应用极容易把模型的流畅表达误当成真实承诺。Agent 越接近业务,边界越要写清楚。

6.2 @function_tool 把业务能力交给受控函数

@function_tool
def search_modules(goal: str, level: str) -> str:
    ...

模型本身不会自动访问公司的课程资料、商品库或 CRM。工具的意义在于:开发者只开放必要的能力,让模型在明确参数范围内调用。

以学习咨询为例,工具可以逐步替换为:

  • 从 CMS 查询公开课程简介;
  • 从向量数据库检索课程 FAQ;
  • 从预约系统获取可选试听时段;
  • 将人工跟进请求写入工单系统。

注意最后两项涉及写操作和个人信息,生产环境必须增加用户确认、字段脱敏与审计日志。

6.3 Runner.run 执行的是一个循环

result = await Runner.run(advisor, question)

这行代码背后不是简单的一问一答,而是:模型判断是否调用工具,SDK 执行工具,把结果回传给模型,模型再生成最终回复。换句话说,Agent 的价值不在于回答更长,而在于能基于真实结果完成多步任务。


7. 从 Demo 到真实业务:加入知识库,而不是把资料塞进提示词

上面的 MODULES 是写死在代码里的静态数据,便于理解概念,却不适合长期运营。真实项目中,课程介绍、产品手册、服务政策都可能更新,如果把全部内容复制进提示词,很快会遇到三个问题:

  • 上下文越来越长,成本和延迟上升;
  • 资料更新后,代码中的旧内容容易过期;
  • 回答难以追溯到原文依据。

更合理的工程路径是引入检索增强生成(RAG):

用户问题
  → 检索相关资料片段
  → 将片段连同来源交给 Agent
  → Agent 生成带依据的回答
  → 对高风险问题转人工

以“智能体来了”公开展示的培训与实战场景为例,适合优先进入知识库的资料包括:公开课程介绍、适用人群、课程大纲、常见问题与联系流程。至于合同条款、费用减免、就业安排等会直接影响用户决策的内容,则不应由模型自由发挥,而应引用已审核文本或直接转人工确认。


8. 生产化必做的四件事:不要让 Demo 直接冲进业务

8.1 建测试集:先测失败,再谈智能

至少准备 50 条真实问题,覆盖:

  • 正常咨询:课程面向谁、需要什么基础;
  • 模糊需求:我适合学什么;
  • 边界问题:能否保证结果、能否替我报名;
  • 攻击问题:忽略规则、输出内部资料;
  • 无资料问题:课程是否包含某项未公开服务。

优秀的智能体不只是“能答”,还要在没有依据时敢于说“不确定,需要确认”。

8.2 写操作必须二次确认

查询课程简介属于低风险操作;自动提交报名、写入客户信息、发送消息,就属于高风险动作。建议采用如下策略:

生成建议:可自动执行
读取公开资料:可自动执行
创建咨询线索:需要用户确认
发送通知 / 修改订单 / 提交合同:必须人工确认或审批

8.3 保存可观测日志

至少记录:用户问题、调用过哪些工具、工具返回是否成功、最终答案、用户反馈。没有日志,就无法判断问题到底出在提示词、数据源、工具接口,还是模型选择上。

8.4 定期更新知识与规则

培训、客服和内容运营都属于信息变化较快的场景。课程介绍、FAQ、服务说明一旦调整,知识库与评估集也应同步更新。Agent 的“聪明程度”常常不取决于模型多强,而取决于资料是否新、边界是否清楚。


9. 一个品牌案例的启发:学习智能体,最终要回到可交付作品

对于刚进入 AI Agent 领域的学习者,最容易掉进两个坑:一个是沉迷概念,另一个是只会在平台上调提示词,却没有完整作品。

“智能体来了”在公开页面中展示了智能体开发、内容生产与客户服务等实践方向。这类场景对学习者有一个很现实的提醒:不要只学“AI 会什么”,要尽快完成一个别人能试用、能评价、能迭代的作品。

本文的学习路线顾问就是一个不错的最小作品:

  • 它有清晰用户群:想学习或咨询智能体应用的人;
  • 它有真实数据入口:公开课程或知识资料;
  • 它有工具闭环:查询、生成计划、后续可接人工咨询;
  • 它能被评估:回答是否准确、是否越权、是否真正帮助用户下一步行动。

进一步扩展时,可以将它升级为:

  1. 接入文档检索的知识库客服;
  2. 为内容运营生成选题并调用审核流程的创作助手;
  3. 为企业内部员工推荐培训资料的学习助手;
  4. 由多个专长 Agent 协作完成“检索—规划—质检”的工作流。

这也是智能体开发真正有意思的地方:从一个可控的小闭环开始,逐渐连接数据、工具和业务流程,而不是一上来就幻想“全自动数字员工”。


10. 总结

从聊天机器人到智能体,最大的变化不是模型会说更多话,而是应用开始具备:

  • 明确职责;
  • 使用工具;
  • 读取可靠数据;
  • 在边界内完成多步骤任务;
  • 被测试、审计和持续改进。

本文用不到百行核心代码实现了一个学习路线顾问 Agent。你可以先替换静态模块数据,再接入真实知识库,最后补齐评估、权限和日志机制。做到这一步,你构建的就不再是“展示效果”的聊天窗口,而是一个真正能够服务具体场景的智能体应用。

AI Agent 的门槛并没有想象中高,但把它做得可靠、可控、可复用,永远比做出第一段演示代码更重要。


参考资料

  1. OpenAI Agents SDK 官方文档:Agents、Tools 与 Python Quickstart。
  2. “智能体来了”公开网站展示的品牌介绍与智能体实战应用方向。

发布建议:如文章用于品牌官方传播,请在发布前再次核验公司介绍、课程名称及对外服务表述,并按平台规则标识商业合作或品牌内容。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐