目次
いくつか用語も説明したので(ベクトルデータベース、オブジェクト、コレクション、モジュール)、そろそろちょっと触ってみる、クイックスタートを紹介します。
英語で書かれたQuickstart (with cloud resources) | Weaviate Documentationもあるのですが、実は日本語のページが用意されてます。
こちらに沿って、簡単ですがクイックスタートを紹介します。
日本語のクイックスタートでは、Weaviateのクラスターに対して、「Jeopardy!」のデータを登録し、VectorizerモジュールとGeneratorモジュールにOpenAIのAPIを利用して、簡単なベクトル検索とRAG(検索拡張生成)を体験できます。
0 OpenAIのAPIキーの取得
このクイックスタートではOpenAIのAPIを利用します。 クイックスタートの「3.簡単なデータの取り込み」の「登録はこちら」リンクからOpenAIにサインアップするか、すでにOpenAIのAPIを利用されている方は、今回のためにAPIキーを生成して用意してください。
1 Weaviateデータベースの作成
マネージドサービスとして、Weaviate Cloudが用意されています。
ちょっと触ってみるのにはアカウントを作成してから、Sandboxクラスターを利用するのが簡単です。アカウント作成やSandboxクラスターの作成方法は以下のドキュメントを参考にしてください。
なお、Sandboxクラスターは14日間で自動で削除されるのでそこだけ注意が必要です。 容量の制限もあるので、大量データで利用する場合は別途、Serverlessなどを選択する必要があります。
2 Weaviate Clientライブラリのインストール
クイックスタートで選択できる言語は以下の通りです。
- Python
- JavaScript / TypeScript
- Go
- Java(最近クライアントが新しくなった)
各言語向けのクライアントのインストール方法が表示されています。 Dockerなどで環境を用意してインストールをしてもいいですし、ローカルにインストールすることもできます。
私は、Pythonを利用する場合はDevContainerの環境を用意したりします。 GoやJavaだとローカルで済ますかな?
たとえば、Goのプロジェクトを作っておいて以下を実行します。
go get github.com/weaviate/weaviate-go-client/v5
go install
3. 簡単なデータの取り込み
クライアントの接続
まずは、Weaviate Cloudのクラスターへの接続情報が必要にです。
1.で作成したクラスターをクリックし、Cluster detailsの画面で以下の情報をコピーし、環境変数に設定します。
- Informationのセクションの「REST Endpoint」の文字列を環境変数
WEAVIATE_URL
に設定 - API Keysのセクションで、「+ Create API Key」ボタンをクリックし、出てきたダイアログで
- Name:なんでもOK(例:
go-sample-client
) - Role:
admin
を選択
- Name:なんでもOK(例:
- 生成されたAPIキーをコピーして、環境変数
WEAVIATE_API_KEY
に設定(APIキーは生成するタイミングでダウンロードもできます)。
Weaviateにあるモジュールを経由して、OpenAIのAPIを実行するために、OpenAIのAPIキーをリクエストヘッダ経由で設定します。実際の値はOPENAI_API_KEY
という環境変数から取得しますので、APIキーを環境変数OPENAI_API_KEY
に設定します。
cfg := weaviate.Config{
Host: os.Getenv("WEAVIATE_URL"),
Scheme: "https",
AuthConfig: auth.ApiKey{Value: os.Getenv("WEAVIATE_API_KEY")},
Headers: map[string]string{
"X-OpenAI-Api-Key": os.Getenv("OPENAI_API_KEY"),
},
}
クイックスタートで使用する環境変数は以上の3つ(WEAVIATE_URL
、WEAVIATE_API_KEY"
、OPENAI_API_KEY
)です。
ここまでのプログラムも実行できるので、実行してみましょう。
Weaviateへの接続情報に問題がなければ、「true」とだけ表示されます(現時点ではOpenAIのAPIへの接続は未確認です)。
(このあとには、// Check the connection
の処理の部分は変更します)
データコレクションの作成
Weaviateでは、データを登録する前にコレクションを作成しておく必要があります。
今回の処理では、models.Class
という構造体を使ってスキーマを定義します。
- コレクションの名前(
Class
) - 使用するベクトライザー(
text2vec-openai
) - 使用するモジュール(
text2vec-openai
、generative-openai
)
使用するベクトライザーは、このコレクションでエンベディングのベクトル生成に利用するデフォルトのベクトライザーになります。
このクイックスタートでは、プロパティについては、データ登録時に自動で設定するようにしています。プロパティ個別にベクトライザーやその他の設定を行うこともできます(Basic collection operations | Weaviate Documentation)。
なお、今回の処理では、エラーが出力されなければ問題なくコレクションが作成されたということになります。エラー出ない場合のメッセージの処理がないためです。
Weaviate Cloudのコンソールで「Collections」をクリックし、先ほど作成したクラスターを選択した後に、「Question」というコレクションが表示されているかを確認することで処理の成功を確認できます。
データ登録
コレクションの作成もおわったので、Jeopardyのデータを登録します。 処理の流れとしては次のようになっています。
- Weaviateのクライアント接続
- JSONファイルのダウンロードしてmapの配列に
- 1データずつ、
models.Object
の構造体に変換 - ObjectsBatcher()を利用して、バッチ登録
- Weaviateがデータを受け取って、
text2vec-openai
モジュールを使ってベクトルに変換してからベクトルインデックスに登録 - JSONのプロパティからWeaviateのスキーマを自動で生成してくれる
- Weaviateがデータを受け取って、
3の構造体を作るときに、JSONの文字列のデータを入れているだけで、このタイミングではベクトルは生成していません。 4.1に書いたように、Weaviate内部でOpenAIのAPIを利用してエンベディングの生成を行います。 ですので、この処理を実行するときにはOpenAIのAPIキーを設定しておく必要があります。
コレクションの作成と同様に、エラーがなければ成功です。
ちなみに、OpenAIのAPIキーを設定せずに実行すると、次のようなエラーが出ます。
panic: ([]*models.ErrorResponseErrorItems0) 0xc000008870
goroutine 1 [running]:
main.main()
....weaviate-quickstart-go/main.go:68 +0x745
上記のサンプルのままでは、res.Result.Errosrs.Error
は配列のためエラーが発生してしまいました。
次のように修正することで、登録時のレスポンスにエラーが含まれている場合に、エラーの内容がきちんと表示できます。
for _, res := range batchRes {
if res.Result.Errors != nil {
for _, items0 := range res.Result.Errors.Error {
println(fmt.Sprintf("Error is %v", items0))
}
}
}
APIキーの設定を忘れているとこんな感じのエラーメッセージになります。
Error is &{API Key: no api key found neither in request header: X-Openai-Api-Key nor in environment variable under OPENAI_APIKEY}
データ登録できたかどうかは、この後のクエリで確認もできますし、先ほどのコンソールでのコレクションを見ると「10 objects」となってデータが登録されているのも分かります。
4. クエリ方法
最後は検索です。 クイックスタートでは、ベクトル検索とRAG(検索拡張生成)を試すことができます。
ベクトル検索
入力テキストからベクトライザーでベクトルを生成して、そのベクトルをもとにベクトルインデックスを検索する処理です。
今回のクイックスタートでは、検索には次の情報が指定されています。
- 検索結果に含めるプロパティ(フィールド)
[]graphql.Field
に指定しているもの
- クエリ文字列
nearText
に調べたい文章(今回はbiology
という単語)を設定
- 検索対象のクラス名(コレクション名)
- 「Question」
- 取得する件数(最もベクトルが近いものn件)
WithLimit
に2
を指定
返却されるresult
に検索結果が入っています。中身はWebに掲載されています(ローカルだとインデントされてないですが)。
RAG
ベクトル検索では、入力のテキストに近いオブジェクトを取得するだけでした。
RAGのサンプルコードでは、ベクトル検索をして結果を取得するところまでは同じ流れですが、
取得した後に、それぞれのオブジェクトのデータを使って文章の生成をモジュールを使用して行う処理が追加されています(WithGenerativeSearch()
メソッド)。
generativeSearch := graphql.NewGenerativeSearch().SingleResult("Explain {answer} as you might to a five-year-old.")
{answer}
に、ベクトル検索の結果のオブジェクトのanswer
プロパティの文字列が入ります。
そして、生成モジュールを通して、テキストが生成され、その結果が_additional
のgenerate
の中に帰ってきています。
クライアントアプリ側では、特にOpenAIのAPIの呼び出しを行っていませんが、文字列の生成までできています。
まとめ
ということで、日本語に翻訳されたクイックスタートについてGo言語のサンプルコードをもとに紹介をしました。 数件しかデータを入れていないですが、簡単に動作を確認できるかと思います。
クイックスタートはまだほんの入り口にすぎません。Weaviateでできることはほかにもあるので、ちょっとずつこれからも紹介していこうかと思います。
最後に
日本のコミュニティとしてConnpassにグループを作りました。
どうやってイベントをやるかはまだ考え中ですが、興味がある方は登録しておいていただければと。
どんな情報、どんなイベントがあれば興味をもっていただけるか?Weaviateを使ってみようと思うけど何から始めよう?など疑問に思うことがあればXやブログのコメントなどをいただければと思います。
comments powered by Disqus
See Also by Hugo
- Weaviate入門(モジュール)
- Weaviate入門(オブジェクト、コレクション)
- Weaviate入門(ベクトルデータベース、ベクトル)
- Weaviateで日本語を利用した検索という話をしました
- GoでSlackのボットを作った話