如何从零开始构建人工智能代理?

如何从零开始构建人工智能代理?

有没有想过 Siri 和 Alexa 等人工智能代理是如何工作的?这些智能系统在我们的日常生活中正变得越来越重要。本文将介绍 ReAct 模式,这是一种通过将推理和行动技能相结合来增强人工智能代理的方法。我们将向你展示如何从零开始构建一个人工智能代理,包括基本工具、库和实施步骤。

学习目标

  • 掌握人工智能代理的基本概念及其在各种应用中的意义。
  • 学习如何在人工智能代理中实现“推理+行动”(ReAct)模式,以增强其能力。
  • 设置从零开始构建人工智能代理所需的必要工具和库。
  • 使用 Python 开发人工智能代理,整合各种操作,并实现推理循环。
  • 有效测试和调试人工智能代理,确保其按预期运行。
  • 提高人工智能代理的稳健性和安全性,并增加更多功能。
  • 确定人工智能代理的实际应用并了解其未来前景。

什么是人工智能代理?

人工智能代理是一种自我管理的生物,它利用传感器来监视周围环境、处理信息并完成预定目标。它们可以是基本的机器人,也可以是随着时间推移不断调整和学习的复杂系统。典型的例子包括 Netflix 和亚马逊的推荐引擎、Siri 和 Alexa 等聊天机器人,以及特斯拉和 Waymo 的自动驾驶汽车。

在许多行业中,这些代理也是必不可少的: UiPath 和 Blue Prism 是机器人流程自动化(RPA)程序的典范,可将重复性流程自动化。DeepMind 和 IBM Watson Health 是医疗诊断系统的典范,可帮助诊断疾病并提出治疗建议。在这些领域,人工智能代理大大提高了工作效率、精确度和定制化程度。

人工智能代理为何重要?

这些代理在改善我们的日常生活和实现特定目标方面发挥着至关重要的作用。

人工智能代理之所以重要,是因为它们可以

  • 降低完成常规操作所需的人力,从而提高产量和效率。
  • 分析海量数据,提供支持决策的结论和建议。
  • 利用聊天机器人和虚拟助理提供个性化的互动和帮助。
  • 在银行、交通和医疗保健等行业实现复杂应用。

从本质上讲,人工智能代理在推动下一波技术进步、使系统更智能、更能满足用户需求方面起着举足轻重的作用。

人工智能代理的应用和使用案例

人工智能代理在各行各业都有广泛的应用。以下是一些著名的使用案例:

  • 客户服务:聊天机器人和虚拟助理形式的人工智能代理可以处理客户咨询、解决问题并提供个性化支持。它们可以全天候运行,提供一致、高效的服务。
  • 金融:金融预测、算法交易和欺诈检测都是人工智能代理的应用领域。它们根据市场趋势进行交易,检查交易数据,发现可疑模式。
  • 医疗保健:人工智能代理可协助诊断疾病、推荐治疗方法和监测患者健康状况。它们分析医疗数据、提供见解并支持临床决策。
  • 营销:人工智能代理可个性化营销活动、细分受众并优化广告支出。它们分析客户数据,预测行为,并根据个人喜好定制内容。
  • 供应链管理:人工智能系统可以估计需求、提高库存水平并简化物流。它们检查来自制造商、供应商和零售商的信息,以确保顺利运营。

ReAct模式简介

ReAct 模式的工作循环是:思考(Thought)、 行动(Action)、暂停(Pause)、观察(Observation)、回答(Answer)。

这个循环允许人工智能代理对输入进行推理,利用外部资源对输入采取行动,然后将结果整合回推理过程。通过这种方式,人工智能代理可以提供更准确、更贴近上下文的回应,从而大大提高其实用性。

ReAct 模式是一种有效的设计模式,它将推理和行动技能结合起来,提高了人工智能代理的能力。GPT-3 或 GPT-4 等 LLM 从这种技术中获益匪浅,因为它允许 LLM 与其他工具和应用程序接口对接,以开展超出其原始编程范围的活动。

ReAct 模式以循环方式运行,包括以下步骤:

  • 思考:人工智能代理处理输入信息,并思考需要做什么。这包括理解问题或命令,并确定要采取的适当行动。
  • 行动:根据推理,代理执行预定义的操作。这可能涉及搜索信息、执行计算或与外部 API 交互。
  • 暂停:代理等待操作完成。这是一个关键步骤,在这一步中,代理会暂停以接收所执行操作的结果。
  • 观察:代理观察操作结果。它分析从操作中获得的输出,以了解获得的信息或结果。
  • 回答:代理使用观察到的结果生成回复。然后将该回复提供给用户,完成循环。

使用ReAct的重要性和好处

ReAct 模式之所以重要,有以下几个原因:

  • 增强能力:通过整合外部行动,人工智能代理可以执行需要特定信息或计算的任务,从而增强其整体能力。
  • 提高准确性:该模式允许人工智能代理获取实时信息并进行精确计算,从而做出更精确、更相关的响应。
  • 灵活性:ReAct 模式使人工智能代理更灵活,更能适应各种任务。它们可以与不同的应用程序接口和工具交互,执行各种操作。
  • 可扩展性:这种模式允许随着时间的推移增加新的操作和功能,使人工智能代理具有可扩展性和面向未来。
  • 现实世界应用:ReAct 模式使人工智能代理能够部署在真实世界的场景中,与动态环境进行交互,并提供有价值的见解和帮助。

所需的工具和库

Python 是一种通用且功能强大的编程语言,因其简单易用和广泛的库支持而广泛应用于人工智能和机器学习领域。要构建人工智能代理,几个 Python 库是必不可少的:

  • OpenAI API:通过该库,您可以与 OpenAI 的语言模型(如 GPT-3 和 GPT-4)进行交互。它提供了生成文本、回答问题和执行各种语言相关任务所需的功能。
  • httpx:这是一个强大的 Python HTTP 客户端,支持异步请求。它用于与外部 API 交互、获取数据和执行网络搜索。
  • re:该模块支持 Python 中的正则表达式。它用于解析和匹配字符串中的模式,这对处理人工智能代理的响应非常有用。

OpenAI API和httpx库

OpenAI API 是一个强大的平台,可访问 OpenAI 开发的高级语言模型。这些模型可以理解并生成类似人类的文本,因此非常适合构建人工智能代理。使用 OpenAI API,您可以

  • 根据提示生成文本
  • 回答问题
  • 执行语言翻译
  • 总结文本
  • 还有更多

httpx 库是 Python 的 HTTP 客户端,支持同步和异步请求。它设计得易于使用,同时提供了强大的网络请求功能。使用 httpx,您可以

  • 发送 GET 和 POST 请求
  • 处理 JSON 响应
  • 管理会话和 cookie
  • 执行异步请求以提高性能

OpenAI API 和 httpx 库共同提供了构建和增强人工智能代理所需的基础工具,使它们能够与外部资源交互并执行各种操作。

设置环境

现在,让我们按照以下步骤设置环境:

Step1:安装所需的库

要开始构建人工智能代理,您需要安装必要的库。以下是设置环境的步骤:

  • 安装 Python:确保系统中已安装 Python。您可以从 Python 官方网站下载:
  • 设置虚拟环境:为项目创建一个虚拟环境来管理依赖关系是个不错的做法。运行以下命令设置虚拟环境:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
python -m venv ai_agent_env
source ai_agent_env/bin/activate # On Windows, use `ai_agent_env\Scripts\activate`
python -m venv ai_agent_env source ai_agent_env/bin/activate # On Windows, use `ai_agent_env\Scripts\activate`
python -m venv ai_agent_env
source ai_agent_env/bin/activate  # On Windows, use `ai_agent_env\Scripts\activate`
  • 安装 OpenAI API 和 httpx:使用 pip 安装所需的库:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
pip install openai httpx
pip install openai httpx
pip install openai httpx
  • 安装其他库:您可能还需要其他库,如用于正则表达式的 re 库,它已包含在 Python 标准库中,因此无需单独安装。

第 2 步:设置 API 密钥和环境变量

要使用 OpenAI API,您需要一个 API 密钥。请按照以下步骤设置 API 密钥:

  • 获取 API 密钥:在 OpenAI 网站上注册一个账户,然后从 API 部分获取 API 密钥。
  • 设置环境变量:将 API 密钥存储在环境变量中,以确保其安全。在您的 .bashrc 或 .zshrc 文件中添加以下一行(或使用适合您操作系统的方法):
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
export OPENAI_API_KEY='your_openai_api_key_here'
export OPENAI_API_KEY='your_openai_api_key_here'
export OPENAI_API_KEY='your_openai_api_key_here'
  • 在代码中添加访问 API 密钥:在 Python 代码中,您可以使用 os 模块访问 API 密钥:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import os
openai.api_key = os.getenv('OPENAI_API_KEY')
import os openai.api_key = os.getenv('OPENAI_API_KEY')
import os
openai.api_key = os.getenv('OPENAI_API_KEY')

环境设置完成后,您就可以开始构建人工智能代理了。

构建人工智能代理

现在让我们来构建人工智能代理。

创建人工智能代理的基本结构

为了构建人工智能代理,我们将创建一个类来处理与 OpenAI API 的交互,并管理推理和操作。下面是一个可以开始使用的基本结构:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import openai
import re
import httpx
class ChatBot:
def __init__(self, system=""):
self.system = system
self.messages = []
if self.system:
self.messages.append({"role": "system", "content": system})
def __call__(self, message):
self.messages.append({"role": "user", "content": message})
result = self.execute()
self.messages.append({"role": "assistant", "content": result})
return result
def execute(self):
completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=self.messages)
return completion.choices[0].message.content
import openai import re import httpx class ChatBot: def __init__(self, system=""): self.system = system self.messages = [] if self.system: self.messages.append({"role": "system", "content": system}) def __call__(self, message): self.messages.append({"role": "user", "content": message}) result = self.execute() self.messages.append({"role": "assistant", "content": result}) return result def execute(self): completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=self.messages) return completion.choices[0].message.content
import openai
import re
import httpx
class ChatBot:
def __init__(self, system=""):
self.system = system
self.messages = []
if self.system:
self.messages.append({"role": "system", "content": system})
def __call__(self, message):
self.messages.append({"role": "user", "content": message})
result = self.execute()
self.messages.append({"role": "assistant", "content": result})
return result
def execute(self):
completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=self.messages)
return completion.choices[0].message.content

该类使用可选的系统消息初始化人工智能代理,并处理用户交互。__call__方法接收用户信息,并使用 OpenAI API 生成响应。

实现ReAct模式

要实现 ReAct 模式,我们需要定义“思考”、“行动”、“暂停”、“观察”和 “回答”的循环。以下是我们如何将其融入人工智能代理的方法:

定义提示

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
prompt = """
You run in a loop of Thought, Action, PAUSE, Observation.
At the end of the loop you output an Answer.
Use Thought to describe your thoughts about the question you have been asked.
Use Action to run one of the actions available to you - then return PAUSE.
Observation will be the result of running those actions.
Your available actions are:
calculate:
e.g. calculate: 4 * 7 / 3
Runs a calculation and returns the number - uses Python so be sure to use floating point
syntax if necessary
wikipedia:
e.g. wikipedia: Django
Returns a summary from searching Wikipedia
simon_blog_search:
e.g. simon_blog_search: Django
Search Simon's blog for that term
Example session:
Question: What is the capital of France?
Thought: I should look up France on Wikipedia
Action: wikipedia: France
PAUSE
You will be called again with this:
Observation: France is a country. The capital is Paris.
You then output:
Answer: The capital of France is Paris
""".strip()
prompt = """ You run in a loop of Thought, Action, PAUSE, Observation. At the end of the loop you output an Answer. Use Thought to describe your thoughts about the question you have been asked. Use Action to run one of the actions available to you - then return PAUSE. Observation will be the result of running those actions. Your available actions are: calculate: e.g. calculate: 4 * 7 / 3 Runs a calculation and returns the number - uses Python so be sure to use floating point syntax if necessary wikipedia: e.g. wikipedia: Django Returns a summary from searching Wikipedia simon_blog_search: e.g. simon_blog_search: Django Search Simon's blog for that term Example session: Question: What is the capital of France? Thought: I should look up France on Wikipedia Action: wikipedia: France PAUSE You will be called again with this: Observation: France is a country. The capital is Paris. You then output: Answer: The capital of France is Paris """.strip()
prompt = """
You run in a loop of Thought, Action, PAUSE, Observation.
At the end of the loop you output an Answer.
Use Thought to describe your thoughts about the question you have been asked.
Use Action to run one of the actions available to you - then return PAUSE.
Observation will be the result of running those actions.
Your available actions are:
calculate:
e.g. calculate: 4 * 7 / 3
Runs a calculation and returns the number - uses Python so be sure to use floating point
syntax if necessary
wikipedia:
e.g. wikipedia: Django
Returns a summary from searching Wikipedia
simon_blog_search:
e.g. simon_blog_search: Django
Search Simon's blog for that term
Example session:
Question: What is the capital of France?
Thought: I should look up France on Wikipedia
Action: wikipedia: France
PAUSE
You will be called again with this:
Observation: France is a country. The capital is Paris.
You then output:
Answer: The capital of France is Paris
""".strip()

定义查询函数

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
action_re = re.compile('^Action: (\w+): (.*)
action_re = re.compile('^Action: (\w+): (.*)
action_re = re.compile('^Action: (\w+): (.*)

查询函数通过向人工智能代理发送问题、解析操作、执行操作并将观察结果反馈到循环中来运行 ReAct 循环。

执行操作

现在让我们来看看执行行动。

执行:维基百科搜索

维基百科搜索操作允许人工智能代理在维基百科上搜索信息。下面是如何执行该操作:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def wikipedia(q):
response = httpx.get("https://en.wikipedia.org/w/api.php", params={
"action": "query",
"list": "search",
"srsearch": q,
"format": "json"
})
return response.json()["query"]["search"][0]["snippet"]
def wikipedia(q): response = httpx.get("https://en.wikipedia.org/w/api.php", params={ "action": "query", "list": "search", "srsearch": q, "format": "json" }) return response.json()["query"]["search"][0]["snippet"]
def wikipedia(q):
response = httpx.get("https://en.wikipedia.org/w/api.php", params={
"action": "query",
"list": "search",
"srsearch": q,
"format": "json"
})
return response.json()["query"]["search"][0]["snippet"]

执行:博客搜索

博客搜索操作允许人工智能代理搜索特定博客上的信息。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def simon_blog_search(q):
response = httpx.get("https://datasette.simonwillison.net/simonwillisonblog.json", params={
"sql": """
select
blog_entry.title || ': ' || substr(html_strip_tags(blog_entry.body), 0, 1000) as text,
blog_entry.created
from
blog_entry join blog_entry_fts on blog_entry.rowid = blog_entry_fts.rowid
where
blog_entry_fts match escape_fts(:q)
order by
blog_entry_fts.rank
limit
1
""".strip(),
"_shape": "array",
"q": q,
})
return response.json()[0]["text"]
def simon_blog_search(q): response = httpx.get("https://datasette.simonwillison.net/simonwillisonblog.json", params={ "sql": """ select blog_entry.title || ': ' || substr(html_strip_tags(blog_entry.body), 0, 1000) as text, blog_entry.created from blog_entry join blog_entry_fts on blog_entry.rowid = blog_entry_fts.rowid where blog_entry_fts match escape_fts(:q) order by blog_entry_fts.rank limit 1 """.strip(), "_shape": "array", "q": q, }) return response.json()[0]["text"]
def simon_blog_search(q):
response = httpx.get("https://datasette.simonwillison.net/simonwillisonblog.json", params={
"sql": """
select
blog_entry.title || ': ' || substr(html_strip_tags(blog_entry.body), 0, 1000) as text,
blog_entry.created
from
blog_entry join blog_entry_fts on blog_entry.rowid = blog_entry_fts.rowid
where
blog_entry_fts match escape_fts(:q)
order by
blog_entry_fts.rank
limit
1
""".strip(),
"_shape": "array",
"q": q,
})
return response.json()[0]["text"]

执行:计算

计算操作允许人工智能代理执行数学计算。下面介绍如何执行:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def calculate(what):
return eval(what)
def calculate(what): return eval(what)
def calculate(what):
return eval(what)

为人工智能代理添加动作

接下来,我们需要在字典中注册这些操作,以便人工智能代理可以使用它们:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
known_actions = {
"wikipedia": wikipedia,
"calculate": calculate,
"simon_blog_search": simon_blog_search
}
known_actions = { "wikipedia": wikipedia, "calculate": calculate, "simon_blog_search": simon_blog_search }
known_actions = {
"wikipedia": wikipedia,
"calculate": calculate,
"simon_blog_search": simon_blog_search
}

将行动与人工智能代理集成

要将操作与人工智能代理集成,我们需要确保查询函数能够处理不同的操作,并将观察结果反馈到推理循环中。下面是完成集成的方法:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def query(question, max_turns=5):
i = 0
bot = ChatBot(prompt)
next_prompt = question
while i < max_turns:
i += 1
result = bot(next_prompt)
print(result)
actions = [action_re.match(a) for a in result.split('\n') if action_re.match(a)]
if actions:
action, action_input = actions[0].groups()
if action not in known_actions:
raise Exception(f"Unknown action: {action}: {action_input}")
print(" -- running {} {}".format(action, action_input))
observation = known_actions[action](action_input)
print("Observation:", observation)
next_prompt = f"Observation: {observation}"
else:
return result
def query(question, max_turns=5): i = 0 bot = ChatBot(prompt) next_prompt = question while i < max_turns: i += 1 result = bot(next_prompt) print(result) actions = [action_re.match(a) for a in result.split('\n') if action_re.match(a)] if actions: action, action_input = actions[0].groups() if action not in known_actions: raise Exception(f"Unknown action: {action}: {action_input}") print(" -- running {} {}".format(action, action_input)) observation = known_actions[action](action_input) print("Observation:", observation) next_prompt = f"Observation: {observation}" else: return result
def query(question, max_turns=5):
i = 0
bot = ChatBot(prompt)
next_prompt = question
while i < max_turns:
i += 1
result = bot(next_prompt)
print(result)
actions = [action_re.match(a) for a in result.split('\n') if action_re.match(a)]
if actions:
action, action_input = actions[0].groups()
if action not in known_actions:
raise Exception(f"Unknown action: {action}: {action_input}")
print(" -- running {} {}".format(action, action_input))
observation = known_actions[action](action_input)
print("Observation:", observation)
next_prompt = f"Observation: {observation}"
else:
return result

通过这种设置,人工智能代理可以对输入进行推理、执行操作、观察结果并生成响应。

测试和调试

现在让我们按照步骤进行测试和调试。

运行示例查询

要测试人工智能代理,可以运行示例查询并观察结果。下面是几个示例:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
print(query("What does England share borders with?"))
print(query("What does England share borders with?"))
print(query("What does England share borders with?"))

运行示例查询

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
print(query("Has Simon been to Madagascar?"))
print(query("Has Simon been to Madagascar?"))
print(query("Has Simon been to Madagascar?"))

运行示例查询-2

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
print(query("Fifteen * twenty five"))
print(query("Fifteen * twenty five"))
print(query("Fifteen * twenty five"))

运行示例查询-3

调试常见问题

在测试过程中,您可能会遇到一些常见问题。下面是一些调试技巧:

  • API错误:确保正确设置了 API 密钥并拥有必要的权限。
  • 网络问题:检查您的网络连接,确保您调用的端点可以到达。
  • 不正确的输出:验证操作函数中的逻辑,确保它们返回正确的结果。
  • 未处理的操作:确保已知动作字典中定义了所有可能的动作。

改进人工智能代理

现在让我们来改进人工智能代理。

增强鲁棒性和安全性

让人工智能代理更稳健、更安全:

  • 验证输入:确保所有输入都经过适当验证,以防止注入攻击,尤其是在计算功能中。
  • 错误处理:在操作函数中实施错误处理,以优雅地管理异常。
  • 日志记录:添加日志记录,跟踪代理的操作和观察结果,以方便调试。

添加更多操作和功能

为增强人工智能代理的功能,您可以添加更多操作,例如

  • 天气信息:与天气 API 集成,获取实时天气数据。
  • 新闻搜索:实施新闻搜索操作,获取最新的新闻文章。
  • 翻译:使用翻译 API 添加翻译操作,以支持多语言查询。

真实世界应用

  • 客户支持:人工智能代理可以处理客户咨询、解决问题并提供个性化建议。
  • 医疗保健:人工智能代理可协助诊断疾病、推荐治疗方法并监控患者健康状况。
  • 金融:人工智能代理可检测欺诈行为、执行交易并提供财务建议。
  • 营销:人工智能代理可个性化营销活动、细分受众并优化广告支出。

未来前景与进步

随着机器学习、自然语言处理和人工智能伦理方面的进步,人工智能代理的未来充满希望。新兴趋势包括

  • 自主系统:能够处理复杂任务的更复杂的自主系统。
  • 人类与人工智能的协作:加强人类与人工智能代理之间的协作,以改进决策。
  • 道德人工智能:重点开发道德人工智能代理,优先考虑隐私、公平和透明度。

此外,请查看这篇文章,了解构建人工智能代理的具体步骤

小结

在本综合指南中,我们探讨了人工智能代理的概念、其意义以及增强其能力的 ReAct 模式。我们介绍了必要的工具和库,设置了环境,并从头开始构建了一个人工智能代理。我们还讨论了执行动作、将动作与人工智能代理集成以及测试和调试系统等问题。最后,我们探讨了人工智能代理在现实世界中的应用和未来前景。

通过学习本教学指南,你现在已经掌握了从零开始创建自己的人工智能代理的知识。尝试不同的操作,增强代理的能力,在令人兴奋的人工智能领域探索新的可能性。

  • 了解人工智能代理的核心概念和意义。
  • 实施 ReAct 模式,让人工智能代理执行动作并对其观察结果进行推理。
  • 了解 OpenAI API、httpx 和 Python 正则表达式等基本工具和库。
  • 从零开始构建人工智能代理的详细指南,包括定义动作和集成动作。
  • 有效测试和调试人工智能代理的技巧。
  • 增强人工智能代理能力并确保其稳健性和安全性的策略。
  • 人工智能代理在各行各业的应用实例及其未来发展。

评论留言