跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

使用 100 行代码构建 Mini AI Agent 实战指南

AI Agent 的基本概念及其感知 - 决策 - 行动的循环架构,并通过实际案例演示了如何使用 100 行 Python 代码构建一个最小智能体。文章详细讲解了环境配置、LangChain 框架的使用、工具函数的定义与绑定、以及基于 Gradio 的交互界面搭建。此外,还补充了关于 API 密钥安全、错误处理及后续扩展方向的建议,帮助开发者快速掌握智能体开发的核心技能。

Ne0发布于 2025/2/6更新于 2026/7/737 浏览
使用 100 行代码构建 Mini AI Agent 实战指南

今年 3 月份,知名人工智能科学家吴恩达(Andrew Ng)在社交平台 X 上发帖提到,他认为 AI 代理工作流程将在今年推动 AI 的大规模进步,甚至可能比下一代基础模型还要多。此观点引发了业界的广泛关注,标志着 AI 发展中的范式转变。

本文首先对智能体(AI Agent)的概念做一个简单介绍,然后详细拆解一个仅用 100 行代码构建的极简智能体应用,并补充安全实践与扩展建议。

1 什么是智能体?

智能体(AI Agent) 是一种超越简单文本生成的人工智能系统,它使用大语言模型(LLM)作为其核心计算引擎,使其能够进行对话、推理、执行任务,展现一定程度的自主性。

在智能体架构中,核心功能可以归纳为三个步骤的循环:感知 - 决策 - 行动。智能体首先通过感知机制收集环境信息,然后基于该信息和预设目标,通过决策机制制定行动计划,最终通过动作执行机制实施这些计划。

智能体架构示意

图:智能体架构示意

2 示例:Mini AI Agent

了解了智能体的概念,接下来我们一起一步步拆解一个仅用 100 行代码构建的最小智能体应用。

2.1 效果演示

先来看一下效果演示。

Mini AI Agent 应用演示

图:Mini AI Agent 应用演示

看似平淡无奇的两次问答,实际上已经体现了智能体的核心循环:感知 - 决策 - 行动。

  • 感知:接收问题
  • 决策:理解问题,确定目标,然后通过推理决定使用何种工具(即制定计划)
  • 行动:使用工具获取信息,然后生成答案
2.2 环境准备
申请账号:百度千帆
  1. 访问百度智能云千帆平台,注册账号并登录千帆大模型控制台。
  2. 打开模型服务 - 应用接入页面,创建应用,记下 API Key 和 Secret Key 备用。
  3. 打开模型服务 - 在线服务页面,找到 ERNIE-3.5-8K(支持函数功能),开通付费。

注意:本文以百度千帆为例,大家可以根据自身经验,替换成其他任何支持函数功能的大模型,比如智谱清言、Azure、OpenAI 等。

搭建本地开发环境:Jupyter Notebook
  1. 访问 Anaconda 官网,下载安装包并安装 Anaconda。
  2. 命令行运行 conda install jupyter notebook,安装 Jupyter Notebook。
  3. 打开 GitHub 示例项目 emac/langchain-samples,git clone 到本地。
  4. 命令行打开 langchain-samples 目录,运行 jupyter notebook,打开 Jupyter Notebook。
2.3 程序拆解

准备好环境之后,就可以进入实操环节了!

安装依赖
!pip install langchain langchain-community langchain-core gradio

依赖说明:

  • gradio: 一个用于快速构建机器学习模型的交互式 Web 应用的 Python 库。
初始化大模型
from langchain_community.llms import QianfanLLMEndpoint
import os

print("# 初始化千帆")
os.environ["QIANFAN_AK"] = '千帆应用的 API Key'
os.environ["QIANFAN_SK"] = '千帆应用的 Secret Key'

llm = QianfanLLMEndpoint(streaming=True,
                         model="ERNIE-3.5-8K",
                         temperature=0.1)

response = llm.invoke("上海春天一般哪个月开始?")
print(response)

执行之前先替换之前记录的千帆应用的 API Key 和 Secret Key。

程序解读:

  1. 初始化环境变量,创建一个千帆 LLM 实例。
  2. 发起第一次大模型 API 调用,如果不成功则返回检查环境和依赖。

安全提示:在实际生产环境中,切勿将 API Key 硬编码在代码中。建议使用 .env 文件配合 python-dotenv 库来管理敏感信息。

定义函数
from langchain import PromptTemplate, LLMChain
from langchain.chains import LLMRequestsChain
from langchain_core.tools import tool
from langchain_core.utils.function_calling import convert_to_openai_tool

print("# 定义函数")
@tool
def search_ip(question:str, ip:str) -> str:
    """
    首先获取输入的 IP 地址的位置信息,然后回答输入的问题
    @param question: 问题
    @param ip: IP 地址
    """
    prompt_template = """以下是 IP 地址'{ip}'的位置信息:
    >>> {requests_result} <<<
    根据以上位置信息,回答以下这个问题:
    >>> {question} <<<"""
    prompt = PromptTemplate(
        input_variables=["question", "ip", "requests_result"],
        template=prompt_template
    )
    chain = LLMRequestsChain(llm_chain = LLMChain(llm=llm, prompt=prompt))
    inputs = {
        "question": question,
        "ip": ip,
        "url": "https://api.songzixian.com/api/ip?dataSource=generic_ip&ip=" + ip
    }
    return chain.invoke(inputs)

@tool
def search_phone(question:str, phone:str) -> str:
    """
    首先获取输入的手机号码的归属地信息,然后回答输入的问题
    @param question: 问题
    @param phone: 手机号码
    """
    prompt_template = """以下是手机号码'{phone}'的归属地信息:
    >>> {requests_result} <<<
    根据以上归属地信息,回答以下这个问题:
    >>> {question} <<<"""
    prompt = PromptTemplate(
        input_variables=["question", "phone", "requests_result"],
        template=prompt_template
    )
    chain = LLMRequestsChain(llm_chain = LLMChain(llm=llm, prompt=prompt))
    inputs = {
        "question": question,
        "phone": phone,
        "url": "https://api.songzixian.com/api/phone-location?dataSource=phone_number_location&phoneNumber=" + phone
    }
    return chain.invoke(inputs)

functions=[convert_to_openai_tool(search_ip)['function'],convert_to_openai_tool(search_phone)['function']]
print(functions)

程序解读:

  • 定义 search_ip 和 search_phone 两个工具函数,背后连接第三方 API 接口平台,用来获取指定 IP 的位置信息和指定手机号的归属地信息,然后再结合原始问题,通过大模型生成最终回答。
  • tool / convert_to_openai_tool: 用于生成函数定义的注解和工具方法。
  • PromptTemplate: Prompt 模板,支持变量。
  • LLMRequestsChain: 一个基于 URL 请求的大模型链,先调用 URL 获取数据,然后将数据传给一个已绑定 Prompt 的大模型链获取答案。
绑定函数
from langchain.schema import HumanMessage
from langchain_community.chat_models import QianfanChatEndpoint
import json

# 此处不能设定 streaming=True,否则无法激活函数回调
chat = QianfanChatEndpoint(model="ERNIE-3.5-8K",
                          temperature=0.1)

def get_response(message):
    print("# 绑定函数")
    result = chat.invoke([HumanMessage(content=message)],
                               functions=functions)
    print(result)

    function_call_info = result.additional_kwargs.get("function_call", None)
    print(function_call_info)
    
    if not function_call_info:
        print("# 直接返回")
        return result.content

    print("# 调用函数")
    function_name = function_call_info["name"]
    function_args = json.loads(function_call_info["arguments"])
    function_result = eval(function_name)(function_args)
    print(function_result)
    return function_result["output"]

程序解读:

创建一个千帆 Chat 实例,绑定之前定义的两个函数,传入用户输入的问题(对应智能体的感受环节),然后发起调用,根据调用结果执行不同任务(对应智能体的决策环节):

  • 如果调用结果没有提示函数调用,则直接返回结果。
  • 否则,根据大模型提示的函数名和请求参数,通过反射调用相应的函数(对应智能体的执行环节),然后返回结果。
构建应用
import gradio as gr

def submit(message, chat_history):
    bot_message = get_response(message)
    # 保存历史对话记录,用于显示
    chat_history.append((message, bot_message))
    return "", chat_history

print("# 创建交互")
with gr.Blocks() as demo:
    chatbot = gr.Chatbot(height=240) # 对话框
    msg = gr.Textbox(label="Prompt") # 输入框
    submitBtn = gr.Button("Submit") # 提交按钮
    clearBtn = gr.ClearButton([msg, chatbot]) # 清除按钮
    # 提交
    msg.submit(submit, inputs=[msg, chatbot], outputs=[msg, chatbot]) 
    submitBtn.click(submit, inputs=[msg, chatbot], outputs=[msg, chatbot])
    
gr.close_all()
demo.launch()

程序解读:

  • 创建智能体应用,构建一个用户和智能体的对话框,将用户输入的消息传给后台创建的大模型,实时获取响应。
  • 此处可以看到,借助 Gradio 框架,短短几行代码,就可以构建出一个简洁的对话框应用。

至此,一个极简的智能体应用就构建成功了,前后仅用 100 行代码。

彩蛋:智能体如何思考?

看完演示,拆解完程序,你可能对智能体里的 '智能' 两字的理解还是有点模模糊糊。其实要真正理解这一点,光看程序还不够,得看下大模型的响应结果。注意其中 response_metadata 有一个很有意思的 thoughts 字段,其代表了大模型的思考过程,是不是和人类非常类似?

# 问题:120.230.93.202 属于哪个城市?
# 大模型响应结果
additional_kwargs={'finish_reason': 'function_call', 'request_id': 'as-fcd0dz2mmg', 'object': 'chat.completion', 'search_info': [], 'function_call': {'name': 'search_ip', 'arguments': '{"question":"120.230.93.202 属于哪个城市?","ip":"120.230.93.202"}'}} 

response_metadata={'token_usage': {'prompt_tokens': 194, 'completion_tokens': 63, 'total_tokens': 257}, 'model_name': 'ERNIE-3.5-8K', 'finish_reason': 'function_call', 'id': 'as-fcd0dz2mmg', 'object': 'chat.completion', 'created': 1714900176, 'result': '', 'is_truncated': False, 'need_clear_history': False, 'function_call': {'name': 'search_ip', 'thoughts': '用户想要知道一个特定 IP 地址的地理位置信息,我需要使用 search_ip 工具来获取这个信息。', 'arguments': '{"question":"120.230.93.202 属于哪个城市?","ip":"120.230.93.202"}'}, 'usage': {'prompt_tokens': 194, 'completion_tokens': 63, 'total_tokens': 257}} id='run-0706ab6f-a21f-4352-bbb1-1f1a0f13c426-0'
2.4 最佳实践与安全建议

在实际部署此类智能体时,除了功能实现,还需关注以下几点:

  1. API 密钥管理:永远不要将密钥提交到 Git 仓库。使用环境变量或专门的密钥管理服务。
  2. 错误处理:网络请求可能失败,应增加 try-except 块捕获异常,避免应用崩溃。
  3. 速率限制:第三方 API 通常有调用频率限制,建议在代码中加入简单的延时或重试机制。
  4. 输入验证:对用户输入进行校验,防止注入攻击或非法参数导致工具调用失败。
2.5 扩展方向

基于当前的 Mini AI Agent,你可以尝试以下扩展来提升能力:

  • 记忆功能:引入向量数据库(如 ChromaDB)存储历史对话,实现长上下文记忆。
  • 更多工具:集成天气查询、股票行情、代码解释器等更多外部工具。
  • 工作流编排:使用 LangGraph 等框架实现更复杂的多步任务规划。

3 小结

本文基于百度千帆大模型,使用 Langchain 和 Gradio 框架,用短短 100 行代码就构建出一个极简的智能体应用。该应用能够根据用户问题,选择不同的工具获取信息,并生成最终回答,体现了智能体最核心的三步循环:感知 - 决策 - 行动。

通过本文的学习,你应该掌握了构建基础 AI Agent 的核心流程。基于这个演示应用,相信聪明的你可以构建出更复杂、更智能的智能体应用,例如结合知识库检索(RAG)或自动化运维场景。

目录

  1. 1 什么是智能体?
  2. 2 示例:Mini AI Agent
  3. 2.1 效果演示
  4. 2.2 环境准备
  5. 申请账号:百度千帆
  6. 搭建本地开发环境:Jupyter Notebook
  7. 2.3 程序拆解
  8. 安装依赖
  9. 初始化大模型
  10. 定义函数
  11. 绑定函数
  12. 此处不能设定 streaming=True,否则无法激活函数回调
  13. 构建应用
  14. 彩蛋:智能体如何思考?
  15. 问题:120.230.93.202 属于哪个城市?
  16. 大模型响应结果
  17. 2.4 最佳实践与安全建议
  18. 2.5 扩展方向
  19. 3 小结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Sora2 Pro API Python 接入指南:4K 视频生成实战
  • 基于整洁架构优化 Gradle Module 设计与依赖管理
  • 2026 年值得关注的十大 JavaScript 框架
  • PETRV2-BEV 模型训练实战:Python 全流程代码解析
  • C++ 搜索二叉树:特性、实现与应用
  • C++ Lambda 表达式详解:语法、捕获与底层原理
  • C++ 基础:引用、inline 及 nullptr 用法
  • C++ 异常处理机制详解与避坑指南
  • PHP 原生查询性能与安全优化实战
  • C++ 并发模型:内存序、可见性与指令重排
  • 16 届蓝桥杯 Java 组省赛真题详解:思路与代码实现
  • LiuJuan20260223Zimage 镜像目录结构解析与模型权重规范
  • Llama 2 ONNX 模型快速部署指南
  • 鸿蒙应用性能优化与 Next 原生合规实践
  • Java 集成高德开放平台 WebAPI 实现 POI 搜索实践
  • Go Map 底层原理深度解析
  • 解决 Windows 下 Git 的“filename too long”错误
  • 2023-2024 年 Python 主要发展趋势与应用领域分析
  • Git 分支管理基础:创建、切换与合并实战
  • Python 异步编程与协程实战指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online