如何构建一个电影推荐应用,无需处理向量数据库的复杂性

使用 Streamlit-Weaviate 连接集成向量数据库

作者:Liz Acosta
发布于 AI秘籍
How to build a movie recommendation app without the complexities of vector databases

人如其食;你的模型取决于它所摄取的数据。

数据不仅为AI系统提供信息,数据也是你最终收到的输出。这就是为什么拥有“好的”数据很重要。无论你的模型多么强大,“垃圾进”总是会导致“垃圾出”。

在软件开发中,这不是一个新概念或问题。然而,AI在整个ETL过程中需要更复杂的数据策略。这可能会减缓你的AI集成应用的交付速度。

在这个秘籍中,你将使用 Weaviate 抽象化向量数据库相关的复杂性,让你能够以更少的技术开销实现强大的搜索和推荐系统。然后我们将使用 Streamlit 来构建应用的聊天机器人部分。 

而且别慌!不涉及前端开发!

继续阅读以了解

  • 什么是 Weaviate
  • 什么是 Streamlit
  • 如何构建一个 Weaviate 电影推荐 Streamlit 演示应用
  • 如何在 Weaviate Cloud 中查询一个 Collection

不想阅读?这里有一些探索此演示的其他方式

什么是 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、向量数据库或 LangChainLlamaIndex 或 Weights & Biases 等各种 AI 框架。Streamlit 的聊天元素使得与 AI 交互变得异常容易,因此你可以构建与你的数据“对话”的聊天机器人。

与 Replicate 等平台结合使用,Streamlit 可以让你创建生成式AI应用,而无需任何应用设计开销。

要了解更多关于 Streamlit 的信息,请参阅101 指南

💡
要了解 Streamlit 如何促使你向前发展,请查看这篇博客文章

尝试应用秘籍:Weaviate + Streamlit

在此演示中,你将启动一个电影推荐应用,该应用利用 Weaviate 进行后端数据管理,并在前端使用 Streamlit 聊天元素进行交互。该应用接受用户的自然语言输入,并使用 Weaviate 将输入转换为查询,然后生成电影标题列表。

有三种不同的搜索模式可用

关键词:此搜索模式使用 BM25 根据搜索词的相对频率对文档进行排名。在此特定应用中,这意味着返回的结果取决于搜索关键词在不同电影属性中出现的频率。

语义:此类搜索使用向量根据其与搜索查询的相似性生成结果。换句话说,返回的结果基于“含义”的相似性。要了解有关向量数据库的更多信息,请查阅 Weaviate 的《向量数据库简要介绍》

混合:混合搜索结合了向量和 BM25 搜索,以提供结合两者优点的搜索结果。 

先决条件

在此应用中,Cohere API 用于两种不同的操作

请注意,WeaviateCohere 的试用账户都有使用限制。请查看它们的网站了解更多详情。

💡
要了解更多关于 API 密钥的信息,请查看此博客文章

环境设置

本地设置:创建虚拟环境

  1. 克隆 Cookbook 仓库:git clone https://github.com/streamlit/cookbook.git
  2. 从 Cookbook 根目录,将目录更改为 recipe:`cd recipes/weaviate`
  3. 将必要的密钥添加到 .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"
    
  4. 将文件名从 secrets_template.toml 更新为 secrets.toml:mv .streamlit/secrets_template.toml .streamlit/secrets.toml
    (要了解更多关于 Streamlit 中的密钥处理,请参阅此处的文档。)
  5. 创建虚拟环境:python3 -m venv weaviatevenv
  6. 激活虚拟环境:source weaviatevenv/bin/activate
  7. 安装依赖项:pip install -r requirements.txt

将数据添加到你的 Weaviate Cloud

  1. 创建一个 Weaviate Cloud Collection 并向其中添加数据:python3 helpers/add_data.py
  2. (可选)验证数据:python3 helpers/verify_data.py

在 Weaviate Cloud 中查询 MovieDemo Collection

你可以通过 Weaviate Cloud UI 访问查询面板。

  1. 在编辑器中复制并粘贴以下查询
    { Get 
    {MovieDemo (limit: 3 where: {
    	path: ["release_year"],
    	operator: Equal,
    	valueInt: 1985}){
    budget
    movie_id
    overview
    release_year
    revenue
    tagline
    title
    vote_average
    }}}
    
  2. 点击箭头执行查询
A screenshot of the Weaviate Cloud UI and Query tool.

Weaviate Cloud 查询工具是一个基于浏览器的 GraphQL IDE。在上面的示例查询中,我们告诉 Weaviate 返回 MovieDemo Collection 中 release_year1985 的对象的 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 开发愉快! 🎈

分享此文章

评论

在我们的论坛中继续讨论 →

也在 AI 秘籍中...

查看更多 →