如何學(xué)會(huì)從零開(kāi)始創(chuàng)建自主AI!
我们将从零开始用Python创建一个具有自主性的AI代理。
我们将不使用任何第三方库,如Langchain或CrewAI;我们将使用纯Python语言。
我们将通过这个简单的AI代理示例来帮助你理解AI代理的基本结构和开发流程。
什么是AI代理?如果我们询问像ChatGPT这样的AI:learnwithhasan.com的响应时间是多少?
你认为它可以回答这个问题吗?
如果你说“不”,那你是对的。
如果你回答 YES,那么你也是正确的。
值得注意的是,这两个答案都可以被认为是正确的。原因如下:
这里是ChatGPT对问题的回答:
它答不上来!
正如我们在提示工程中了解到的,提示工程的一个主要限制之一是它无法访问实时数据,它仅基于预先存在的训练数据生成响应。
请看现在的这个:
发生什么事了?!
自主AI代理:自主AI代理 💪
一个自主的人工智能代理将一个大型语言模型(LLM)与外部功能模块和增强的提示系统相结合。
要理解这个概念,让我们看看大型语言模型(LLM)是如何回答我们的问题的。
1- 查询输入: 首先,我们向大型语言模型提出问题。
2- 采用ReAct系统提示:LLM由一个ReAct系统提示驱动,使其能够思考如何回答问题。我们称之为思考过程,我们将在后续章节中进一步讨论这一点。
3- 执行外部功能: LLM 然后选择并执行一个外部功能,在这种情况下,是“_get_website_responsetime(url)。”
4- 响应生成: 实时获得的数据获取后,AI基于结果生成并发送响应。
开始在这份指南中,我们将从零开始使用Python构建AI代理。我们将从建立一个新的Python项目环境开始。
你可以选择任何你喜欢的IDE(即集成开发环境),但在本指南中,我将使用Visual Studio Code这款工具。
创建并激活一个虚拟环境- 打开终端。
- 创建一个虚拟环境并激活它。
或
如何安装OpenAI包(OpenAI)对于这个例子,我们将使用OpenAI API作为我们的大型语言模型,虽然你也可以使用来自Anthropic、_Gemini_或甚至开源模型的模型。
确保您已经准备好了API密钥。在您的项目中创建一个.env
文件,并按照以下方式添加您的密钥。
OPENAI_API_KEY = "sk-XX" # 开放AI API密钥
在激活虚拟环境之后,安装OpenAI的Python包。
pip install openai
在Python中安装openai库的命令
完成?✅
太好了
创建三个Python文件:actions.py
,prompts.py
,和main.py
。
你现在应该看到类似这样的内容
打开 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": "你好,你好吗?"},
{"role": "system", "content": "你是一个乐于助人的AI助手。"}
]
# 调用函数并使用测试消息
response = generate_text_with_conversation(test_messages)
print("AI Response:", response)
好了?棒极了!✅
现在我们的基本设置已经完成,我们可以开始着手构建代理的核心部分了。
定义函数段在本指南的这一部分,我们将明确我们的AI代理可以访问的功能或操作。这使代理能够在回答用户查询时利用这些外部功能资源。
实现基本功能打开 actions.py
文件。在此文件中,我们将定义一个简单的函数来模拟不同的网站的响应延迟。
def 获取响应时间(url):
if url == "learnwithhasan.com":
return 0.5
elif url == "google.com":
return 0.3
elif url == "openai.com":
return 0.4
else:
return None
这个示例函数根据提供的URL返回固定的响应时长。它作为一个基本的例子,帮助我们理解代理如何使用外部函数。
The ReAct提示:ReAct提示使我们的AI代理人能够模仿人类行为的关键。
这个系统提示信息引导模型经历思考、行动和反馈的过程,有效地处理用户的查询。
简而言之,ReAct提示指导模型思考用户的问题,理解该问题,决定如何回应,如有必要,选择一个行动,然后根据这些步骤以最佳方式回答问题。
我先分享这个提示,再解释一下。
定义ReAct提示在 prompts.py
文件中,添加以下系统提示的配置:
你在一个思考、行动、暂停、行动响应的循环中运行。
在循环结束时,你输出一个答案。
使用思考来理解你被问到的问题。
使用行动来运行可用的操作之一,然后返回暂停。
行动响应将是运行这些操作的结果。
你可用的操作有:
获取响应时间:
例如获取响应时间: learnwithhasan.com
返回一个网站的响应时间
示例会话:
问题:learnwithhasan.com 的响应时间是多少?
思考: 我应该先检查网页的响应时间。
行动:
{
"function_name": "get_response_time",
"function_parms": {
"url": "learnwithhasan.com"
}
}
暂停
你将再次被调用,带有以下内容:
行动响应: 0.5
然后输出:
答案:learnwithhasan.com 的响应时间是 0.5 秒。
此系统指令指示大型语言模型在思考-行动-响应循环中运行。
循环结构(思考-行动-暂停-行动反馈)指导LLM(大型语言模型)。
- 思考: 理解并解析查询。
- 行动: 从可用的动作中选择并执行相应的函数。
- 行动响应: 根据动作的结果来制定响应。
然后我们向LLM说明可用的操作,展示一个带有参数和简短描述的简单示例,以便模型了解该功能的含义。
您可以执行的操作有:
get_response_time:
比如:get_response_time: learnwithhasan.com
获取网站的响应时间
💡请确保函数名与你在Python中定义的函数名一致。
示例:会话然后我们展示一个示例,说明它是如何行动的,以回答一个样本查询。
最重要的是它将如何返回动作:
动作:
{
"function_name": "获取响应时间",
"function_parms": {
"url": "learnwithhasan.com"
}
}
你可以看到,我指示 LLM 以 JSON 格式 返回操作。
这将帮助我们在后续工作中处理和运行函数,就像你在最后部分将它们组合起来一样。
为什么要有循环?这种循环机制模仿了LLM(大型语言模型)的工作流程:理解问题,基于理解采取行动,并根据行动的结果作出回应。
该过程可以从简单的任务中的几个循环次数到更复杂的场景中的数百个循环不等。
把东西组合起来在建立了ReAct系统提示并定义了必要的功能之后,我们现在可以整合这些元素来构建我们的AI代理。
让我们回到 main.py
脚本来完成设置。
首先,列出代理可以使用的功能。在这个例子中,我们只有一个功能。
available_actions = {
"get_response_time": get_response_time
}
在这种情况下,我们只有一个功能。
这将使智能代理能够高效地选择正确的功能模块。
设置用户和系统指令定义用户提示内容以及将传递给之前创建的 generate_text_with_conversation
函数的消息内容。generate_text_with_conversation
函数用于生成文本。
user_prompt = "learnwithhasan.com的响应时间是多少?"
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt},
]
系统提示信息,以ReAct循环指令的形式提供,作为系统消息发送给OpenAI的大语言模型。
现在,OpenAI的LLM模型将被指导在一个思考、行动和行动结果的循环中!
创建代理循环实现一个循环来处理用户输入并应对AI响应:
turn_count = 1
max_turns = 5
while turn_count < max_turns:
print(f"循环次数: {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"未知的操作: {function_name}: {function_parms}")
print(f" -- 执行操作 {function_name} {function_parms}")
action_function = available_actions[function_name]
# 调用该函数
result = action_function(**function_parms)
function_result_message = f"操作响应: {result}"
messages.append({"role": "user", "content": function_result_message})
print(function_result_message)
else:
break
这个循环反映了ReAct循环,生成响应,提取JSON格式的功能调用,并执行相应的动作。
因此,我们生成了响应,并检查LLM是否返回了函数。
我创建了_extractjson方法,以便您能方便地从LLM响应中提取所需内容。
在以下的行中:
json_function = 从响应中提取的JSON
我们将检查 LLM 是否返回了一个需要执行的函数,如果是,它将执行该函数并将结果添加到消息列表中,因此在下一次交互中,LLM 可以使用 Action_response 来回应用户的查询。
请测试代理功能!您可以使用下方提供的链接下载完整的代码库来查看此代理的实际运行情况。
而且如果你想看到这一切的实际效果,并观看另一个代理示例,你可以观看这个免费视频:
对于更深入的探索和更多示例,可以查看我的完整课程内容,“使用Python从头开始构建AI代理”。
并且记得,如果你有任何疑问或遇到任何困难,我几乎每天都论坛上免费帮助你!
共同學(xué)習(xí),寫(xiě)下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
100積分直接送
付費(fèi)專(zhuān)欄免費(fèi)學(xué)
大額優(yōu)惠券免費(fèi)領(lǐng)