如何入門AI代理:新手指南
Qwen生成的照片
最近,随着AI代理的兴起,人工智能越来越受到关注。许多公司已经开始构建代理并将其整合到自己的业务中。如今,这一趋势发展得如此之快,几乎任何东西都可以被做成代理。对于任何想要进入这一领域的人来说,通常都会有一个共同的问题:如何开始。本指南将用简单易懂的方式帮助你入门。
什么是AI助手?一个AI代理人是一种软件程序,能够感知环境,处理信息并采取行动来完成任务。AI代理人被设计为可以自主做决策并执行任务,而无需持续的人类干预。AI代理人可以应用于例如医疗、金融、机器人等各个领域等等。
人工智能的一个关键优势是它们能够提高决策能力,自动化重复性任务,并个性化用户体验。例如,一个AI助手可以管理您的日历,安排会议、发送提醒,并优先安排事件根据您的偏好。同样,在客户服务领域,AI助手可以处理查询,提供推荐和解决方案,并高效解决各种问题。
什么是工具?在构建代理的过程中,工具是重要的组成部分,可以帮助我们增强代理的功能。这些工具可以被视为外部资源或功能,帮助代理更高效地解决问题和完成任务。例如,我们有诸如代码解释器、搜索引擎和数据库这样的工具。
挑选正确的框架下一步是选择适合构建我们代理的合适框架。你可以参考以下框架:
i) LangChain - LangChain 提供构建 AI 代理所需的工具。这些代理可以推理、检索信息,并与外部环境互动。
ii) LangGraph — LangGraph 是 LangChain 的一个扩展版本。它允许用户使用大型语言模型构建有状态的多角色应用程序。
iii) CrewAI — CrewAI 是一个强大的框架工具,用于设计和开发多个代理的AI系统,其中不同的AI代理协同工作来完成复杂的任务。
iv) Smolagents — SmolAgents 是一个轻量级的框架,旨在创建简约的 AI 代理,这些代理能够与 API、数据库以及外部工具交互。它侧重于简洁和高效,非常适合小型且有针对性的 AI 自动化任务。
v) AutoGPT — 专为几乎不需要人工干预的完全自主运行的人工智能代理设计。
接下来我还会在文章中详细介绍这些框架。这些框架都是构建代理时的最佳选择,你可以根据需要使用其中一个或全部。
现在我们了解了代理是什么,让我们演示如何使用LangGraph来构建它。
构建一个简单的ReAct代理程序一个ReAct代理是一种AI代理,它结合了推理(Re)和行动(Act)在交互循环中做出决定。当创建一个ReAct代理时,LLM首先进行一个推理阶段以决定使用哪些工具,然后再生成最终响应。
在本教程中,我们将按照以下关键步骤来构建一个ReAct智能体。
- 工具配置: 集成不同的工具,例如创建自定义工具和使用网络搜索工具功能。
- 创建代理角色: 学习如何在LangChain中实现并使用ReAct代理。
拿到API密钥
- 在Live Score API平台上创建一个账户。
- 在个人资料中找到你的api_key和api_secret。
- 安全地保存这些凭证到.env文件中。
- 前往Open AI平台并创建一个API密钥。
- 也将这个密钥添加到你的.env文件中。
ii. 整合 API
我们希望构建一个定制工具,可以获取任何国家的所有即将进行的足球赛事。为此,我们使用Live Score API来查询赛事端点以获取这些赛事。
下面的代码演示了如何调用 API。
import requests
import os
from langchain.tools import tool
from dotenv import load_dotenv
load_dotenv() # 从 .env 文件中加载 API 密钥
api_key = os.getenv("SPORT_api_key")
api_secret = os.getenv("SPORT_api_secret")
class FootballData:
"""
一个根据国家名称获取即将进行的足球比赛的类。
"""
def __init__(self):
self.BASE_URL = "https://livescore-api.com/api-client"
self.api_key = api_key
self.api_secret = api_secret
def get_country_id(self, country_name):
"""通过国家名称获取国家 ID。"""
url = f"{self.BASE_URL}/countries/list.json?key={self.api_key}&secret={self.api_secret}"
response = requests.get(url).json()
for country in response["data"]["country"]:
if country["name"].lower() == country_name.lower():
return country["id"]
return None
def get_competition_ids(self, country_id):
"""获取给定国家 ID 的所有赛事的 ID。"""
url = f"{self.BASE_URL}/competitions/list.json?key={self.api_key}&secret={self.api_secret}&country_id={country_id}"
response = requests.get(url).json()
return [comp["id"] for comp in response["data"]["competition"]]
def get_upcoming_fixtures(self, competition_ids):
"""获取给定赛事 ID 的所有即将进行的比赛。"""
fixtures = []
for comp_id in competition_ids:
url = f"{self.BASE_URL}/fixtures/matches.json?key={self.api_key}&secret={self.api_secret}&competition_id={comp_id}"
response = requests.get(url).json()
if "fixtures" in response["data"]:
fixtures.extend(response["data"]["fixtures"])
return fixtures
def get_upcoming_matches(self, country_name):
"""获取所有即将进行的比赛,并预处理结果以提取所需信息。"""
country_id = self.get_country_id(country_name)
if not country_id:
return f"未找到名为 {country_name} 的国家"
competition_ids = self.get_competition_ids(country_id)
if not competition_ids:
return f"未找到 {country_name} 的赛事"
fixtures = self.get_upcoming_fixtures(competition_ids)
if not fixtures:
return f"未找到 {country_name} 的即将进行的比赛"
# 格式化比赛数据
formatted_matches = []
for match in fixtures:
formatted_matches.append(
f"{match['home_name']} vs {match['away_name']} at {match['location']} - {match['date']}, {match['time']}"
)
return formatted_matches
iii)定义自定义工具
上面创建的FootballData类将会在下面的代码中被引用。我们调用了类中的get_upcoming_matches方法,该方法负责获取所有即将到来的比赛。此外,在我们的代码中,可以看到函数上带有@tool装饰器。这就是我们创建自定义工具的方式——在函数上使用@tool装饰器,将其变成一个可以在AI框架中动态调用的AI代理工具。
@工具定义
def 获取即将进行的比赛(query: str):
"""使用此工具可以获取给定国家即将进行的足球比赛。请提供国家名称作为输入。"""
sport_tool = FootballData()
return sport_tool.get_upcoming_matches(query)
iv),Tavily搜索插件
我们代理的工具包中的下一个工具是 Tavily 搜索工具。这个工具将帮助我们的 LLM 实时执行网络搜索。
从 langchain_community.tools.tavily_search 中导入 TavilySearchResults
# 定义 web_search 为 TavilySearchResults 类的实例
web_search = TavilySearchResults()
然后,我们将所有工具合并起来——自定义的工具“get_upcoming_matches”和“Tavily Search Tool”。
tools = ['获取即将进行的比赛信息', '网页搜索']
既然工具已经准备好了,我们可以开始创建代理程序,并将其集成以实现决策功能。
创建一个代理我们将构建一个ReAct代理,将工具集成到LangChain中,并让我们的大型语言模型根据用户的输入决定使用哪些工具。
i)记忆和模型设置
我们通过使用来自ChatOpenAI的gpt-4o-mini模型来初始化LLM,并添加一个记忆模块以保存交互历史。
从langchain_openai导入ChatOpenAI
从langgraph.checkpoint.memory模块导入MemorySaver
从langgraph.prebuilt模块导入create_react_agent
# 内存和模型设置
memory = ChatOpenAI(model_name='gpt-4o-mini')
创建代理账号
通过在langGraph中使用“create_react_agent”函数并传入我们的工具、模型和记忆,我们创建了智能代理。下面是一个以图形形式展示的代理决策过程。
#创建ReAct代理
agent = create_react_agent(model, tools=tools, checkpointer=memory)
# from IPython.display import Image, display
# 显示
# Image(agent.get_graph().draw_mermaid_png())
现在我们的代理准备好了,我们将通过发送一个查询让其执行一些任务来测试它。下面的配置是用来追踪消息的。
config = {"configurable": {"thread_id": "1"}}
inputs = {
"messages": [
(
"human",
"搜索英格兰即将进行的所有比赛",
)
]
}
result = agent.stream(inputs, config=config, stream_mode="values")
for each_result in result:
message = each_result["messages"][-1]
# 美观打印消息
message.pretty_print()
这是查询到的结果,“查找英格兰所有即将举行的比赛”,这是我们对代理提出的查询。代理随后正确调用了get_upcoming_matches函数(获取即将举行的比赛)以检索所有即将举行的比赛。
我们也可以通过问一个和足球无关的问题来进一步测试,看看这个代理会怎么应对。
config = {"configurable": {"thread_id": "1"}}
inputs = {
"messages": [
(
"human",
"查找前十的意大利美食",
)
]
}
result = agent.stream(inputs, config=config, stream_mode="values")
for result in result:
message = result["messages"][-1]
message.pretty_print() # 将消息以美观的方式打印出来
在下面的结果里,我们让代理搜索排名前十的意大利菜馆或菜肴,它成功利用Tavily搜索工具(注:Tavily为特定品牌名称,保持原样)完成了这项任务。
谢谢你的阅读!下回见你哦。
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章