← 返回博客
跳至主要内容

推出 Weaviate 个性化 Agent

·阅读需 12 分钟
Charles Pierse
Tuana Çelik
Alvin Richards

Introducing the Weaviate Personalization Agent

在过去几周里,我们向您介绍了 QueryAgentTransformationAgent,今天,我们又带来了 Weaviate Agents 的最新成员:PersonalizationAgent

我们今天向所有 Weaviate Serverless Cloud 和 Sandbox 用户发布的这项新服务仅仅是我们面向代理的服务的一个开始,旨在根据自定义指令、用户资料以及他们与您产品的过往互动,从 Weaviate 集合中检索个性化对象。

在这篇博文中,我们将介绍 PersonalizationAgent 的这个预览版本,以及如何开始创建您自己的版本,以及我们对这项服务的未来愿景。

注意

这篇博文附带两个配套的示例代码,可以帮助您入门,其中一个我们将在此详细介绍:'food recommender' agent recipe‘movie recommender’ agent recipe。在这篇博文中,我们将重点关注美食推荐器。

什么是个性化代理

简单来说,您可以将 PersonalizationAgent 的这个第一个版本视为一个代理排名服务,它在返回集合中的最相关对象时会考虑用户的“角色”和过去的“互动”。

对于许多应用程序来说,提供个性化搜索对于确保结果随着时间的推移而演变以支持不断变化的的用户兴趣至关重要。例如,如果您是一个服装品牌,并希望帮助用户找到他们想要的东西,并且符合他们的风格。或者,如果您托管一个充满食谱的网站,并且希望将用户可能更喜欢的食谱排在前面。Weaviate PersonalizationAgent 是一项旨在为任何给定的 Weaviate 集合执行此操作的服务。它通过采用一些新的方法来实现这一点

  1. 通过引入一个新的类,称为 Persona,它本质上代表一个最终用户,并可选地包含任何可能对他们有用的其他元数据。
  2. 通过引入与其配套的 PersonaInteraction,它表示对集合中给定对象的正面或负面加权互动。
  3. 最后,可能最重要的是,在后台创建一个辅助集合,我们可以在其中存储这些角色和角色互动。

Personalization Agent

利用所有这些关于我们最终用户的信息,PersonalizationAgent 将使用经典的机器学习方法和 LLM,来获取和排名来自我们集合的对象,专门为单个用户定制。

这涉及很多内容,所以让我们分解一下。

角色

角色本质上就是字面意思,一个人的代表。但是,我们需要什么样的个人信息,或者什么可能是有价值的信息,可能因应用程序而异。因此,对于 PersonalizationAgent,我们提供了一个助手类,可以根据您需要的任何角色属性进行初始化。

例如,如果我们创建一个以食谱为中心的应用,我们可能希望有一个角色,其中列出他们的喜好、厌恶和他们最喜欢的菜肴。但是,如果我们创建一个电影推荐服务,也许我们需要我们的角色包含年龄、喜欢的类型和前 3 部最喜欢的电影。

在这里,完全取决于我们(正在为最终用户创建一个代理个性化服务的人)来决定包含哪些特定的(不变化的)信息对每个用户最有用。

PersonalizationAgent 会使用一个蓝图初始化,该蓝图指定我们希望在引入到代理的每个新用户(角色)中包含哪些属性。该蓝图采用字典的形式,指示属性名称和数据类型

user_properties = {
"favorite_cuisines": DataType.TEXT_ARRAY,
"likes": DataType.TEXT_ARRAY,
"dislikes": DataType.TEXT_ARRAY,
}

一旦我们知道这些属性是什么,我们就可以根据需要向我们的代理添加尽可能多的用户。对于每个用户,我们使用唯一的 ID 初始化一个 Persona,并提供请求的属性。

Persona(persona_id=persona_id,
properties={
"favorite_cuisines": ["Italian", "Thai"],
"likes": ["chocolate", "salmon", "pasta", "most veggies"],
"dislikes": ["okra", "mushroom"],
})

角色互动

一旦我们拥有给定用户的角色,我们就可以仅基于他们的个人资料开始向他们提供个性化数据。但是,代理还可以考虑用户可能与我们集合中的对象产生的任何过往互动。

在这种情况下,互动是一个简单的类,它代表了任何给定角色对任何给定对象的正面或负面情绪。每个互动都有一个 weight,可以设置为 -1.0 到 1.0 之间的任何值。例如,1.0 可能是用户标记为“最喜欢的”对象赋予的权重,而 0.8 可能是他们“喜欢的”对象的权重,-0.5 可能是他们不喜欢的对象的权重等。

想象一下网页上每个条目的“喜欢”和“不喜欢”按钮。当用户点击“喜欢”时,这可能意味着是时候为该集合中的特定对象添加权重为 1 的新互动了。

例如,persona_aitem_a 的正面互动是

PersonaInteraction(persona_id=persona_a, item_id=item_a, weight=1)

当我们创建这些角色和互动时,PersonalizationAgent 将开始将它们存储在一个单独的“collection_interactions”集合中。

PersonalizationAgent 将在接收到所有角色和互动数据时对其进行向量化。当代理被要求为用户提供个性化排名时,它不仅会使用原始集合中实际对象的向量,还会使用从第二个代理创建的集合中的角色和互动的向量。但是,关于个性化排名实际上是如何进行的,我们将在下一节中讨论。

个性化排名和过滤

对象的个性化排名基于经典 ML 基于最近向量的聚类和 PersonalizationAgent 中的生成式 LLM 的混合。基于角色及其互动,Weaviate 将检索基于用户正面和负面偏好的最近对象。然后,我们可以选择仅基于这些用户偏好的“聚类”来基于这些聚类向用户推荐。或者,可能更有趣(并且更“代理化”) - 我们可以采用一种方法,即首先基于这些聚类获取推荐对象,然后使用 LLM 根据其获得的所有关于用户的信息重新排名它们。我们将在以下部分中创建我们自己的 PersonalizationAgent 时看到如何执行此操作。

我们对个性化代理的未来愿景

虽然今天的发布已准备好供所有 Weaviate Serverless Cloud 和 Sandbox 用户预览,但这仅仅是一个开始。正如您将在下面看到的,此版本侧重于从集合中获取与用户相关的对象。很快,我们还将添加个性化的 Weaviate 查询,这将允许我们将上述所有个性化整合到任何 Weaviate 集合查询中。我们希望进行的另一个更新是将这些代理与 QueryAgent 一起使用,从而使我们能够创建一个多代理 Weaviate 集合搜索系统,该系统还可以为某些集合提供个性化响应。

创建个性化代理

注意

👩‍🍳 为了此次发布,我们还发布了一个配套的“美食推荐器”代理 示例代码,以帮助您入门。如有任何问题或反馈,您可以 加入 Weaviate 论坛中的“Agents”主题

要开始使用,我们需要安装 Weaviate Python 客户端。PersoanlizationAgent(以及 QueryAgentTransformationAgent)现在已准备好通过 Weaviate Python 客户端进行预览,适用于所有 Weaviate Serverless Cloud 用户(包括免费的 Sandboxes)。

pip install weaviate-client[agents]

作为一个示例场景,我们准备了两个示例代码:一个用于基于用户的喜好、厌恶和喜欢的菜肴创建美食推荐服务,另一个用于基于用户的年龄、喜欢的类型等创建电影推荐服务。

让我们来看看美食推荐服务。要开始使用,我们需要一个集合。在这种情况下,让我们想象一个名为“Recipes”的集合,其中列出了菜肴的名称和每个菜肴的简短描述,以及该菜肴所属的菜系。

PersonalizationAgent 使用以下内容初始化

  • 代理将返回个性化推荐的 reference_collection 的名称。
  • (可选)user_properties,其中列出了我们可能希望了解的每个用户的属性名称和数据类型。

在这种情况下,我们初始化以下代理

from weaviate.agents.personalization import PersonalizationAgent

agent = PersonalizationAgent.create(client=client,
reference_collection="Recipes",
user_properties={"favorite_cuisines": DataType.TEXT_ARRAY,
"likes": DataType.TEXT_ARRAY,
"dislikes": DataType.TEXT_ARRAY
},
)

user_properties 视为代理在返回个性化对象时可能对每个用户(角色)有用的信息的蓝图。

在我们的美食推荐服务中,我们选择了“favorite_cuisines”、“likes”和“dislikes”。很快,当我们的代理也能够过滤排名时,我们可能还希望为此类推荐服务包含“intolerances”等。

创建人物画像和添加新用户

一旦我们拥有了代理和每个个体所需信息的蓝图,我们就可以开始将用户添加到我们的代理中。

对于 PersonalizationAgent,我们使用 Persona 类添加新用户,该类用唯一的 persona_id 和代理在初始化时使用 user_properties 定义的期望属性进行初始化。 让我们想象一下简·多伊,她喜欢鲑鱼,但讨厌蘑菇。 她的 Persona 可以如下初始化

from weaviate.agents.classes import Persona

jane_doe = Persona(persona_id=jane_doe_id,
properties={"favorite_cuisines": ["Italian", "Thai"],
"likes": ["chocolate", "salmon", "pasta", "most veggies"],
"dislikes": ["okra", "mushroom"],
},
)

一旦我们有了新的 Persona,我们使用 add_persona 将其添加到代理中

agent.add_persona(jane_doe)

交互集合 & 添加新交互

PersonalizationAgent 在后台执行的一件关键事情是,一旦初始化,它就会为参考集合创建一个“姐妹集合”。 我们称之为 persona 交互集合。 对于我们的食品推荐服务,由于参考集合名为“Recipes”,我们的交互集合将命名为“Recipes_persona_interactions”。

当我们开始添加新的 persona 时,代理将开始将代表 persona 的对象插入(并向量化)到此交互集合中。 例如,请注意下面代表我们自己的 jane_doe 的对象截图:您可能还会注意到另外两个属性:positivenegative。 这是代理将开始将 persona 的交互插入到参考集合(Recipes)中特定对象上的地方。

稍后,在返回特定用户可能感兴趣的对象时,代理将不仅使用参考集合,还使用交互集合。 这样,它可以根据 persona 的个人资料以及他们与我们集合中的对象(在本例中,与“Recipes”中列出的菜肴)的过去交互(正面和负面)来确定排名。

例如,让我们假设我们的食品推荐服务具有以下规则

1.0: favorite meal
0.8: user liked the dish
0.5: user viewed the recipe page
-0.5: user disliked the dish
-1.0: user absolutely hated the dish 👎

我们的 jane_doe 可能具有以下交互

from weaviate.collections.classes.filters import Filter

reviewed_foods = [
"Chicken Tikka Masala",
"Matcha Ice Cream",
"Fiorentina Steak",
"Duck Confit",
"Pappardelle with Porcini"
]

reviews_dict = {
recipe.properties["title"]: recipe
for recipe in recipes_collection.query.fetch_objects(
filters=Filter.by_property("title").contains_any(reviewed_foods), limit=20
).objects
}

interactions = [
PersonaInteraction(
persona_id=jane_doe_id, item_id=reviews_dict["Chicken Tikka Masala"].uuid, weight=0.8
),
PersonaInteraction(
persona_id=jane_doe_id, item_id=reviews_dict["Matcha Ice Cream"].uuid, weight=0.8
),
PersonaInteraction(
persona_id=jane_doe_id, item_id=reviews_dict["Fiorentina Steak"].uuid, weight=0.8
),
PersonaInteraction(
persona_id=jane_doe_id, item_id=reviews_dict["Duck Confit"].uuid, weight=1.0
),
PersonaInteraction(
persona_id=jane_doe_id, item_id=reviews_dict["Pappardelle with Porcini"].uuid, weight=-1.0
),

]

agent.add_interactions(interactions=interactions)

值得注意的是,对于个人而言,我们拥有的交互越多,代理对该人的了解就越多。 因此,随着我们添加越来越多的交互,个性化排名会变得更好。

个性化排名

代理返回个性化对象的理念很简单:首先,我们使用经典的 ML 聚类根据用户 persona 和过去交互对对象进行聚类。 对象的首次检索实际上仅基于此聚类进行。 因此,对于更简单(且更便宜)的个性化排名,我们可以将其保留在那里。

但是接下来——并且是可选的——我们可能会选择使用我们称之为代理排名来获取对象。 在这里,Weaviate 将使用 LLM 来根据用户 persona 和交互提供的额外上下文重新排序首次检索返回的对象。

此外,再次是可选的,我们还可以为我们的代理提供自定义指令。 此指令可以描述我们旨在通过我们的应用程序实现哪种类型的个性化和排名。 这是一种有效地向代理提供有关手头排名任务的更多上下文的方法。

例如,对于我们的食品推荐服务,我们可能希望创建一个推荐多样化菜肴的服务。 我们将 use_agent_ranking 设置为 True 并调用 get_objects

response = agent.get_objects(persona_id,
limit=50,
use_agent_ranking=True,
instruction="""Your task is to recommend a diverse set of dishes to the user
taking into account their likes and dislikes. It's especially important to avoid their dislikes.""",
)

代理返回的响应不仅包括针对用户重新排序的 50 个最相关对象,还包括代理的 ranking_rationale,说明为什么排名是这样做的。 例如,对于我们的 jane_doe,排名可能如下所示

print(response.ranking_rationale)
for i, obj in enumerate(response.objects[:10]):
print(f"*****{i}*****")
print(obj.properties["title"])
print(obj.properties["description"])
print(obj.properties["labels"])

We've curated a diverse selection of dishes that avoids your dislikes 
and highlights your favorite cuisines like Italian and Thai.
Look forward to enjoying delicious Italian classics and unique dishes that
resonate with your love for pasta and veggies.

*****0*****
Pizza Margherita
A simple yet iconic pizza with San Marzano tomatoes, mozzarella di bufala, fresh basil, and extra-virgin olive oil, encapsulating the Neapolitan pizza tradition.
Italian
*****1*****
Frittata di Zucca e Pancetta
A fluffy egg omelette with sweet potatoes and pancetta, seasoned with herbs and grated cheese, a beloved dish from the heart of Italy.
Italian
*****2*****
Lasagna alla Bolognese
Layers of flat pasta sheets, rich Bolognese sauce, and béchamel, baked to perfection.
Italian
...

总结

PersonalizationAgent 是 Weaviate 最新的代理服务,它通过结合用户画像、过去交互和 LLM 驱动的排名来提供个性化推荐。 它引入了 persona、交互跟踪和代理流程,用于为任何集合提供定制结果。 现在,所有 Serverless Cloud 和 Sandbox 用户都可以使用——使用提供的配方开始构建智能、以用户为中心的应用程序。

准备开始构建了吗?

请查看 快速入门教程,或使用 Weaviate Cloud (WCD) 的免费试用版构建令人惊叹的应用程序。

不想错过另一篇博文?

注册我们的双周时事通讯以保持更新!


提交后,我同意 服务条款 隐私政策.