本笔记本适用于以下场景:

  • 您的数据已存储在 Weaviate 中
  • 您希望将 Weaviate 与 Generative OpenAI 模块结合使用(generative-openai)。

先决条件

本指南仅涵盖生成式搜索示例,但不涵盖配置和数据导入。

为了最大限度地利用本指南,请先完成 入门指南,您将在其中学习 Weaviate 的基本知识并导入演示数据。

清单:

===========================================================

准备您的 OpenAI API 密钥

OpenAI API 密钥 用于导入时的数据向量化以及运行查询。

如果您没有 OpenAI API 密钥,可以从 https://beta.openai.com/account/api-keys 获取。

获取密钥后,请将其添加为环境变量 OPENAI_API_KEY

# 导出 OpenAI API 密钥
!export OPENAI_API_KEY="your key"
# 测试您的 OpenAI API 密钥是否已正确设置为环境变量
# 注意:如果您在本地运行此笔记本,则需要重新加载终端和笔记本才能使环境变量生效。
import os

# 注意:或者,您可以像这样设置一个临时环境变量:
# os.environ["OPENAI_API_KEY"] = 'your-key-goes-here'

if os.getenv("OPENAI_API_KEY") is not None:
    print ("OPENAI_API_KEY is ready")
else:
    print ("未找到 OPENAI_API_KEY 环境变量")

连接到您的 Weaviate 实例

在此部分,我们将:

  1. 测试环境变量 OPENAI_API_KEY请确保您已完成 #Prepare-your-OpenAI-API-key 步骤
  2. 使用您的 OpenAI API Key 连接到您的 Weaviate
  3. 并测试客户端连接

客户端

完成此步骤后,client 对象将用于执行所有与 Weaviate 相关的操作。

import weaviate
from datasets import load_dataset
import os

# 连接到您的 Weaviate 实例
client = weaviate.Client(
    url="https://your-wcs-instance-name.weaviate.network/",
    # url="http://localhost:8080/",
    auth_client_secret=weaviate.auth.AuthApiKey(api_key="<YOUR-WEAVIATE-API-KEY>"), # 如果您不使用身份验证连接到 Weaviate 实例(例如本地部署的实例),请注释掉此行
    additional_headers={
        "X-OpenAI-Api-Key": os.getenv("OPENAI_API_KEY")
    }
)

# 检查您的实例是否在线并准备就绪
# 这应该返回 `True`
client.is_ready()

生成式搜索

Weaviate 提供了一个 Generative Search OpenAI 模块,该模块根据您 Weaviate 实例中存储的数据生成响应。

构建生成式搜索查询的方式与 Weaviate 中的标准语义搜索查询非常相似。

例如:

  • 在“文章”中搜索,
  • 返回“标题”、“内容”、“网址”
  • 查找与“足球俱乐部”相关的对象
  • 将结果限制为 5 个对象
    result = (
        client.query
        .get("Articles", ["title", "content", "url"])
        .with_near_text("concepts": "football clubs")
        .with_limit(5)
        # 生成式查询将在此处添加
        .do()
    )

现在,您可以添加 with_generate() 函数来应用生成转换。with_generate 接受以下任一选项:

  • single_prompt - 为每个返回的对象生成一个响应,
  • grouped_task – 从所有返回的对象生成一个响应。
def generative_search_per_item(query, collection_name):
    prompt = "用一条简短的推文总结以下内容:{content}"

    result = (
        client.query
        .get(collection_name, ["title", "content", "url"])
        .with_near_text({ "concepts": [query], "distance": 0.7 })
        .with_limit(5)
        .with_generate(single_prompt=prompt)
        .do()
    )

    # 检查错误
    if ("errors" in result):
        print ("\033[91m您可能在本分钟内用完了 OpenAI API 调用次数 – 限额为每分钟 60 次。")
        raise Exception(result["errors"][0]['message'])

    return result["data"]["Get"][collection_name]
query_result = generative_search_per_item("football clubs", "Article")

for i, article in enumerate(query_result):
    print(f"{i+1}. { article['title']}")
    print(article['_additional']['generate']['singleResult']) # 打印生成的响应
    print("-----------------------")
def generative_search_group(query, collection_name):
    generateTask = "解释这些内容的共同点"

    result = (
        client.query
        .get(collection_name, ["title", "content", "url"])
        .with_near_text({ "concepts": [query], "distance": 0.7 })
        .with_generate(grouped_task=generateTask)
        .with_limit(5)
        .do()
    )

    # 检查错误
    if ("errors" in result):
        print ("\033[91m您可能在本分钟内用完了 OpenAI API 调用次数 – 限额为每分钟 60 次。")
        raise Exception(result["errors"][0]['message'])

    return result["data"]["Get"][collection_name]
query_result = generative_search_group("football clubs", "Article")

print (query_result[0]['_additional']['generate']['groupedResult'])

感谢您的跟随,您现在已经具备了设置自己的向量数据库并使用嵌入来完成各种酷炫事情的能力——祝您玩得开心!对于更复杂的用例,请继续完成此仓库中的其他指南示例。