人如其食;你的模型取决于它所摄取的数据。
数据不仅为AI系统提供信息,数据也是你最终收到的输出。这就是为什么拥有“好的”数据很重要。无论你的模型多么强大,“垃圾进”总是会导致“垃圾出”。
在软件开发中,这不是一个新概念或问题。然而,AI在整个ETL过程中需要更复杂的数据策略。这可能会减缓你的AI集成应用的交付速度。
在这个秘籍中,你将使用 Weaviate 抽象化向量数据库相关的复杂性,让你能够以更少的技术开销实现强大的搜索和推荐系统。然后我们将使用 Streamlit 来构建应用的聊天机器人部分。
而且别慌!不涉及前端开发!
继续阅读以了解
- 什么是 Weaviate
- 什么是 Streamlit
- 如何构建一个 Weaviate 电影推荐 Streamlit 演示应用
- 如何在 Weaviate Cloud 中查询一个 Collection
不想阅读?这里有一些探索此演示的其他方式
- 在 Streamlit Cookbook 仓库中查找代码
- 观看 Weaviate 技术课程开发者 JP Hwang 的视频演练
- 查看应用的部署版本或参阅下面的嵌入式应用(点击查看全屏)
什么是 Weaviate?
Weaviate 是一个AI原生数据库,旨在帮助你构建令人惊叹、可扩展且生产级别的AI驱动应用。它提供了强大的数据存储、检索和查询功能,并与AI模型集成,对于希望将AI能力集成到其应用中的开发者来说,它是一个绝佳的选择。
Streamlit-Weaviate 连接
Streamlit-Weaviate 连接是一个封装器,它简化了将 Weaviate 与 Streamlit 应用集成到一起的过程。此连接允许你执行各种操作,例如连接到远程或本地 Weaviate 实例、执行查询以及使用底层的 Weaviate Python 客户端。该项目是开源的,随时欢迎贡献。
主要特性
- 连接到 Weaviate Cloud 实例:使用 URL 和 API 密钥轻松连接到 Weaviate 云实例
- 执行查询:使用 query 或 GraphQL 查询方法执行简单和高级查询
- 使用 Weaviate Python 客户端:利用 Weaviate Python 客户端的全部功能执行更复杂的操作
- 支持本地实例:使用默认参数连接到本地 Weaviate 实例
- 密钥管理:Streamlit 可以处理密钥管理以实现安全连接
什么是 Streamlit?
Streamlit 是一个开源的 Python 框架,仅需几行代码即可构建高度交互的应用。Streamlit 集成了生成式AI领域的最新工具,例如任何 LLM、向量数据库或 LangChain、LlamaIndex 或 Weights & Biases 等各种 AI 框架。Streamlit 的聊天元素使得与 AI 交互变得异常容易,因此你可以构建与你的数据“对话”的聊天机器人。
与 Replicate 等平台结合使用,Streamlit 可以让你创建生成式AI应用,而无需任何应用设计开销。
要了解更多关于 Streamlit 的信息,请参阅101 指南。
尝试应用秘籍:Weaviate + Streamlit
在此演示中,你将启动一个电影推荐应用,该应用利用 Weaviate 进行后端数据管理,并在前端使用 Streamlit 聊天元素进行交互。该应用接受用户的自然语言输入,并使用 Weaviate 将输入转换为查询,然后生成电影标题列表。
有三种不同的搜索模式可用
关键词:此搜索模式使用 BM25 根据搜索词的相对频率对文档进行排名。在此特定应用中,这意味着返回的结果取决于搜索关键词在不同电影属性中出现的频率。
语义:此类搜索使用向量根据其与搜索查询的相似性生成结果。换句话说,返回的结果基于“含义”的相似性。要了解有关向量数据库的更多信息,请查阅 Weaviate 的《向量数据库简要介绍》。
混合:混合搜索结合了向量和 BM25 搜索,以提供结合两者优点的搜索结果。
先决条件
- Python >=3.8, !=3.9.7
- 一个 Weaviate 沙盒实例
(这也将为你提供在代码中使用的 API 和 URL) - 一个 Cohere API 密钥
在此应用中,Cohere API 用于两种不同的操作
- 将查询结果总结为自然语言推荐
- 将 MovieDemo 数据和查询转换为用于语义和混合搜索模式的高维向量表示
请注意,Weaviate 和 Cohere 的试用账户都有使用限制。请查看它们的网站了解更多详情。
环境设置
本地设置:创建虚拟环境
- 克隆 Cookbook 仓库:git clone
https://github.com/streamlit/cookbook.git
- 从 Cookbook 根目录,将目录更改为 recipe:`cd recipes/weaviate`
- 将必要的密钥添加到 .streamlit/secrets_template.toml 文件中
WEAVIATE_API_KEY = "your weaviate key goes here" WEAVIATE_URL = "your weaviate url goes here" COHERE_API_KEY = "your cohere api key goes here"
- 将文件名从 secrets_template.toml 更新为 secrets.toml:
mv .streamlit/secrets_template.toml .streamlit/secrets.toml
(要了解更多关于 Streamlit 中的密钥处理,请参阅此处的文档。) - 创建虚拟环境:
python3 -m venv weaviatevenv
- 激活虚拟环境:
source weaviatevenv/bin/activate
- 安装依赖项:
pip install -r requirements.txt
将数据添加到你的 Weaviate Cloud
- 创建一个 Weaviate Cloud Collection 并向其中添加数据:
python3 helpers/add_data.py
- (可选)验证数据:
python3 helpers/verify_data.py
在 Weaviate Cloud 中查询 MovieDemo Collection
你可以通过 Weaviate Cloud UI 访问查询面板。
- 在编辑器中复制并粘贴以下查询
{ Get {MovieDemo (limit: 3 where: { path: ["release_year"], operator: Equal, valueInt: 1985}){ budget movie_id overview release_year revenue tagline title vote_average }}}
- 点击箭头执行查询
Weaviate Cloud 查询工具是一个基于浏览器的 GraphQL IDE。在上面的示例查询中,我们告诉 Weaviate 返回 MovieDemo Collection 中 release_year
为 1985
的对象的 budget, movie_id, overview, release_year, revenue, tagline, title, vote_average, vote_count
属性。我们通过将 path
设置为 ["release_year"]
,将 operator
设置为 Equal
,将 valueInt
设置为 1985
来实现这一点。我们还通过 limit: 3
将查询结果限制为三个对象。
你应该会得到三部上映年份为 1985 年的电影结果。
这是一个简单的查询,它构成了更复杂查询的基础。要了解有关 Weaviate Cloud 查询工具可用的不同类型搜索的更多信息,请查阅文档。
运行 Weaviate Streamlit 推荐应用演示
要运行演示应用,请使用 Streamlit CLI:streamlit run demo_app.py
。
运行此命令会将应用部署到本地主机(localhost)上的一个端口。当你访问此位置时,你应该会看到一个正在运行的 Streamlit 应用。请注意,此版本的演示应用不包含海报图片,因此看起来与部署的应用不同。

向量数据库变得简单
使用 Streamlit-Weaviate 连接意味着你可以轻松地在你的 Streamlit 应用中创建和集成向量数据库。
在 demo_app.py
中,Weaviate 连接在此处创建
def setup_weaviate_connection(env_vars):
"""Setup Weaviate connection"""
return st.connection(
"weaviate",
type=WeaviateConnection,
url=env_vars["WEAVIATE_URL"],
api_key=env_vars["WEAVIATE_API_KEY"],
additional_headers={"X-Cohere-Api-Key": env_vars["COHERE_API_KEY"]},
)
使用 Streamlit 聊天元素,在此处创建提示并进行查询
with conn.client() as client:
collection = client.collections.get("MovieDemo")
response = collection.generate.hybrid(
query=movie_type,
filters=(Filter.by_property("release_year").greater_or_equal(year_range[0]) & Filter.by_property("release_year").less_or_equal(year_range[1])
),
limit=SEARCH_LIMIT,
alpha=SEARCH_MODES[mode][1],
grouped_task=rag_prompt,
grouped_properties=["title", "tagline"],
)
结果是一个完全交互式的推荐应用,无需 JavaScript 经验!如果你想了解更多关于 Weaviate 的信息,请查阅Weaviate 快速入门和Weaviate 学院。
使用 Streamlit 释放 AI 的潜力
有了 Streamlit,数月数月的应用设计工作被*简化*为只需几行 Python 代码。它是展示你最新 AI 发明的完美框架。
利用 Streamlit Cookbook 中的其他 AI 秘籍快速上手和运行。 (别忘了在论坛中展示你正在构建什么!)
Streamlit 开发愉快! 🎈
评论
在我们的论坛中继续讨论 →