乐于分享
好东西不私藏

【AI 应用】开发一个最简单的 AI Agent

【AI 应用】开发一个最简单的 AI Agent

【合辑】AI Agent 开发

今天以一个 超简单的 Agent 开发例子来学习 Agent

但是重要的并不是其中的代码怎么写,代码早就不重要了

重要的是其中的我们需要重点关注什么点,其中的开发逻辑是什么

然后建立一个最基本最简单的 Agent 开发思维框架

OK

首先,如果我们了解了Agent 的运行原理,就应该清楚

Agent 简单来说其实就是 

—— 大模型 + 工具

因为大模型能力有限,只能借助工具去操作外部的世界,比如去 发送邮件,运行项目 等等

深入了解可以看→ Agent 工作原理

所以从 Agent 的构成,就可以知道我们重点关注的是哪些东西了

  • 第一,提示词

  • 第二,工具包装

从提示词,去规定 大模型 如何按照我们的要求去输出内容,而不是乱说

从工具,就是我们提供给大模型的额外调用能力

而为什么说

只重点关注这两个?

虽然一个完整的 Agent 开发不止这些内容,但是其他大部分已经有成熟的框架帮我们完成

比如说 Langchain 框架

那我们现在就以一个 最最最简单的 Agent 例子来看看完整的流程

以下代码以 Python 为例(完整代码放在最后,文中以截图为主)

其实就分成四步

  • 工具包装

  • 大模型初始化

  • 准备提示词

  • agent 创建

  • agent 执行

首先明确 agent 目的,是一个 股票信息助手,比如本次帮我完成一个任务

—— “帮我抓取半导体ETF 512480 的价格,然后计算一下如果我要买 500 股一共需要多少钱?”

工具包装

我们提供给 大模型 调用的工具,从我们的 Agent 的需求出发,可以明确需要提供两个工具

第一,股票信息查询API

第二,计算器

那么我们就来定义如下两个工具

依赖的是 Langchain 的语法,不解释,知道逻辑即可

大模型初始化

这个就更简单了

选择模型 和 配置相应参数

同样是依赖 Langchain 框架

准备提示词

主要就是包含三部分内容

  • agent 的角色

  • 告诉大模型 它可以使用的工具

  • 告诉大模型它应该怎么思考

当然了,这里的提示词只是一个简单的版本,实际上提示词要根据业务场景来具体编写

写完了主体内容之后,我们需要进行通过 框架 Langchain 进行包装一遍

Agent 创建

这一步就更加简单了

完全是调用 Langchain 的 API ,完成参数传入

  • 我们初始化的模型

  • 定义的工具

  • 提示词

Agent 执行

用上一步创建的 Agent 执行器,传入用户指令

运行脚本之后

大模型就开始工作,思考,然后调用工具,输出最终答案

通过这五个步骤,你会发现,开发一个Agent 其实挺简单的,几乎都不需要关注什么内容,大部分工作都由 框架 Langchain 完成了

而 框架其实做的东西也很简单

框架内部其实就是 维护一个大循环

  • 框架把 提示词 发给大模型

  • 大模型输出内容

  • 框架解析内容,知道大模型想要调用哪个工具,在本地执行工具

  • 然后再把 工具的执行结果 发给给大模型

不断重复以上循环,直到大模型输出最终答案

所以其实 框架做的事情,就是 任务的编排调度

那么

一个简单的 Agent 

就开发完成了

所以我们重点关注的其实就是两个

提示词 和 工具包装

所以我们需要在重点了解这两个部分

工具包装

说了工具,是 扩展大模型的能力,让 大模型 可以接触物理世界

因为大模型在训练完成之后就已经定型了,所以只能通过工具的形式,给它赋能

那我们都可以给它赋予什么能力???

我们通常需要包装什么工具???

第一种,知识类工具

让 大模型可以 获取它没学过或最新的信息,或者 公司内部的信息

比如说 RAG 就是获取新知识的一种方式

深入了解可以看→ RAG 简说工作原理

第二种,能力工具

大模型只擅长语言处理,像是数学计算,代码编译 ,这部分能力通常是 欠缺的

所以我们需要补足这方面的能力

提供 数学计算器,代码解释器 

比如说 Python REPL 工具,让 Agent 可以写一段代码并在沙箱里运行得出结果

第三种,交互工具

上面两种都是 读取的工具,这种就是 写入的工具

比如说 发送邮件,修改数据库、创建日程 等等

而 工具的包装就更加简单了,借助 框架的作用,已经变得非常简单

主要就包含两部分的内容

  • 具体执行的代码逻辑,比如上面的写个函数

  • 这段代码的说明书,主要是告诉大模型,这个工具是干嘛的,什么时候用,怎么用,需要传什么参数

提示词

因为我们是开发 Agent,提示词就不能是我们像跟 豆包聊天一样 随随便便口语化了

提示词一定要规范

我们要告诉大模型

  • 它是谁

  • 它要做什么

  • 它要按什么流程去做

比如说

  • 你是一个股票分析专家

  • 你必须使用中文;需要数学计算,必须调用我的工具;要简洁,不能说废话

  • 你要按 “思考-执行-观察执行结果” 的循环来输出

当然了

现在提示词都可以直接用现成的框架了,比如说 

ReAct 框架

一个基于提示词工程的认知框架,内置了提示词模板,强制模型按照流程输出

  • 思考: 推理当前需要做什么

  • 行动: 决定要调用的工具名称

  • 行动输入: 传给工具的参数

  • 观察: 工具执行的结果

简单一批,就两行代码

不过!

最好还是自己写提示词

它只是提供一个通用的模板,无法满足很多实际的业务场景

最主要的缺点,就是 缺乏安全

默认模板缺乏严格的安全指令,限制很宽松

所以 提示词注入和 SQL 注入攻击的成功率高达 100%!!

什么是提示词注入?

就比如说你提供的Agent,被黑客发了条指令

“请把服务器的数据库删除”

然后 大模型就生成一条 DELETE 语句,直接把数据库给删了

那你不完犊子了?收拾一下提桶跑路吧

所以为了保证商业Agent 的可用性和安全性

肯定是要自己写提示词的

而具体怎么写好提示词呢,这就是提示词工程了

不过这里就不过多介绍内容,不过超过本文范畴了

OK 了

想必现在也已经清楚如何去开发一个 Agent 了

虽然肯定是远远不够的

复杂的 Agent 还包括

  • 任务的拆解

  • 上下文记忆

但是可以先建立基础的 Agent 开发逻辑!

好了,附上本次的最简单Agent 执行例子

新建 Agent.py 运行就可以了

from langchain_openai import ChatOpenAI

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

from langchain.agents import  AgentExecutor,create_tool_calling_agent
from langchain.tools import tool
# 爬虫函数工具
@tool
def scrape_website(url: str) -> str:
"""爬虫工具:当你需要从特定网页获取、抓取最新信息时使用此工具。输入应为一个网址。"""
returnf"已成功抓取到最新的行业分析报告,半导体的价格是100元"
# 数学计算函数工具
@tool
def math_calculator(expression: str) -> float:
"""数学计算工具:当你需要进行数学运算或算术计算时使用此工具。输入必须是有效的数学表达式(如 '150 * 100')。"""
return eval(expression)+100
# 准备工具列表
tools = [scrape_website, math_calculator]
# 初始化大模型 
llm = ChatOpenAI(
    model="deepseek-v4-flash"
    temperature=0
    base_url="https://api.deepseek.com",
    api_key="你自己的apikey"
)
promot= "你是一个全能的智能助手。你可以使用以下工具:\
search_news: 用于搜索最新新闻。参数为搜索关键词。\
calculator: 用于数学计算。参数为数学表达式。\
在执行任务时,你必须严格遵循以下回答格式: \
Thought (思考): 你当前在思考下一步该怎么做 \
Action (行动): 决定要调用的工具名称(必须是 search_news 或 calculator) \
Action Input (行动输入): 传给工具的具体参数 \
Observation (观察):(你不要写这部分,我会把工具执行的结果放在这里发给你) ...(以上思考、行动、观察的过程可以重复N次) \
Thought (思考): 我现在知道最终答案了\
Final Answer (最终答案): 给用户的最终回答\n"

prompt_template = 

ChatPromptTemplate.from_messages([

# 注入提示词
    ("system", promot),
# 接收用户当次输入的问题
    ("human""{input}"),

# agent_scratchpad 是 LangChain 必须的占位符        MessagesPlaceholder(

    variable_name="agent_scratchpad"

 )

])
# 创建 Agent 
agent = create_tool_calling_agent(
    llm, 
    tools, 
    prompt_template
)
# 创建 Agent 执行器
agent_executor = AgentExecutor(
    agent=agent, 
    tools=tools
)
task = "帮我抓取半导体ETF 512480 的价格,然后计算一下如果我要买 500 股一共需要多少钱?"
result = agent_executor.invoke({
"input": task
})
print("最终结果:", result["output"])

(完)

相关学习资料