
简介:Elysia 是什么?
在人工智能聊天机器人日益普及的世界里,大多数仍然受限于相同的局限性:文本输入,文本输出。但如果你的 AI 可以动态地决定不仅说什么,而且如何展示呢?如果它可以学习你的偏好,智能地分类、标记和搜索你的数据,并提供对其决策过程的完全透明度呢?
隆重推出 Elysia – 我们的开源、Agentic RAG 框架,它代表着我们与数据交互方式的一次根本性变革。
查看我们的演示,了解 Elysia 如何在一个示例数据集上工作:elysia.weaviate.io
Elysia 是一个基于决策树的 Agentic 系统,它可以智能地决定使用哪些工具,获得了哪些结果,是否应该继续该过程,或者是否已经完成了目标。它既提供完整的前端界面,又提供一个易于通过 pip 安装的 Python 包。
开箱即用,Elysia 应用可以连接到你的 Weaviate 集群 并执行智能搜索 - 仅根据用户的自然语言自动生成唯一的过滤器和搜索参数 - 并在前端动态地显示结果。
整个项目都是开源的,并且设计时考虑了定制化。你可以按原样使用它,以有效地搜索你的数据,或者你可以安装 Python 包并轻松创建工具,以便将 Elysia 用于你需要的任何 Agentic AI 目的。
它是如何工作的?
Elysia 被架构为一个现代 Web 应用程序,具有功能齐全的前端,提供响应式、实时界面,以及提供 Web 界面和 API 的 FastAPI 后端。核心逻辑是用纯 Python 编写的——我们称之为“血汗泪”定制逻辑——使用 DSPy 处理 LLM 交互,以实现灵活、面向未来的实现。
我们力求让 入门 尽可能简单 - 所有内容都包含在一个可以通过 pip 安装的包中。要将 Elysia 用作应用程序,你需要一个带有数据的 Weaviate Cloud 实例。安装了 pip install elysia-ai 后,你可以使用 elysia start 运行完整的 Web 界面,或者通过导入它并初始化树对象来进行编程查询,将其用作 Python 库。
pip install elysia-ai
elysia start
你可以通过此链接注册 Weaviate Cloud 的 14 天免费沙盒:https://console.weaviate.cloud
要在 Web 应用程序中开始使用,只需转到“设置”选项卡以创建你的第一个配置,添加你的 Weaviate 集群详细信息和选择的模型提供商和密钥,为其命名,然后单击保存。然后,你可以转到“数据”选项卡来分析你的集合,瞧!Agentic RAG 准备就绪。用户还可以创建多个配置,以便轻松地在数据集群或模型提供商之间切换。
在这个漂亮的 Web 应用程序和易于使用的 Python 库背后,实际上有很多事情在发生。主要是,Elysia 的设计中有三个组成部分,我们尚未在任何其他开源 Agentic 框架中看到这些组成部分结合在一起:可定制的决策树架构、动态数据显示类型以及 AI 数据分析和感知。

Elysia 的三大支柱
1. 决策树和决策 Agent
Elysia 的核心是其决策树架构。与具有访问运行时所有可能工具的简单 Agentic 平台不同,Elysia 具有预定义的可能节点网络,每个节点都对应一个操作。树中的每个节点都由一个具有全局环境感知能力的决策 Agent 编排,了解其环境和可用选项。决策 Agent 评估其环境、可用操作、过去操作和未来操作,以制定最佳工具的使用策略。
决策 Agent 还输出推理,这些推理会传递给未来的 Agent 以继续朝着相同的目标努力。每个 Agent 都会意识到之前 Agent 的意图。

树结构还能够实现高级错误处理机制和完成条件。例如,当 Agent 确定无法使用可用数据完成任务时,可以在树的某个步骤中设置“不可能标志”。因此,如果你询问电子商务集合中裤子的价格,但只提供珠宝集合,Agent 将识别这种不匹配并向决策树报告任务是不可能的。同样,如果 Elysia 查询并找到不相关的搜索结果,这不会构成失败。返回到决策树后,Agent 可以识别应该使用不同的搜索词或更宽松的过滤器再次查询。
此外,当工具遇到错误——例如由于连接问题或生成的查询中的错误——这些错误会被捕获并传播回决策树。决策 Agent 然后可以明智地选择是进行更正后重试还是尝试完全不同的方法。为了防止无限循环,对树的遍历次数有限制。
整个结构为开发人员提供了很大的灵活性。用户可以 添加自定义工具 和分支,使树变得复杂或简单,以满足需要。可以配置工具,以便根据特定标准自动运行——例如,当聊天上下文超过 50,000 个 token 时,可能会激活摘要工具。其他工具在满足特定条件时才可见,仅在与当前状态相关时才作为选项出现。
实时可观察性是我们认为 Elysia 与其他黑盒 AI 系统不同的地方之一。前端显示整个决策树,因为它被遍历,允许你观察 LLM 在处理你的查询时在每个节点内的推理。这种透明度有助于用户了解系统做出特定选择的原因,并在出现问题时进行修复。

2. 以动态格式显示数据源
虽然其他 AI 助手仅限于文本回复(有时还有图像和文本),但 Elysia 可以根据内容和上下文,动态地选择如何显示数据。该系统当前具有七种不同的显示格式:通用数据显示、表格、电子商务产品卡、(GitHub) 工单、对话和消息、文档和图表。
但是 Elysia 如何知道对你的特定数据使用哪种显示类型?
在任何 Weaviate 工具使用之前,Elysia 将分析你的集合。LLM 通过采样数据、检查字段、创建摘要和生成元数据来检查数据结构。基于此分析,它会从可用选项中推荐最合适的显示格式。用户也可以手动调整这些显示映射,以更好地满足他们的需求。
未来,我们还认为这种结构能够构建允许不同的显示执行不同的后续操作的功能。酒店显示可能包括预订功能,Slack 对话显示可以启用直接回复,产品卡可以提供添加到购物车的选项。这可能是将 Elysia 从被动信息检索器转变为帮助用户根据其数据采取行动的积极助手的一步。
我们将继续添加更多显示类型,以增加 Elysia 适应几乎任何用例或行业特定需求的自定义程度。
3. Elysia 是你数据的自动专家
像我们自己的 Verba 这样的朴素 RAG 系统,在处理复杂数据、多种数据类型或位置、或重复或相似的数据时,可能会遇到严重问题,因为它们没有对其所处理的环境的完整了解。在看到社区为此苦苦挣扎(并且我们自己也苦苦挣扎😅)之后,我们决定这是 Elysia 需要帮助解决的主要问题之一。
如上所述,在将你的 Weaviate Cloud 实例连接到 Elysia 后,LLM 会分析你的集合以检查数据结构、创建摘要、生成元数据和选择显示类型。这不仅对用户有用的信息 - 它还大大增强了 Elysia 处理复杂查询和提供知识性回复的能力。这种能力在以前的系统(如 Verba)中缺失,由于其盲目搜索方法,Verba 经常在处理模棱两可的数据时失败。
生成元数据实际上对于处理树中的复杂查询和任务至关重要。我们见过的其他传统的 RAG 和查询系统通常执行盲目的向量搜索,而不知道它们正在搜索的数据的整体结构和含义,只是希望得到相关结果。但有了 Elysia,我们构建了一个能够理解并考虑您的特定数据的结构和内容的系统,然后再执行诸如查询之类的操作。
该 Web 平台还具有一个全面的数据浏览器,具有 BM25 搜索、排序和过滤功能。它会自动将字段内的唯一值分组,并为数字数据提供最小值/最大值范围,从而让 Elysia 和用户都能清楚地了解可用内容。
数据仪表板提供所有可用集合的高级概述,而集合浏览器允许详细检查单个数据集。在查看表格数据时,我们会为您提供所选条目的完整对象视图,以便大型和嵌套数据对象可以以结构化、可读的格式显示。此外,在元数据选项卡中,用户可以编辑 LLM 生成的元数据、显示类型和摘要,因为我们都知道,LLM 远非完美。
其他很酷的功能
反馈系统:从您那里学习的 AI
我们实施的反馈系统远不止简单的评级。每位用户都维护着自己的一组反馈示例,存储在其 Weaviate 实例中。当您发出查询时,Elysia 首先会搜索您之前评为积极的类似查询,使用向量相似性匹配。

然后,系统可以将这些积极示例用作少样本演示,从而使用更小的模型获得更好的响应。如果您一直在使用更大、更昂贵的模型来处理复杂任务并对输出进行积极评级,Elysia 可以将这些高质量的响应作为类似查询的更小、更快模型的示例。随着时间的推移,这可以降低成本并提高响应速度,同时仍保持质量。
将交互独立于单个用户,可确保个人偏好不会影响其他人的体验,并且数据保持安全。该功能通过简单的配置复选框激活,并在后台透明地运行,仅根据您的交互不断改进整个系统。
按需分块:更智能的文档处理
传统的 RAG 系统会预先分块所有文档,这会大大增加存储需求。这是我们看到的社区正在努力解决的另一个问题,因此我们提出的解决方案是在查询时分块,而不是必须处理预分块策略。
初始搜索使用文档级别的向量,这提供了对文档主要观点的良好概述,但没有提供相关部分。当文档超过令牌阈值并证明与查询相关时,Elysia 将介入并动态地对其进行分块。系统将这些块存储在与原始文档具有交叉引用的并行量化集合中。这意味着后续对类似信息的查询可以利用先前分块的内容,从而使系统随着时间的推移更加高效。这种方法可以降低存储成本,同时保持甚至提高检索质量。
展望未来版本,这种架构还可以实现灵活的分块策略。不同的文档类型可以使用不同的分块方法——代码可以按函数或类边界进行分块,而散文可以使用语义或简单的固定大小分块。
通过静态 HTML 提供前端
我们想要解决的另一个问题是如何在不启动后端和前端服务器的情况下提供 NextJS 前端。我们发现我们可以通过 FastAPI 将 Elysia 的前端作为静态 HTML 提供,从而无需单独的 Node.js 服务器。这种架构更改意味着所有内容都可以从单个 Python 包运行,有助于简化部署过程并降低运营复杂性。一个简单的 pip install 即可提供一个完整的、可用于生产的应用程序,该应用程序可以在任何运行 Python 的地方部署。很酷,对吧?
多模型策略
除了反馈系统允许在小模型和大模型之间互换而不会损失质量外,Elysia 还可以根据任务复杂性智能地将不同的任务路由到适当的模型大小。小型轻量级模型处理决策代理和简单任务,而更大、更强大的模型则保留用于需要更深入推理的复杂工具操作。我们默认使用 Gemini 进行构建,因为它具有超好的性能,同时还具有超大的上下文窗口、快速的速度和成本效益。
然而,我们最喜欢 Weaviate 生态系统和开发的一个主要部分始终是能够灵活地选择我们可以选择的提供商、工具和集成。因此,当然,所有模型选择都通过配置文件完全可定制,支持几乎任何提供商,包括本地模型。更进一步,用户还可以为系统的不同部分配置不同的模型,以优化其特定的性能、安全、成本和延迟要求。
自定义您的 blob
整个应用程序 UI 的个性化是我们将在未来版本中继续努力的功能之一,但现在,您可以自定义您自己的 Elysia blob,该 blob 会持久地保存在您的应用程序中!未来,这些自定义功能将允许用户将 Elysia 重新品牌化以适应他们自己的公司。
技术栈
Elysia 背后的技术栈相对简单。Elysia 的检索完全由 Weaviate 提供支持——它使用代理来构建自定义查询或聚合,以及使用 Weaviate 的快速向量搜索来快速检索相似的过去对话以及存储对话历史记录。此外,我们还使用 DSPy、NextJS、FastAPI 和 Gemini 作为我们首选的测试模型。
Weaviate 提供了构建强大应用程序所需的所有功能,例如命名向量、不同的搜索类型(向量、关键字、混合、聚合)和过滤器。它对交叉引用的本机支持是按需分块功能的基础,因此 Elysia 可以维护原始文档与其动态生成的分块之间的关系。Weaviate 的量化选项还有助于管理我们 Alpha 测试阶段发布的存储成本,并且云集合设置允许我们轻松存储生成的元数据和用户信息。
DSPy 充当 LLM 交互层。团队(好吧,实际上是我们的后端向导 Danny)选择 DSPy 是因为它提供了一个灵活、面向未来的框架来处理语言模型。除了基本的提示管理之外,DSPy 还可以轻松实现少样本学习,从而为 Elysia 的反馈系统提供支持。该框架还可以支持提示优化功能,这些功能可能包含在未来的版本中。
但是,Elysia 的核心逻辑是用纯 Python 编写的(以及血汗泪)。这样做使我们能够完全控制实现,并使我们必须使用的工具保持在最低限度。虽然 pip install 会从 DSPy 和其他库中引入(很多)依赖项,但我们认为 Elysia 的核心逻辑是精简且易于理解的。
现实世界的例子:为 Glowe 的聊天提供支持
为了测试 Elysia 是否实际上像我们设想的那样作为一个灵活的代理框架起作用,我们决定使用它来为我们的 AI 驱动的护肤电商应用程序 Glowe 的聊天界面提供支持。

对于 Glowe-Elysia 树,我们为应用程序的需求创建了三个自定义工具
- 一个查询代理工具,用于使用复杂过滤器查找合适的产品(由Weaviate 查询代理提供支持)
- 一个堆栈生成工具,通过自然语言为用户创建特定产品集合
- 一个类似产品工具,根据当前上下文和个人用户提供推荐
所有复杂的功能——文本响应、递归、自修复、错误处理和流式传输——都内置于 Elysia 中。我们可以完全专注于实现特定于应用程序的逻辑,而不是构建所有无聊的 AI 基础设施。
入门
使用 Elysia 入门所需的设置最少。以下是分步操作
Web 应用程序
步骤 1:安装依赖项并启动应用程序
运行这些命令以启动 Web 界面
python3.12 -m venv .venv
source .venv/bin/activate
pip install elysia-ai
elysia start
步骤 2:获取一些数据
如果您还没有带有数据的 Weaviate Cloud 集群,请前往Weaviate Cloud 控制台并创建一个免费的 Sandbox 集群。
然后,您可以按照快速入门教程将数据添加到您的集群,或者将此提示复制到您最喜欢的 vibe 编码 LLM 聊天中。
You are helping a user create a custom Python script to import their data into Weaviate. Follow these steps exactly and **DO NOT modify any code except where explicitly marked with `# LLM TODO:`**.
## Step 1: Gather Requirements and Setup Environment
Ask the user to provide the following information AND complete the environment setup:
### Part A: Requirements
1. **Embedding Model Provider**: What embedding model provider would you like to use?
- Available options: [https://docs.weaviate.org.cn/weaviate/model-providers](https://docs.weaviate.org.cn/weaviate/model-providers)
- If unsure, recommend `text2vec-weaviate` (built-in, no API key required)
2. **Data Location**: Where is your data located?
- Local file path (e.g., `/path/to/data.json`)
- URL endpoint
- Other source
3. **Data Schema**: Please provide an example object from your data. This will be used to define the property schema.
- Example: `{"title": "Sample Title", "content": "Sample content text", "category": "example"}`
### Part B: Environment Setup
Please also complete this setup:
**Create Environment File**
Create a `.env` file in your project directory with these variables:
```
WEAVIATE_URL=
WEAVIATE_API_KEY=
EMBEDDINGS_PROVIDER_API_KEY=
```
**Setup Instructions:**
- Sign up for a free Weaviate Cloud account: [https://console.weaviate.cloud/](https://console.weaviate.cloud/)
- Create a free Sandbox cluster
- Copy your cluster URL and API key to the `.env` file
- If using `text2vec-weaviate`, leave `EMBEDDINGS_PROVIDER_API_KEY` empty
- If using another provider, add your API key for that provider
**WAIT for the user's response to Part A and confirmation that they have completed Part B before proceeding to Step 2.**
## Step 2: Virtual Environment Setup
Check if the user has a virtual environment. If not, instruct them to create one:
```bash
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\\Scripts\\activate
```
## Step 3: Install Dependencies
Install required packages:
```bash
pip install -U weaviate-client python-dotenv
```
## Step 4: Generate Custom Import Script
Create a file called `import_data.py` with the following code. **CRITICAL: Only modify sections marked with `# LLM TODO:`**
```python
import weaviate
from weaviate.classes.init import Auth
from weaviate.classes.config import Configure, Property, DataType, Tokenization
import os
import json
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
weaviate_url = os.environ["WEAVIATE_URL"]
weaviate_api_key = os.environ["WEAVIATE_API_KEY"]
embeddings_provider_api_key = os.environ.get("EMBEDDINGS_PROVIDER_API_KEY", "")
# Connect to Weaviate Cloud
if embeddings_provider_api_key:
client = weaviate.connect_to_weaviate_cloud(
cluster_url=weaviate_url,
auth_credentials=Auth.api_key(weaviate_api_key),
headers={"X-xx-Api-Key": embeddings_provider_api_key} # LLM TODO: Replace 'xx' with correct provider header name (e.g., "X-OpenAI-Api-Key", "X-Cohere-Api-Key")
)
else:
client = weaviate.connect_to_weaviate_cloud(
cluster_url=weaviate_url,
auth_credentials=Auth.api_key(weaviate_api_key)
)
print(f"Weaviate client ready: {client.is_ready()}") # Should print: True
# Create collection
collection = client.collections.create(
name="YourCollectionName", # LLM TODO: Replace with appropriate collection name based on user's data
vector_config=[
Configure.Vectors.text2vec_weaviate( # LLM TODO: Replace with user's chosen provider (e.g., text2vec_openai, text2vec_cohere)
name="default",
source_properties=["property1", "property2"], # LLM TODO: Set source properties for vectorization based on user's data schema
),
],
properties=[
# LLM TODO: Define properties based on user's example data
# Example:
# Property(name="title", data_type=DataType.TEXT),
# Property(name="content", data_type=DataType.TEXT),
# Property(name="category", data_type=DataType.TEXT, skip_vectorization=True),
]
)
# LLM TODO: Load data based on user's specified location
# For local JSON file:
# with open("FILE_PATH", "r") as f:
# data = json.load(f)
# For URL endpoint (note make sure to pip install and import requests library:
# response = requests.get("YOUR_URL")
# data = response.json()
# For other formats, adjust accordingly
# Import data in batches
with collection.batch.fixed_size(batch_size=200) as batch:
for i, item in enumerate(data):
batch.add_object({
# LLM TODO: Map user's data properties to collection schema
# Example:
# "title": item["title"],
# "content": item["content"],
# "category": item["category"],
})
if batch.number_errors > 10:
print("Batch import stopped due to excessive errors.")
break
# Progress indicator
if i % 100 == 0:
print(f"Imported {i} objects...")
# Check for import errors
failed_objects = collection.batch.failed_objects
if failed_objects:
print(f"Number of failed imports: {len(failed_objects)}")
print(f"First failed object: {failed_objects[0]}")
else:
print("All objects imported successfully!")
print(f"Total objects in collection: {collection.aggregate.over_all(total_count=True).total_count}")
client.close()
### LLM TODO Instructions Summary:
1. **Line with headers**: Replace 'xx' in header name with correct provider (only if not using text2vec-weaviate)
2. **Collection name**: Choose appropriate name based on user's data type
3. **Vector config**: Replace with user's chosen embedding provider
4. **Source properties**: Set which properties should be vectorized
5. **Properties schema**: Define all properties from user's example data
6. **Data loading**: Implement correct data loading method based on user's data location
7. **Object mapping**: Map user's data fields to the defined schema
## Step 5: Error Handling
If there are any errors during execution:
1. First consult the Weaviate documentation: [https://docs.weaviate.org.cn/weaviate/quickstart](https://docs.weaviate.org.cn/weaviate/quickstart)
2. Check the specific error message and troubleshoot accordingly
3. Verify the `.env` file is properly configured
4. Ensure the data schema matches the actual data structure
## Step 6: Execute the Script
Run the import script:
```bash
python import_data.py
```
Upon successful completion, inform the user that their data has been imported to Weaviate and provide next steps for querying their data.
---
## Important Reminders:
- **Only modify code sections marked with `# LLM TODO:`**
- **Wait for user responses at Steps 1 and 2**
- **If using `text2vec-weaviate`, no external API key is needed**
- **Preserve all existing code structure and imports**
如果您正在寻找一些用于测试的数据集,请查看这里:https://hugging-face.cn/datasets/weaviate/agents
步骤 3:添加您的配置设置
在配置编辑器中,您可以添加您的 Weaviate 集群 URL 和 API 密钥,并设置您的模型和模型提供商 API 密钥。您还可以创建多个配置,以便可以轻松地在数据集群或模型提供商之间切换。

在左侧菜单栏中,您还可以自定义您自己的 blob!
第 4 步:分析您的数据
在左侧菜单栏的 Data(数据)选项卡下,您可以分析您的集合,这将提示 LLM 生成属性描述、数据集摘要、示例查询以及为每个集合选择显示类型。
当您点击一个数据源时,您可以查看集合中的所有项目并编辑任何元数据,包括选择其他显示类型或配置属性映射。
第 5 步:开始聊天
现在可以开始提问了!前往 Chat(聊天)选项卡创建一个新的对话并与您的数据聊天。如果您想查看决策树,请点击聊天视图左上角的绿色按钮切换到树形视图,并将鼠标悬停在任何节点上以获取该节点的描述、LLM 的指令以及 LLM 的推理过程。每次新的用户查询都会在此视图中生成一个新的决策树。

设置也可以在每个聊天级别进行配置。您可以添加更详细的 Agent 指令,或更改您的模型设置。
作为一个 Python 库
只需使用以下命令安装:
pip install elysia-ai
然后在 Python 中,使用 Elysia 就像这样简单:
from elysia import tree, preprocess
preprocess("<your_collection_name>")
tree = Tree()
tree("What is Elysia?")
使用 Elysia 需要访问 LLM 和您的 Weaviate 云详细信息,这些信息可以设置在您的本地环境变量文件中,或直接在 Python 中进行配置。 完整文档 提供了详细的配置选项和示例。
接下来是什么?
我们还在努力中 🧑🍳
我们计划并正在进行几项功能,包括类似于 Verba 的自定义主题,这将允许用户将 Elysia 的外观与他们的品牌相匹配。但除此之外,您还需要拭目以待 👀
结论:Agentic RAG 的未来
Elysia 不仅仅是另一个 RAG 实现 - 我们构建它是为了展示 AI 应用程序可以实现的新方法。通过结合透明的 Agent 决策、动态显示以及长期个性化和优化,我们认为我们正在朝着创建一个能够理解您所提问内容,并能有效地呈现答案的 AI 助手方向前进。
Elysia 最终将取代 Verba,我们最初的 RAG 应用程序,作为我们开发具有向量数据库作为核心的尖端应用程序的下一步。超越简单的 Ask-Retrieve-Generate 管道,我们创建了一个用于开发复杂的 Agentic AI 应用程序的基础设施,同时保持开发人员和用户体验简单直接。
无论您是构建电子商务聊天机器人、内部公司知识专家,还是其他全新的东西,Elysia 都为超越文本生成的 AI 体验提供了基础。我们迫不及待地想看看您会构建什么!
所以,准备好开始了吗?访问 演示,查看 GitHub 仓库,或深入 文档 以开始构建。

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