比大模型人才工资还高?教会你用python从零构建AI Agent
ztj100 2025-05-25 16:47 14 浏览 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 如何在没有外界帮助的情况下自行获取网站响应时间。
相关推荐
- 拒绝躺平,如何使用AOP的环绕通知实现分布式锁
-
如何在分布式环境下,像用synchronized关键字那样使用分布式锁。比如开发一个注解,叫@DistributionLock,作用于一个方法函数上,每次调方法前加锁,调完之后自动释放锁。可以利用Sp...
- 「解锁新姿势」 兄dei,你代码需要优化了
-
前言在我们平常开发过程中,由于项目时间紧张,代码可以用就好,往往会忽视代码的质量问题。甚至有些复制粘贴过来,不加以整理规范。往往导致项目后期难以维护,更别说后续接手项目的人。所以啊,我们要编写出优雅的...
- 消息队列核心面试点讲解(消息队列面试题)
-
Rocketmq消息不丢失一、前言RocketMQ可以理解成一个特殊的存储系统,这个存储系统特殊之处数据是一般只会被使用一次,这种情况下,如何保证这个被消费一次的消息不丢失是非常重要的。本文将分析Ro...
- 秒杀系统—4.第二版升级优化的技术文档二
-
大纲7.秒杀系统的秒杀活动服务实现...
- SpringBoot JPA动态查询与Specification详解:从基础到高级实战
-
一、JPA动态查询概述1.1什么是动态查询动态查询是指根据运行时条件构建的查询,与静态查询(如@Query注解或命名查询)相对。在业务系统中,80%的查询需求都是动态的,例如电商系统中的商品筛选、订...
- Java常用工具类技术文档(java常用工具类技术文档有哪些)
-
一、概述Java工具类(UtilityClasses)是封装了通用功能的静态方法集合,能够简化代码、提高开发效率。本文整理Java原生及常用第三方库(如ApacheCommons、GoogleG...
- Guava 之Joiner 拼接字符串和Map(字符串拼接join的用法)
-
Guave是一个强大的的工具集合,今天给大家介绍一下,常用的拼接字符串的方法,当然JDK也有方便的拼接字符串的方式,本文主要介绍guava的,可以对比使用基本的拼接的话可以如下操作...
- SpringBoot怎么整合Redis,监听Key过期事件?
-
一、修改Redis配置文件1、在Redis的安装目录2、找到redis.windows.conf文件,搜索“notify-keyspace-events”...
- 如何使用Python将多个excel文件数据快速汇总?
-
在数据分析和处理的过程中,Excel文件是我们经常会遇到的数据格式之一。本文将通过一个具体的示例,展示如何使用Python和Pandas库来读取、合并和处理多个Excel文件的数据,并最终生成一个包含...
- 利用Pandas高效处理百万级数据集,速度提升10倍的秘密武器
-
处理大规模数据集,尤其是百万级别的数据量,对效率的要求非常高。使用Pandas时,可以通过一些策略和技巧显著提高数据处理的速度。以下是一些关键的方法,帮助你使用Pandas高效地处理大型数据集,从而实...
- Python进阶-Day 25: 数据分析基础
-
目标:掌握Pandas和NumPy的基本操作,学习如何分析CSV数据集并生成报告。课程内容...
- Pandas 入门教程 - 第五课: 高级数据操作
-
在前几节课中,我们学习了如何使用Pandas进行数据操作和可视化。在这一课中,我们将进一步探索一些高级的数据操作技巧,包括数据透视、分组聚合、时间序列处理以及高级索引和切片。高级索引和切片...
- 原来这才是Pandas!(原来这才是薯片真正的吃法)
-
听到一些人说,Pandas语法太乱、太杂了,根本记不住。...
- python(pandas + numpy)数据分析的基础
-
数据NaN值排查,统计,排序...
- 利用Python进行数据分组/数据透视表
-
1.数据分组源数据表如下所示:1.1分组键是列名分组键是列名时直接将某一列或多列的列名传给groupby()方法,groupby()方法就会按照这一列或多列进行分组。按照一列进行分组...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 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)