# OpenAI

# はじめに

OpenAI Cookbookは、開発者が実世界のアプリケーションで使用するための実践的な例とコードスニペットのコレクションです。これは、人工知能研究の最前線にあるOpenAIの最新の先端モデルとツールの使用方法を示しています。

詳細については、OpenAI Cookbookのウェブサイト (opens new window)を参照してください。

# 前提条件

このガイドに従うには、以下が必要です。

  1. クイックスタートガイドに従って展開されたMyScaleクラスター。
  2. MyScaleとのやり取りに使用するclickhouse-connectライブラリ。
  3. クエリのベクトル化のためのOpenAI APIキー (opens new window)

# 必要なライブラリのインストール

このノートブックでは、openaiclickhouse-connect、およびその他の依存関係が必要です。次のコマンドを使用してそれらをインストールします。

!pip install openai clickhouse-connect wget pandas

# OpenAI APIキーの準備

OpenAI APIを使用するには、APIキーを設定する必要があります。まだAPIキーを持っていない場合は、OpenAI (opens new window)から取得できます。

import openai
# OpenAIのウェブサイトからAPIキーを取得する
openai.api_key = "OPENAI_API_KEY"
# 認証されていることを確認する
openai.Engine.list()

# MyScaleに接続する

接続の詳細セクションに従って、MyScaleコンソールからクラスターホスト、ユーザー名、パスワード情報を取得し、以下に示すようにクラスターへの接続を作成します。

import clickhouse_connect
# クライアントの初期化
client = clickhouse_connect.get_client(host='YOUR_CLUSTER_HOST', port=443, username='YOUR_USERNAME', password='YOUR_CLUSTER_PASSWORD')

# データのロード

OpenAIが提供するWikipedia記事の事前計算済みベクトル埋め込みデータセットをロードする必要があります。wgetパッケージを使用してデータセットをダウンロードします。

import wget
embeddings_url = "https://cdn.openai.com/API/examples/data/vector_database_wikipedia_articles_embedded.zip"
# ファイルは約700 MBなので、時間がかかります
wget.download(embeddings_url)

ダウンロードが完了したら、zipfileパッケージを使用してファイルを展開します。

import zipfile
with zipfile.ZipFile("vector_database_wikipedia_articles_embedded.zip", "r") as zip_ref:
    zip_ref.extractall("../data")

これで、vector_database_wikipedia_articles_embedded.csvからデータをPandas DataFrameにロードできます。

import pandas as pd
from ast import literal_eval
# csvからデータを読み込む
article_df = pd.read_csv('../data/vector_database_wikipedia_articles_embedded.csv')
article_df = article_df[['id', 'url', 'title', 'text', 'content_vector']]
# 文字列からベクトルをリストに戻す
article_df["content_vector"] = article_df.content_vector.apply(literal_eval)
article_df.head()

# データのインデックス化

MyScaleに埋め込みデータを格納するためのarticlesという名前のSQLテーブルを作成します。このテーブルには、コサイン距離メトリックを持つベクトルインデックスと、埋め込みの長さの制約が含まれます。以下のコードを使用して、articlesテーブルを作成し、データを挿入します。

# ベクトルインデックスを持つarticlesテーブルを作成する
embedding_len=len(article_df['content_vector'][0]) # 1536
client.command(f"""
CREATE TABLE IF NOT EXISTS default.articles
(
    id UInt64,
    url String,
    title String,
    text String,
    content_vector Array(Float32),
    CONSTRAINT cons_vector_len CHECK length(content_vector) = {embedding_len},
    VECTOR INDEX article_content_index content_vector TYPE HNSWFLAT('metric_type=Cosine')
)
ENGINE = MergeTree ORDER BY id
""")
# データをバッチでテーブルに挿入する
from tqdm.auto import tqdm
batch_size = 100
total_records = len(article_df)
# バッチでデータをアップロードする
data = article_df.to_records(index=False).tolist()
column_names = article_df.columns.tolist()
for i in tqdm(range(0, total_records, batch_size)):
    i_end = min(i + batch_size, total_records)
    client.insert("default.articles", data[i:i_end], column_names=column_names)

検索を進める前に、ベクトルインデックスのビルド状態を確認する必要があります。ベクトルインデックスは自動的にバックグラウンドでビルドされます。

# 挿入されたデータの数を確認する
print(f"articles count: {client.command('SELECT count(*) FROM default.articles')}")
# ベクトルインデックスのステータスを確認する。ベクトルインデックスが'Ready'のステータスであることを確認する
get_index_status="SELECT status FROM system.vector_indices WHERE name='article_content_index'"
print(f"index build status: {client.command(get_index_status)}")

# データの検索

MyScaleでインデックス化されたデータを使用して、類似のコンテンツを検索することができます。まず、OpenAI APIを使用してクエリの埋め込みを生成します。次に、MyScaleを使用してベクトル検索を実行します。

import openai
query = "スコットランドの歴史で有名な戦闘"
# ユーザークエリから埋め込みベクトルを作成する
embed = openai.Embedding.create(
    input=query,
    model="text-embedding-ada-002",
)["data"][0]["embedding"]
# クエリを使用してデータベースから上位K件の類似コンテンツを検索する
top_k = 10
results = client.query(f"""
SELECT id, url, title, distance(content_vector, {embed}) as dist
FROM default.articles
ORDER BY dist
LIMIT {top_k}
""")
# 結果を表示する
for i, r in enumerate(results.named_results()):
    print(i+1, r['title'])
Last Updated: Tue May 07 2024 02:28:12 GMT+0000