微信扫码
添加专属顾问
在人工智能的浪潮中,大型语言模型(LLMs)因其在自然语言处理领域的巨大贡献而广受欢迎。尽管如此,LLMs在实时获取外部数据方面存在局限。这些模型的训练是在特定时间点完成的,这就意味着它们无法获取到最新的信息,从而影响提供准确答案的能力。
为了解决这一问题,智能体(Agents)被引入,它是一种生成式人工智能(Generative AI)构建,可以将简单的问答或文本生成提升到一个新的层次。通过智能体,可以提供访问不同工具或API的权限,并允许模型本身推理出应该采取的正确行动。例如,通过提供访问天气API的权限,智能体可以检索必要的数据来回答相关问题。
在音乐推荐的场景中,传统的推荐引擎或系统需要构建特定模型并经历训练。然而,对于简单的用例,一个不需要构建特定模型或经历训练的解决方案更为合适。LangChain提供了一种智能体驱动的方法,通过ReAct智能体(推理+行动),允许在采取行动之前进行观察和思考。
LangChain是一个流行的Python框架,它通过提供现成的模块来简化生成式AI应用程序,这些模块有助于提示工程、RAG实现和LLM工作流程编排。在这个特定的用例中,LangChain被用来构建ReAct智能体,并为它提供所需的必要工具。
在这个例子中,我们将在SageMaker Studio Notebook中使用一个ml.t3.medium实例进行工作。你可以选择喜欢的开发环境,只要能够安装以下库:
!pip install spotipy langchain
注意,在开始之前,如果还没有Spotify开发者账户,请创建。在你的Spotify开发者账户中,请确保已经创建了一个应用程序,这将显示与API一起使用所需的凭证。创建完成,你应该能够在仪表板的项目中可视化你的凭证(设置选项卡)和API请求。
然后在笔记本中实例化用于与Spotify工作的客户端。
import spotipy
import spotipy.util as util
from spotipy.oauth2 import SpotifyClientCredentials
import random
client_id = '输入客户端ID'
client_secret = '输入客户端密钥'
# 实例化spotipy客户端
sp = spotipy.Spotify(client_credentials_manager=
SpotifyClientCredentials(client_id=client_id,
client_secret=client_secret))
现在已经设置了Spotify客户端,准备进入智能体编排部分。
LangChain智能体需要访问工具,这些工具将使它们能够与外部数据源一起工作。有许多内置工具,如Wikipedia,只需在LangChain中指定包即可,如下所示:
from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper
目前,还没有与Spotify API的原生集成,因此需要从BaseTool类继承并构建一个Spotify工具,然后将其交给我们的智能体。
我们定义一个扩展了BaseTool类的Spotify工具:
from langchain.tools import BaseTool, StructuredTool, tool
class SpotifyTool(BaseTool):
name = "Spotify音乐推荐器"
description = "当被要求提供音乐推荐时使用此工具。"
请注意,我们提供了何时使用此工具的描述,这允许LLM使用自然语言理解来推断何时使用该工具。我们还提供了工具应该期望的输入的模式。在这种情况下,指定了两个参数:
from langchain.pydantic_v1 import BaseModel, Field
# 模式
class MusicInput(BaseModel):
artists: list = Field(description="他们想要看到音乐的艺术家列表")
tracks: int = Field(description="他们想要返回的曲目/歌曲数量。")
class SpotifyTool(BaseTool):
name = "Spotify音乐推荐器"
description = "当被要求提供音乐推荐时使用此工具。"
args_schema: Type[BaseModel] = MusicInput # 定义模式
现在已经了解了LLM在提示中应该寻找的输入,可以定义一些不同的方法来使用Spotipy包:
# 实用工具
@staticmethod
def retrieve_id(artist_name: str) -> str:
results = sp.search(q='artist:' + artist_name, type='artist')
if len(results) > 0:
artist_id = results['artists']['items'][0]['id']
else:
raise ValueError(f"未找到此名称的艺术家:{artist_name}")
return artist_id
@staticmethod
def retrieve_tracks(artist_id: str, num_tracks: int) -> list:
if num_tracks > 10:
raise ValueError("每位艺术家只能提供最多10首曲目")
tracks = []
top_tracks = sp.artist_top_tracks(artist_id)
for track in top_tracks['tracks'][:num_tracks]:
tracks.append(track['name'])
return tracks
@staticmethod
def all_top_tracks(artist_array: list) -> list:
complete_track_arr = []
for artist in artist_array:
artist_id = SpotifyTool.retrieve_id(artist)
all_tracks = {artist: SpotifyTool.retrieve_tracks(artist_id, 10)}
complete_track_arr.append(all_tracks)
return complete_track_arr
这些方法本质上是获取检索到的艺术家,并返回这些艺术家的顶级曲目。请注意,目前Spotipy API只能检索到前10首曲目。
然后我们定义了一个主执行函数,其中获取所请求艺术家的所有顶级曲目,并解析在我们的提示中请求的曲目数量:
# 主执行函数
def _run(self, artists: list, tracks: int) -> list:
num_artists = len(artists)
max_tracks = num_artists * 10
all_tracks_map = SpotifyTool.all_top_tracks(artists) # 艺术家与前10首曲目的映射
all_tracks = [track for artist_map in all_tracks_map for artist, tracks in artist_map.items() for track in tracks] # 完整的曲目列表
# 每个艺术家只有10首曲目
if tracks > max_tracks:
raise ValueError(f"每个艺术家只有10首曲目,这么多艺术家的最大曲目数是:{max_tracks}")
final_tracks = random.sample(all_tracks, tracks)
return final_tracks
如果希望在API中加入额外的功能(构建自己的播放列表),可以在该工具本身中定义这些额外的方法。
虽然已经定义了智能体需要的输入/输出规范,但我们必须定义LLM,它是操作的大脑。
在这种情况下,使用Anthropic Claude通过Amazon Bedrock:
from langchain.llms import Bedrock
model_id = "anthropic.claude-v2:1"
model_params = {
"max_tokens_to_sample": 500,
"top_k": 100,
"top_p": .95,
"temperature": .5
}
llm = Bedrock(
model_id=model_id,
model_kwargs=model_params
)
# Bedrock推理示例
llm("美国的首都是什么?")
然后可以实例化工具类,并将这个与LLM一起创建我们的智能体。注意,指定智能体类型为ReAct,根据您使用的智能体类型需要进行调整。
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
tools = [SpotifyTool()]
agent = initialize_agent(tools, llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
智能体构建完成之后,可以运行一个样本推理(随机混合艺术家),并看到我们已经启用的详细输出的思考链。
print(agent.run("""我喜欢以下艺术家:[Arijit Singh, Future, The Weeknd],我可以得到包含他们的12首歌曲推荐。"""))
请注意,智能体特别寻找我们指定用于使用此工具的两个参数,一旦它识别了这些参数,就能够采取逻辑上的行动,并正确执行推理,使用我们提交的值。
智能体的力量在于你可以决定可以检索的后端功能。在这个示例中,我们只是检索艺术家的顶级曲目,但可以通过在你的工具中添加适当的API调用来扩展此示例,以直接在你的Spotify账户中创建播放列表。对于更现实或个性化的用例,也可以使用RAG让智能体访问自己的数据/音乐,并让它从那里获取的建议。
本书共10章,分别介绍了LangChain的开发环境搭建、模型、提示、数据连接、链、记忆、代理、回调及周边生态等内容,并用三个案例,即基于Streamlit实现聊天机器人、基于Chainlit实现PDF问答机器人、零代码AI应用构建平台Flowise,将前面大语言模型的内容学以致用。通过本书,读者既能提升自身的技术素养,又能拓展自己解决实际难题的能力。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-06-29
17 岁高中生做了个假 AI,上线一个月获 2.8 亿次访问
2026-06-29
Loop Engineering 具体做些什么
2026-06-28
字节跳动最新AI Coding实践曝光,我总结了7 条反常识的结论
2026-06-28
企业级AI的核心不是Agent,而是让Agent变得不重要的Skills
2026-06-27
OpenAI深夜引爆GPT-5.6,三箭齐发全面围剿Anthropic
2026-06-27
Agent 发邮件踩坑全记录:从 SMTP 翻车到 Agently Mail
2026-06-27
AgentTeams 和 Claude Tag 都进入群聊模式,是新范式还是新叙事?
2026-06-27
GPT-5.6 Sol深夜炸场发布!OpenAI最强模型碾压Claude 5!
2026-04-15
2026-04-07
2026-04-07
2026-04-24
2026-04-17
2026-04-05
2026-04-02
2026-04-05
2026-03-31
2026-04-14
2026-06-27
2026-06-26
2026-06-25
2026-06-18
2026-06-18
2026-06-10
2026-06-10
2026-06-07
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。