这篇文章是关于如何从头开始用Python创建AI智能体的完整指南。文章首先介绍了AI智能体的概念,然后通过一个基本的AI智能体示例来帮助理解AI智能体的基本结构和发展过程。接着,文章将转向一个高级的现实世界示例。
作者:
张长旺,图源:
旺知识
1 - 什么是AI智能体?
如果我们向像ChatGPT这样的AI提问:"learnwithhasan.com的响应时间是多少?" 你可能会认为它不能回答这个问题。
但如果你回答可以,你也是对的!
两个答案都可能被认为是正确的。原因如下:
ChatGPT对这个问题的回答是:
我不能提供特定网站响应时间的实时信息。响应时间可能会因服务器负载、互联网连接速度和地理位置等因素而有所不同。
有趣的是,它没有能够回答这个问题!
但是,看看现在发生了什么:
答案:
自治AI智能体
自治AI智能体将大型语言模型(LLM)与外部功能和增强的提示机制相结合。
为了理解这个概念,让我们看看LLM是如何能够回答我们的问题的。
1- 查询输入:首先,我们将我们的问题发送给LLM。
2- 使用ReAct系统提示进行处理:LLM由一个ReAct系统提示驱动,允许它思考问题以及应该如何回答。我们称之为一个思考。我们将在下一节中更详细地讨论这个问题。
3- 外部功能执行:然后LLM选择并执行一个外部功能,在这个例子中是"get_website_response_time(URL)"。
4- 响应生成:在获取实时数据后,AI根据结果制定并传递响应。
这种无缝集成思考、决策和行动的过程反映了人类的解决问题过程,展示了AI如何绕过传统的限制。
2 - 环境搭建
在本指南中,我们将使用Python从头开始构建AI智能体。让我们通过设置一个新的Python项目开始。你可以选择任何IDE,但在这个指南中,我将使用Visual Studio Code。
创建并激活虚拟环境
安装OpenAI包
在这个例子中,我们将使用OpenAI API作为我们的大型语言模型,尽管你也可以使用Anthropic、Gemini或开源模型。
确保你的API密钥已经准备好。在你的项目中创建一个
.env
文件并添加你的密钥:
在激活虚拟环境后,安装OpenAI Python包:
完成了吗?太好了。
设置你的项目文件
创建三个Python文件:
actions.py
、
prompts.py
和
main.py
。
你现在应该有类似这样的东西:
使用OpenAI API生成文本
打开
main.py
文件,创建一个简单的函数来使用OpenAI API生成文本。这个函数将为我们的AI智能体提供动力:
以下是代码:
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
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)
完成了吗?完美!
现在我们的基本设置已经完成,我们准备进入构建我们的智能体的核心部分。
3 - 定义功能
在本指南的这部分中,我们将指定我们的AI智能体可以访问的动作或功能。这使我们的智能体能够在响应用户查询时利用外部功能。
创建基本功能
打开
actions.py
文件。在这里,我们将定义一个简单的函数来模拟不同网站的响应时间:
def get_response_time(url):
if url == "learnwithhasan.com":
return 0.5
if url == "promptappgpt.wangzhishi.net":
return 0.3
if url == "openai.com":
return 0.4
这个虚拟函数根据提供的URL返回固定的响应时间。它作为一个基本示例帮助我们理解智能体如何利用外部功能。
理解设置
通过定义这些函数,我们建立了一个框架,AI智能体在需要时可以参考。
这种方法对于将现实世界的功能集成到我们的智能体中至关重要,我们将在后续部分更全面地探索。
接下来,我们将进入AI智能体的另一个重要组成部分:
ReAct系统提示
。
这将增强智能体以动态和上下文感知的方式思考和响应的能力。
4 - 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: learnwithhasan.com
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": "learnwithhasan.com"
}
}
PAUSE
You will be called again with this:
Action_Response: 0.5
You then output:
Answer: The response time for learnwithhasan.com is 0.5 seconds.
"""
这个系统提示指示LLM在思考、行动和行动响应的循环中运行。
循环结构(思考、行动、暂停、行动响应)引导LLM:
-
思考
:理解并解释查询。
-
行动
:从可用动作中选择并执行适当的功能。
-
行动响应
:使用行动的结果来制定响应。
可用动作
然后,我们告诉LLM有哪些动作可用,通过一个简单的例子,展示参数和简单的描述,以便模型理解功能。
Your available actions are:
get_response_time:
e.g. get_response_time: learnwithhasan.com
Returns the response time of a website
确保将函数名称与你在Python中定义的名称匹配。
示例会话
然后,我们向LLM展示了一个示例,展示它将如何行动以回答一个样本查询。
这里最重要的部分是它将如何
返回动作
:
Action:
{
"function_name": "get_response_time",
"function_parms": {
"url": "learnwithhasan.com"
}
}
你可以看到,我指示LLM以
JSON格式
返回动作。
这将帮助我们稍后在最后部分将事情整合起来时,使用函数并按你将要做的方式运行它们。
为什么是循环?
这种循环机制模仿了LLM采取的步骤:理解问题,基于该理解采取行动,并使用行动的结果来响应。
这个过程可能从简单任务的几个循环到更复杂场景的数百个不等。
5 - 系统整合
已经建立了ReAct系统提示并定义了必要的功能,我们现在可以整合这些元素来构建我们的AI智能体。
让我们回到我们的
main.py
脚本来完成设置。
定义可用功能
首先,列出智能体可以利用的函数。在这个例子中,我们只有一个:
available_actions = {
"get_response_time": get_response_time
}
在我们的情况下,我们只有一个函数。
这将使智能体能够高效地选择正确的函数。
设置用户和系统提示
定义用户提示和将传递给
generate_text_with_conversation
的消息,这是我们之前创建的函数:
user_prompt = "What is the response time for learnwithhasan.com?"
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt},
]
现在,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]
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来回答用户查询。
测试智能体
要看到这个智能体在行动中,您可以使用下面提供的链接下载完整的代码库:
6 - SEO审计员AI智能体
现在,在您通过我们的基本示例学习了如何从头开始构建AI智能体之后,让我们通过创建SEO审计员AI智能体来进入一个更实际的例子。这个智能体将展示现实世界的效用,并展示我们初始设置的适应性。
定义一个新功能
首先,我们将在actions.py
文件中为SEO审计定义一个函数: