网站首页 > 技术文章 正文
如何从零开始创建自主 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 如何在没有外界帮助的情况下自行获取网站响应时间。
猜你喜欢
- 2025-05-21 如何编写Python漏洞验证脚本(单线程和多线程)
- 2025-05-21 Python 爬虫使用固定代理IP
- 2025-05-21 25-3-Python网络编程-UDP 编程示例和HTTP协议
- 2025-05-21 Langflow——高效构建和部署 AI 驱动的代理和工作流
- 2025-05-21 栋察宇宙:Python 中的 requests 库学习介绍
- 2025-05-21 手把手教你用Python盯死竞品组织变动!老板连夜加薪的监控术
- 2025-05-21 Google 在 Cloud Next 2025 发布最全面的 AI 代理战略
- 2025-05-21 免费的IP代理池
- 2025-05-21 「2022 年」崔庆才 Python3 爬虫教程 - 代理的基本原理
- 2025-05-21 使用Python构建高效的HTTP代理服务器
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)