当前位置:   article > 正文

妙用LangChain智能体,搭建音乐推荐系统_推荐系统智能体

推荐系统智能体

大家好,在人工智能的浪潮中,大型语言模型(LLMs)因其在自然语言处理领域的巨大贡献而广受欢迎。尽管如此,LLMs在实时获取外部数据方面存在局限。这些模型的训练是在特定时间点完成的,这就意味着它们无法获取到最新的信息,从而影响提供准确答案的能力。

为了解决这一问题,智能体(Agents)被引入,它是一种生成式人工智能(Generative AI)构建,可以将简单的问答或文本生成提升到一个新的层次。通过智能体,可以提供访问不同工具或API的权限,并允许模型本身推理出应该采取的正确行动。例如,通过提供访问天气API的权限,智能体可以检索必要的数据来回答相关问题。 

1.音乐推荐用例

在音乐推荐的场景中,传统的推荐引擎或系统需要构建特定模型并经历训练。然而,对于简单的用例,一个不需要构建特定模型或经历训练的解决方案更为合适。LangChain提供了一种智能体驱动的方法,通过ReAct智能体(推理+行动),允许在采取行动之前进行观察和思考。

LangChain是一个流行的Python框架,它通过提供现成的模块来简化生成式AI应用程序,这些模块有助于提示工程、RAG实现和LLM工作流程编排。在这个特定的用例中,LangChain被用来构建ReAct智能体,并为它提供所需的必要工具。

图片

2.智能体驱动的解决方案

2.1 设置

在这个例子中,我们将在SageMaker Studio Notebook中使用一个ml.t3.medium实例进行工作。可以选择喜欢的开发环境,只要能够安装以下库:

!pip install spotipy langchain

在开始之前,如果还没有Spotify开发者账户,请先进行账户创建。在Spotify开发者账户中,请确保已经创建了一个应用程序,这将显示与API一起使用所需的凭证。创建完成后,应该能够在仪表板的项目中可视化自己的凭证(设置选项卡)和API请求。

图片

Spotify仪表板

然后在笔记本中实例化用于与Spotify工作的客户端。

  1. import spotipy
  2. import spotipy.util as util
  3. from spotipy.oauth2 import SpotifyClientCredentials
  4. import random
  5. client_id = '输入客户端ID'
  6. client_secret = '输入客户端密钥'
  7. # 实例化spotipy客户端
  8. sp = spotipy.Spotify(client_credentials_manager=
  9. SpotifyClientCredentials(client_id=client_id,
  10. client_secret=client_secret))

现在已经设置了Spotify客户端,准备进入智能体编排部分。

2.2 自定义工具类

LangChain智能体需要访问工具,这些工具将使它们能够与外部数据源一起工作。有许多内置工具,如Wikipedia,只需在LangChain中指定包即可,如下所示:

  1. from langchain_community.tools import WikipediaQueryRun
  2. from langchain_community.utilities import WikipediaAPIWrapper

目前,还没有与Spotify API的原生集成,因此需要从BaseTool类继承并构建一个Spotify工具,然后将其交给智能体。

定义一个扩展了BaseTool类的Spotify工具:

  1. from langchain.tools import BaseTool, StructuredTool, tool
  2. class SpotifyTool(BaseTool):
  3.     name = "Spotify音乐推荐器"
  4.     description = "当被要求提供音乐推荐时使用此工具。"

请注意,我们提供了何时使用此工具的描述,这允许LLM使用自然语言理解来推断何时使用该工具,还提供了工具应该期望的输入的模式。在这种情况下,指定了两个参数:

  • 艺术家:感兴趣的艺术家列表,基于此,LLM将推荐该艺术家的更多热门曲目。

  • 曲目数量:想要显示的建议曲目数量。

  1. from langchain.pydantic_v1 import BaseModel, Field
  2. # 模式
  3. class MusicInput(BaseModel):
  4.     artists: list = Field(description="他们想要看到音乐的艺术家列表")
  5.     tracks: int = Field(description="他们想要返回的曲目/歌曲数量。")
  6. class SpotifyTool(BaseTool):
  7.     name = "Spotify音乐推荐器"
  8.     description = "当被要求提供音乐推荐时使用此工具。"
  9.     args_schema: Type[BaseModel] = MusicInput # 定义模式

现在已经了解了LLM在提示中应该寻找的输入,可以定义一些不同的方法来使用Spotipy包:

  1. # 实用工具
  2.   @staticmethod
  3.   def retrieve_id(artist_name: str) -> str:
  4.       results = sp.search(q='artist:' + artist_name, type='artist')
  5.       if len(results) > 0:
  6.           artist_id = results['artists']['items'][0]['id']
  7.       else:
  8.           raise ValueError(f"未找到此名称的艺术家:{artist_name}")
  9.       return artist_id
  10.   @staticmethod
  11.   def retrieve_tracks(artist_id: str, num_tracks: int) -> list:
  12.       if num_tracks > 10:
  13.           raise ValueError("每位艺术家只能提供最多10首曲目")
  14.       tracks = []
  15.       top_tracks = sp.artist_top_tracks(artist_id)
  16.       for track in top_tracks['tracks'][:num_tracks]:
  17.           tracks.append(track['name'])
  18.       return tracks
  19.   @staticmethod
  20.   def all_top_tracks(artist_array: list) -> list:
  21.       complete_track_arr = []
  22.       for artist in artist_array:
  23.           artist_id = SpotifyTool.retrieve_id(artist)
  24.           all_tracks = {artist: SpotifyTool.retrieve_tracks(artist_id, 10)}
  25.           complete_track_arr.append(all_tracks)
  26.       return complete_track_arr

这些方法本质上是获取检索到的艺术家,并返回这些艺术家的顶级曲目,目前Spotipy API只能检索到前10首曲目。

然后定义一个主执行函数,其中获取所请求艺术家的所有顶级曲目,并解析在提示中请求的曲目数量:

  1. # 主执行函数
  2. def _run(self, artists: list, tracks: int) -> list:
  3.     num_artists = len(artists)
  4.     max_tracks = num_artists * 10
  5.     all_tracks_map = SpotifyTool.all_top_tracks(artists)  # 艺术家与前10首曲目的映射
  6.     all_tracks = [track for artist_map in all_tracks_map for artist, tracks in artist_map.items() for track in tracks]  # 完整的曲目列表
  7.     # 每个艺术家只有10首曲目
  8.     if tracks > max_tracks:
  9.         raise ValueError(f"每个艺术家只有10首曲目,这么多艺术家的最大曲目数是:{max_tracks}")
  10.     final_tracks = random.sample(all_tracks, tracks)
  11.     return final_tracks

如果希望在API中加入额外的功能(构建自己的播放列表),可以在该工具本身中定义这些额外的方法。

2.3 智能体创建与调用

虽然已经定义了智能体需要的输入/输出规范,但我们必须定义LLM,它是操作的大脑。

在这种情况下,使用Anthropic Claude通过Amazon Bedrock:

  1. from langchain.llms import Bedrock
  2. model_id = "anthropic.claude-v2:1"
  3. model_params = {
  4.     "max_tokens_to_sample"500,
  5.     "top_k"100,
  6.     "top_p".95,
  7.     "temperature".5
  8. }
  9. llm = Bedrock(
  10.     model_id=model_id,
  11.     model_kwargs=model_params
  12. )
  13. # Bedrock推理示例
  14. llm("美国的首都是什么?")

然后可以实例化工具类,并将这个与LLM一起创建智能体。指定智能体类型为ReAct,根据使用的智能体类型需要进行调整。

  1. from langchain.agents import initialize_agent, Tool
  2. from langchain.agents import AgentType
  3. tools = [SpotifyTool()]
  4. agent = initialize_agent(tools, llm,
  5.                           agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

智能体构建完成之后,可以运行一个样本推理(随机混合艺术家),并看到已经启用的详细输出的思考链。

print(agent.run("""我喜欢以下艺术家:[Arijit Singh, Future, The Weeknd],我可以得到包含他们的12首歌曲推荐。"""))

图片

智能体响应一

图片

智能体响应二

智能体特别寻找我们指定用于使用此工具的两个参数,一旦它识别了这些参数,就能够采取逻辑上的行动,并正确执行推理,使用提交的值。

3.总结

智能体的力量在于可以决定可以检索的后端功能。这个示例只是检索艺术家的顶级曲目,但可以通过在工具中添加适当的API调用来扩展此示例,以直接在自己的Spotify账户中创建播放列表。对于更现实或个性化的用例,也可以使用RAG让智能体访问自己的数据/音乐,并让它从那里获取的建议。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/904655
推荐阅读
相关标签
  

闽ICP备14008679号