
我们非常激动地宣布,我们为我们的Serverless Weaviate Cloud用户(包括免费的Sandbox用户)发布了一项全新的服务,目前处于Alpha预览阶段:Weaviate Query Agent! 现在即可使用,此新功能为用户提供了一个简单的界面,可以使用强大的基础LLM来询问Weaviate中关于您数据的复杂多阶段问题。 在这篇博文中,了解更多关于Weaviate Query Agent是什么,以及如何构建您自己的!
让我们开始吧。
这篇博文附带了一个recipe,供您们入门。
Weaviate Query Agent是什么
AI Agents是半自主或完全自主的系统,它们使用LLM作为操作的大脑。 这使您能够构建能够处理复杂用户查询的应用程序,这些查询可能需要访问多个数据源。 并且,在过去的几年里,由于功能调用、简化开发流程的框架以及更多功能的LLM越来越强大,我们已经开始构建此类应用程序。
要了解更多关于AI Agents的信息,请阅读我们的博文”Agents Simplified: What we mean in the context of AI”。
使用Query Agent,我们的目标是提供一个能够固有地处理多个Weaviate集合上的复杂查询的agent。 该agent了解所有集合的结构,因此知道何时为您运行搜索、聚合甚至同时运行两者。
通常,AI agents被描述为具有访问各种工具(增加其功能)的LLM,这些工具还能够制定计划并推理响应。
我们的Query Agent是一个AI agent,它可以访问集群内的多个Weaviate集合。 根据用户的查询,它能够决定在哪个集合或集合上执行搜索。 因此,您可以将Weaviate Query Agent视为一个具有Weaviate集合形式工具的AI agent。
除了访问多个集合之外,Weaviate Query Agent还具有访问两个内部agentic搜索工作流程
- 常规语义搜索,可选择使用过滤器
- 聚合
本质上,我们发布了一个多agent系统,它可以将查询路由到其中一个或另一个系统并综合最终答案供用户使用。

路由到搜索与聚合
并非所有查询都是相同的。 虽然有些可能需要我们使用嵌入向量在数据集上执行语义搜索,但其他查询可能需要我们进行聚合(例如计数对象、计算属性的平均值等)。 我们可以用一个简单的例子来演示这种区别。 假设我们有一个包含Weaviate Blog的数据集
- “Agents Simplified”博文中讨论的AI agent的组成部分是什么?
- Leonie发表了多少篇博文?
对于问题1,我们需要过滤到“Agents Simplified”博文并搜索“AI agent components”。 而对于问题2,该任务更接近于计数任务。 我们必须计算作者Leonie出现的博文数量。
Weaviate是一个向量数据库,这意味着对于情况1,我们有嵌入向量存储在其上,我们可以对其执行常规语义搜索。 但是,对于情况2,我们需要创建一个Aggregation Query。
好消息是,Weaviate Query Agent能够处理两者。 根据用户查询,该agent将生成搜索查询、聚合查询,或者在某些情况下同时生成两者。
创建Query Agents
👩🍳 对于此公告,我们还发布了一个配套的recipe,以帮助您入门。 请阅读有关如何使用Query Agent的关键点,或者直接按照recipe进行操作。 如有任何问题或反馈,您可以加入Weaviate论坛的‘Agents’主题。
QueryAgent和我们将要发布的用于预览的所有agent都将通过Weaviate Python Client提供
pip install weaviate-client[agents]
要初始化一个新的QueryAgent,我们必须采取几个简单的步骤
- 我们通过
client赋予它访问我们的serverless集群的权限。 - 我们提供一个
collections列表,授予它在这些集合上执行搜索的权限。 - 可选地,我们还可以提供自己的自定义
system_prompt,以提供有关如何生成响应的说明。
目前,QueryAgent可供所有Weaviate Cloud Serverless和Sandbox用户免费使用,但组织级别每天的查询限制为100个。
授予集合访问权限
对于本次介绍,我们创建了一个recipe,该recipe使用了2个集合(并且我们为您额外添加了2个集合,供您在recipe中选择性地进行试验)。
- 电子商务:一个包含服装列表、品牌和价格的集合。
- 品牌:一个列出有关品牌更多信息的集合,包括其原产国、母公司等。
我们将使用这些数据集创建一个“电子商务助手”agent
from weaviate.agents.query import QueryAgent
agent = QueryAgent(client=your_client, collections=["Ecommerce", "Brands"])
运行Query Agent
初始化后,QueryAgent可以接受用户查询。 然后,响应将返回到QueryAgentResponse对象中,其中包含有关执行了哪些搜索或聚合的信息、使用了哪些集合,甚至agent是否认为答案完整。
response = agent.run("I like the vintage clothes, can you list me some options that are less than $200?")
上面的示例可能会返回以下QueryAgentResponse
original_query='I like the vintage clothes, can you list me some options that are less than $200?'
collection_names=['Ecommerce']
searches=[[QueryResultWithCollection(queries=['vintage clothes'], filters=[[IntegerPropertyFilter(property_name='price', operator=<ComparisonOperator.LESS_THAN: '<'>, value=200.0)]], filter_operators='AND', collection='Ecommerce')]]
aggregations=[]
sources= [Source(object_id='5e9c5298-5b3a-4d80-b226-64b2ff6689b7', collection='Ecommerce'), Source(object_id='48896222-d098....', collection='Ecommerce')...]
usage=Usage(requests=3, request_tokens=7689, response_tokens=1488, total_tokens=9177, details=None)
total_time=13.9723
aggregation_answer=None
has_aggregation_answer=False
has_search_answer=True
is_partial_answer=False
missing_information=[]
final_answer="Here are some vintage-style clothing options under $200 that you might like:\\n\\n1. **Vintage Philosopher Midi Dress** -..."
QueryAgentResponse旨在尽可能易于解释。 我们包含searches和aggregations,以便您可以了解所执行的操作。 您可以检查sources以查看用于生成答案的确切对象。 我们还包含missing_information,以便agent可以告知您何时无法回答原始查询。
例如,通过上面的响应,我们可以看到QueryAgent已在Ecommerce集合上执行了搜索。 不仅如此,我们还可以看到搜索内容以及使用了哪些过滤器
searches=[[QueryResultWithCollection(queries=['vintage clothes'], filters=[[IntegerPropertyFilter(property_name='price', operator=<ComparisonOperator.LESS_THAN: '<'>, value=200.0)]], filter_operators='AND', collection='Ecommerce')]]
运行后续查询
可选地,您还可以选择将先前交互的响应作为上下文提供给下一个交互。 这样,您始终可以提出后续问题,并且QueryAgent能够推断一些缺失的信息。 例如,作为对先前问题的后续操作,我们可以运行以下代码
new_response = agent.run("What about some nice shoes, same budget as before?", context=response)
在这种情况下,您可以观察到new_response包含以下searches和final_answer。 请注意,虽然我们没有在查询中提供预算,但agent能够推断我们仍然希望遵守200美元的预算。
searches=[[QueryResultWithCollection(queries=['nice shoes'], filters=[[IntegerPropertyFilter(property_name='price', operator=<ComparisonOperator.LESS_THAN: '<'>, value=200.0)]], filter_operators='AND', collection='Ecommerce')]]
final_answer="Here are some nice shoe options under $200 - 1. **Parchment Boots by Nova Nest** - $145 ..."
修改System Prompt
除了决定QueryAgent可以访问哪些集合之外,您还可以选择提供自定义system_prompt。 这使您可以为agent提供有关其行为方式的说明。 例如,下面我们提供了一个system prompt,指示agent始终以用户的语言回复
multi_lingual_agent = QueryAgent(
client=client, collections=["Ecommerce", "Brands"],
system_prompt="You are a helpful assistant that always generated the final response in the users language."
" You may have to translate the user query to perform searches. But you must always respond to the user in their own language."
)
总结
Weaviate Query Agent代表着使向量数据库更易于访问和更强大的重要一步。 通过结合LLM的功能与Weaviate自身的搜索和聚合功能,我们创建了一个可以处理多个集合上的复杂查询,同时保持上下文并支持多种语言的工具。 产生的agent可以单独使用,也可以在更大的agentic或多agent应用程序中使用。
无论您是构建需要语义搜索、复杂聚合或两者兼而有之的应用程序,Query Agent都可以简化开发流程,同时提供通过system prompts自定义其行为的灵活性。 随着我们不断开发和增强此功能,我们期待看到我们的社区如何利用它来构建更强大的AI驱动应用程序。
准备好开始了吗? 请查看我们的recipe,加入论坛的讨论,并立即开始使用Weaviate Query Agent!
准备开始构建了吗?
请查看 快速入门教程,或使用 Weaviate Cloud (WCD) 的免费试用版构建令人惊叹的应用程序。