比大模型人才工资还高?教会你用python从零构建AI Agent
ztj100 2025-05-25 16:47 40 浏览 0 评论
如何从零开始创建自主 AI 代理!
在本文中,外国程序员小哥将从零开始使用 Python 创建一个自主 AI 代理。
我们不会使用任何第三方库,例如 Langchain 或 CrewAI;我们将使用纯 Python!
将从一个非常基础的 AI 代理示例开始,帮助你理解 AI 代理的基本结构和开发过程。
什么是 AI 代理?
如果我们问一个 AI,如 google的响应时间是多少?
你认为它能回答吗?
如果你说不能,你是对的。
如果你说能,你也是对的!
有趣的是,这两个答案都可以认为是正确的。
原因如下:
如下是 AI 对这个问题的回答:
它无法回答!
在提示工程学中学到的是,LLM(大模型) 的一个主要限制是它不能访问实时数据,它只基于预先存在的训练数据生成响应。
然而,现在看看这个:
发生了什么?!
答案:自主 AI 代理
一个自主 AI 代理将大型语言模型(LLM)与外部功能和增强的提示机制结合起来。
为了理解这个概念,让我们看看 LLM 是如何回答问题的。
1- 查询输入:首先,我们将问题发送给 LLM。
2- 使用 ReAct 系统提示处理:LLM 通过 ReAct 系统提示得以思考这个问题以及如何回答它。我们称之为思考,我们将在下一节中进一步讨论。
3- 外部功能执行:然后 LLM 选择并执行一个外部功能,在本例中为“get_website_response_time(url)”。
4- 响应生成:获取了实时数据后,AI 根据结果制作并交付响应。
开始之前
在本指南中,将从头开始使用 Python 构建 AI 代理。开始设置一个新的 Python 项目。
你可以选择任何 IDE,但在本指南中,将使用 Visual Studio Code。
创建并激活虚拟环境
打开你的终端。
创建一个新的虚拟环境并激活它。可以用pip或者conda来搭建。
安装 OpenAI 包
在这个例子中,将使用 OpenAI API 作为我们的大型语言模型,尽管你也可以选择使用 Anthropic、Gemini 或甚至开源模型。
确保你的 API 密钥已准备好。在你的项目中创建一个 .env 文件并添加你的密钥,如下所示:
OPENAI_API_KEY = "sk-XX"
在虚拟环境激活的情况下,安装 OpenAI Python 包:
pip install openai
完成了吗?太好了
设置项目文件
创建三个 Python 文件,现在应该有这样的文件:
actions.py、prompts.py 和 main.py。
使用 OpenAI API 生成文本
打开 main.py 文件并创建一个简单的函数,使用 OpenAI API 生成文本。这个函数将为我们的 AI 代理提供数据处理
:以下为代码:
from openai import OpenAI
import os
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
# 创建 OpenAI 类的实例
openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def generate_text_with_conversation(messages, model = "gpt-3.5-turbo"):
response = openai_client.chat.completions.create(
model=model,
messages=messages
)
return response.choices[0].message.content
这个脚本从 .env 文件加载你的 API 密钥,并创建一个 OpenAI 实例来处理请求。
generate_text_with_conversation 函数很简单,接受两个参数——model 和 messages——来生成响应。
测试你的函数
在继续之前,让我们确保一切正常工作。通过模拟对话测试函数
# 定义消息列表以模拟对话
test_messages = [
{"role": "user", "content": "Hello, how are you?"},
{"role": "system", "content": "You are a helpful AI assistant"}
]
# 调用函数并传入测试消息
response = generate_text_with_conversation(test_messages)
print("AI Response:", response)
搞定了吗?
搞定了!完美!
现在基本设置已经完成,准备开始构建我们的代理的核心部分了。
定义函数
在本指南的这部分,将指定 AI 代理可以访问的操作或函数。这使代理能够在响应用户查询时使用外部功能。
创建基本功能
打开 actions.py 文件。在这里,将定义一个简单的函数来模拟不同网站的响应时间
def get_response_time(url):
if url == "findaisites.pro":
return 0.5
if url == "google.com":
return 0.3
if url == "openai.com":
return 0.4
这个虚拟函数根据提供的 URL 返回固定的响应时间。它作为一个基本示例,帮助我们理解代理如何利用外部函数。
ReAct 提示
ReAct 提示使我们的 AI 代理能够模仿人类行为。
这个系统提示通过一个思考、行动和响应的循环引导模型,使其能够有效地处理用户查询。
简而言之,ReAct 提示指示模型思考用户查询、理解它、决定如何回答、选择一个动作(如果需要的话),然后使用这个动作以最佳方式回答问题。
下面介绍提示词及其解释。
定义 ReAct 提示
在 prompts.py 文件中,添加以下系统提示配置:
system_prompt = """
You run in a loop of Thought, Action, PAUSE, Action_Response.
At the end of the loop you output an Answer.
Use Thought to understand the question you have been asked.
Use Action to run one of the actions available to you - then return PAUSE.
Action_Response will be the result of running those actions.
Your available actions are:
get_response_time:
e.g. get_response_time: findaisites.pro
Returns the response time of a website
Example session:
Question: what is the response time for learnwithhasan.com?
Thought: I should check the response time for the web page first.
Action:
{
"function_name": "get_response_time",
"function_parms": {
"url": "findaisites.pro"
}
}
PAUSE
You will be called again with this:
Action_Response: 0.5
You then output:
Answer: The response time for findaisites.pro is 0.5 seconds.
"""
此系统提示指示 LLM 在思考、行动和行动响应的循环中运行。
循环结构(思考、行动、暂停、行动响应)引导 LLM:
思考:理解并解释查询。
行动:从可用操作中选择并执行适当的功能。
行动响应:使用操作的结果来制定响应。 可用操作 然后告诉 LLM 哪些操作可用,显示一个简单的示例,其中包含参数和一个简单的描述,让模型知道该函数是关于什么的。
你可以使用的操作有: get_response_time: 例如:get_response_time: findaisites.pro返回网站的响应时间 确保将函数名称与你在 python 中定义的名称匹配。
示例会话
然后向 LLM 展示一个示例,说明它将如何回答一个样本查询。
这里最重要的部分是它将如何返回操作:
Action:
{
"function_name": "get_response_time",
"function_parms": {
"url": " findaisites.pro"
}
}
你可以看到,我指示 LLM 以 JSON 格式返回操作。
这将帮助我们稍后与函数一起工作,并在最后一部分中将事情放在一起时运行它们。
为什么要循环? 这种循环机制模仿了 LLM 的步骤:理解问题、根据该理解采取行动,并使用行动的结果进行响应。
这个过程可以从简单任务的几个循环到更复杂场景的数百个循环不等。
将事物放在一起 在建立了 ReAct 系统提示并定义了必要的功能之后,我们现在可以整合这些元素来构建我们的 AI 代理了。
回到 main.py 脚本来完成设置。
定义可用功能
首先,列出代理可以使用的功能。对于本例,只有一个:
available_actions = {
"get_response_time": get_response_time
}
这将使代理能够有效地选择正确的功能。
设置用户和系统提示
定义用户提示和将传递给我们之前创建的
generate_text_with_conversation 函数的消息:
user_prompt = "findaisites.pro 的响应时间是多少?"
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt},
]
系统提示作为系统消息提供,以 ReAct 循环指令的形式提供给 OpenAI LLM。
现在 OpenAI 的 LLM 模型将被指示以思考、行动和行动结果的循环方式行动!
创建代理循环
实现处理用户输入并处理 AI 响应的循环:
turn_count = 1
max_turns = 5
while turn_count < max_turns:
print (f"Loop: {turn_count}")
print("----------------------")
turn_count += 1
response = generate_text_with_conversation(messages, model="gpt-4")
print(response)
json_function = extract_json(response)
if json_function:
function_name = json_function[0]['function_name']
function_parms = json_function[0]['function_parms']
if function_name not in available_actions:
raise Exception(f"Unknown action: {function_name}: {function_parms}")
print(f" -- running {function_name} {function_parms}")
action_function = available_actions[function_name]
#call the function
result = action_function(**function_parms)
function_result_message = f"Action_Response: {result}"
messages.append({"role": "user", "content": function_result_message})
print(function_result_message)
else:
break
这个循环反映了 ReAct 循环,生成响应,提取 JSON 格式的函数调用,并执行适当的动作。
因此,程序生成响应,并检查 LLM 是否返回了一个函数。
创建 extract_json 方法,使您更容易从 LLM 响应中提取任何函数。
在以下行中:
json_function = extract_json(response)
将检查 LLM 是否返回了一个要执行的函数,如果是,它将执行并将结果附加到消息中,以便在下一个回合中,LLM 可以使用 Action_response 来回答用户查询。
小结
在这篇文章中,外国程序员小哥将带你了解如何从零开始,使用 Python 打造一个独立思考的 AI 代理。没用任何第三方库,纯手工打造!
小哥详细介绍了如何通过构建、定义功能和编写代码,使得 AI 能够执行实时动作并回答问题。他甚至还搭建了一个示例,展示 AI 如何在没有外界帮助的情况下自行获取网站响应时间。
相关推荐
- Python 操作excel的坑__真实的行和列
-
大佬给的建议__如何快速处理excelopenpyxl库操作excel的时候,单个表的数据量大一些处理速度还能接受,如果涉及多个表甚至多个excel文件的时候速度会很慢,还是建议用pandas来处理,...
- Python os.path模块使用指南:轻松处理文件路径
-
前言在Python编程中,文件和目录的操作是非常重要的一部分。为了方便用户进行文件和目录的操作,Python标准库提供了os模块。其中,os.path子模块提供了一些处理文件路径的函数和方法。本文主要...
- Python常用内置模块介绍——文件与系统操作详解
-
Python提供了多个强大的内置模块用于文件和系统操作,下面我将详细介绍最常用的几个模块及其核心功能。1.os模块-操作系统交互...
- Python Flask 建站框架实操教程(flask框架网页)
-
下面我将带您从零开始构建一个完整的Flask网站,包含用户认证、数据库操作和前端模板等核心功能。##第一部分:基础项目搭建###1.创建项目环境```bash...
- 为你的python程序上锁:软件序列号生成器
-
序列号很多同学可能开发了非常多的程序了,并且进行了...
- PO设计模式全攻略,在 UI 自动化中的实践总结(以企业微信为例)
-
一、什么是PO设计模式?PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个Page类,即一个py文件,并以页面为单位来写测试用例,实现页面对象和测试用例的...
- 这种小工具居然也能在某鱼卖钱?我用Python一天能写...
-
前两天在某鱼闲逛,本来想找个二手机械键盘,结果刷着刷着突然看到有人在卖——Word批量转PDF小工具...
- python打包成exe,程序有图标,但是任务栏和窗口都没有显示图标
-
代码中指定图标信息#设置应用ID,确保任务栏图标正确显示ifsys.platform=="win32":importctypesapp_id=...
- 使用Python构建电影推荐系统(用python做推荐系统)
-
在日常数据挖掘工作中,除了会涉及到使用Python处理分类或预测任务,有时候还会涉及推荐系统相关任务。...
- python爬取并分析淘宝商品信息(python爬取淘宝商品数据)
-
python爬取并分析淘宝商品信息背景介绍一、模拟登陆二、爬取商品信息1.定义相关参数2.分析并定义正则3.数据爬取三、简单数据分析1.导入库2.中文显示3.读取数据4.分析价格分布5.分析销售...
- OpenCV入门学习基础教程(从小白变大神)
-
Opencv是用于快速处理图像处理、计算机视觉问题的工具,支持多种语言进行开发如c++、python、java等,下面这篇文章主要给大家介绍了关于openCV入门学习基础教程的相关资料,需要的朋友可以...
- python图像处理-一行代码实现灰度图抠图
-
抠图是ps的最基本技能,利用python可以实现用一行代码实现灰度图抠图。基础算法是...
- 从头开始学python:如何用Matplotlib绘图表
-
Matplotlib是一个用于绘制图表的库。如果你有用过python处理数据,那Matplotlib可以更直观的帮你把数据展示出来。直接上代码看例子:importmatplotlib.pyplot...
- Python爬取爱奇艺腾讯视频 250,000 条数据分析为什么李诞不值得了
-
在《Python爬取爱奇艺52432条数据分析谁才是《奇葩说》的焦点人物?》这篇文章中,我们从爱奇艺爬取了5万多条评论数据,并对一些关键数据进行了分析,由此总结出了一些明面上看不到的数据,并...
- Python Matplotlib 库使用基本指南
-
简介Matplotlib是一个广泛使用的Python数据可视化库,它可以创建各种类型的图表、图形和可视化效果。无论是简单的折线图还是复杂的热力图,Matplotlib提供了丰富的功能来满足我们...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Python 操作excel的坑__真实的行和列
- Python os.path模块使用指南:轻松处理文件路径
- Python常用内置模块介绍——文件与系统操作详解
- Python Flask 建站框架实操教程(flask框架网页)
- 为你的python程序上锁:软件序列号生成器
- PO设计模式全攻略,在 UI 自动化中的实践总结(以企业微信为例)
- 这种小工具居然也能在某鱼卖钱?我用Python一天能写...
- python打包成exe,程序有图标,但是任务栏和窗口都没有显示图标
- 使用Python构建电影推荐系统(用python做推荐系统)
- python爬取并分析淘宝商品信息(python爬取淘宝商品数据)
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)