BigQueryのSQLとPaLM2でRAGを作ってみた

BigQueryのSQLとPaLM2でRAGを作ってみた

みなさんこんにちは、システム部の岡崎です。今回はBigQueryのSQLだけでRAGを作ってみようと思います。

RAG(Retrieval-Augmented Generation)とは?

質問に対して関連する情報を検索し、その情報を基に回答を生成する自然言語処理の手法です。
検索(Retrieval)と生成(Generation)を組み合わせることで、より正確で詳細な回答を提供する仕組みのことです。

Chat GPT

Q&Aチャットや、社内文書の検索などで見かけますが、中でもLangChain, Llama indexpyhton framework が有名です。

BigQuery MLでLLMが使える

ある日、BigQuery ML について色々調べていると。。。

BigQuery上で大規模言語モデルを扱える関数がある!
ML.GENERATE_TEXT (テキスト生成)
ML.GENERATE_TEXT_EMBEDDING(テキストのベクトル化)

他にも。
ML.DISTANCE (2つのベクトル間の距離を計算)

これだけあればSQLだけで RAG が作れるのではないか?と思い、試してみることにしました。

処理の概要を考えてみる

処理の概要として、以下のステップを考えました。

まずは下準備

BigQueryからBigQuery外のリソースにアクセスするためのコネクタを作ります。
bq コマンドを使用します。

BigQueryで使用モデルの定義を追加します。

BigQuery Studio などからSQLを実行します。
【悲報】現時点では、Googleが23年12月に発表した新AIの「 Gemini」は使用できませんでした。。。(2024年1月26日現在)

予備知識データベースのベクトル化

テーブルを作ります。
こちらがベクトル化する文字列と、ベクトルを格納する Float(Repeateds) 型の構成です。

テーブルのupdateでベクトル化します。
ベクトル化には ML.GENERATE_TEXT_EMBEDDING 関数を使用します。
Update1発で全件ベクトル化できるのは便利です。

セマンティック検索

入力された文字列をベクトル化します。
前項で作ったテーブルを検索しベクトル距離が近いテキストを取得します。
ベクトルの距離の算出に ML.DISTANCE 関数を使用します。

検索結果はこんな感じです。大体目論見通りの結果でした。

プロンプトを作る

次にLLMに入力するテキストを作ります。

結果こんな感じになります。

最後に Text Generation

最後に回答となるテキスト LLMを使用して生成します。

全部合体してRAGが完成

これまでのSQLをすべて合体して整理すると、こんなソースになります。

結果出力(例)

結果の出力はこんな感じになりました。

  • 今回は予想通りの結果が出ました。
  • 使用例なんて、DBには入れていないにも関わらずちゃんと出てきてるのが面白いです。
  • 質問文によっては頓珍漢な回答をされることもあります。これは当たり前といえば当たり前ですね。

感想

  • BigQuerのSQLだけでRAGができたのは意外と便利
  • SQLしかわからない人でも形にはできるかも。
  • BIツール(Lookerなどなど)や、redash とかでもフロントになるので、外部提供するわけではなければ、これでも問題ないかも。
  • Llama index とか使わなくても社内のサービスぐらいなら、使いようによっては。。

以上となります。

なんとなく思いつきでやってみましたが、思いの外応用できそうな部分があったので、今後の開発にもいかせていけたらなと思います。

前の記事
«
次の記事
»

技術カテゴリの最新記事