Upgrade to Pro — share decks privately, control downloads, hide ads and more …

BigQueryのSQLとPaLM2でRAGを作る

 BigQueryのSQLとPaLM2でRAGを作る

Masanori Okazaki

January 22, 2024
Tweet

More Decks by Masanori Okazaki

Other Decks in Programming

Transcript

  1. Copyright © GMO Research, Inc. All rights reserved. 1 ⾃⼰紹介

    岡崎 雅則 (Masanori Okazaki) GMOリサーチ グローバルシステム本部 CTO室 基盤課 仕事は︖ • 今は主にデータ基盤・アプリケーション基盤の構築運⽤ • データを使って何かを何かするときに裏で何かしてる ご趣味は︖ 好きなこと ︓ 愛⽝と散歩する 好きなもの ︓ 愛⽝
  2. Copyright © GMO Research, Inc. All rights reserved. 4 RAGとは︖

    RAG(Retrieval-Augmented Generation)と は︖ 質問に対して関連する情報を検索し、 その情報を基に回答を生成する自然言語処理の手法です。 検索(Retrieval)と生成(Generation)を組み合わせることで、 より正確で詳細な回答を提供 Q&Aチャットや、社内文書の検索など、など。。 LangChain, Llama index などを使うのが有名。。
  3. Copyright © GMO Research, Inc. All rights reserved. 5 BigQueryにはこんな機能が

    BigQuery ML でLLMが使える︕ BigQuery上で大規模言語モデルを扱える関数がある! ML.GENERATE_TEXT (テキスト生成) ML.GENERATE_TEXT_EMBEDDING(テキストのベクトル化) 他にも。 ML.DISTANCE (2つのベクトル間の距離を計算)
  4. Copyright © GMO Research, Inc. All rights reserved. 6 BigQueryにはこんな機能が

    これだけあれば BigQueryだけで RAGが作れるのでは︖︖
  5. Copyright © GMO Research, Inc. All rights reserved. 7 処理の概要は以下

    テキスト入力 ベクトル化 セマンティック検索 プロンプト テキスト生成
  6. Copyright © GMO Research, Inc. All rights reserved. 8 まずは下準備

    • BigQueryと外部リソースを接続するためのコネクタを作ります • 使⽤するモデルを定義していおきます bq mk --connection ¥ --location=asia-northeast1 ¥ --project_id="okazaki-data-project" ¥ --connection_type=CLOUD_RESOURCE "vertex_ai_connection" create or replace model sql_rag.embeding_model remote with connection `asia-northeast1.vertex_ai_connection` OPTIONS (ENDPOINT = 'textembedding-gecko-multilingual@001'); create or replace model sql_rag.generate_text_model remote with connection `asia-northeast1.vertex_ai_connection` OPTIONS (ENDPOINT = 'text-bison-32k@002')
  7. Copyright © GMO Research, Inc. All rights reserved. 9 予備知識データベースのベクトル化

    テーブルを作る ベクトルを格納する列は Float型 REPEATED で宣言する textをベクトル化 UPDATE `sql_rag.embeding_text` AS e SET embeding = ( SELECT text_embedding FROM ML.GENERATE_TEXT_EMBEDDING( MODEL `sql_rag.embeding_model`, (SELECT e.text as content), STRUCT(TRUE AS flatten_json_output) )) WHERE true textにはBigQuery関数の 名前と、機能の組み合わせを設定済
  8. Copyright © GMO Research, Inc. All rights reserved. 11 セマンティック検索

    入力された文字列をベクトル化する ベクトル距離が近いテキストを取得する WITH input_text_to_vector AS ( SELECT text_embedding FROM ML.GENERATE_TEXT_EMBEDDING( MODEL `sql_rag.embeding_model`, (SELECT '複数の配列を接続する' AS content), STRUCT(TRUE AS flatten_json_output) ) ) SELECT text, ML.DISTANCE(text_embedding, e.embeding) as distance FROM input_text_to_vector CROSS JOIN (SELECT * FROM `sql_rag.embeding_text`) as e ORDER BY distance limit 3
  9. Copyright © GMO Research, Inc. All rights reserved. 13 プロンプトを作る

    SELECT CONTACT( ‘コンテキストに示されている過去情報に従って質問に答えてください¥n’, ‘明らかに関係ないコンテキストは無視してください¥n’, ‘明らかに関係ないコンテキストは回答に含めないでください¥n’, ‘できる限り最後まで言い切ってください¥n¥n’, ‘質問の内容が複数のコンテキストに合致する場合分割して回答してください¥n¥n’, ‘# 質問¥n’, ‘複数の配列を接続する¥n¥n’, ‘# コンテキスト情報¥n’, ‘・1行が1コンテキストになります¥n’ ‘------------------¥n’, ARRAY_AGG(text, ‘¥n’), ‘------------------¥n’ ) AS content LLMに入力するテキストを作ります。
  10. Copyright © GMO Research, Inc. All rights reserved. 14 プロンプトを作る

    プロンプトはこんな感じ コンテキストに示されている過去情報に従って質問に答えてください 明らかに関係ないコンテキストは無視してください 明らかに関係ないコンテキストは回答に含めないでください できる限り最後まで言い切ってください 質問の内容が複数のコンテキストに合致する場合分割して回答してください # 質問 複数の配列を接続する # コンテキスト情報 ・1行が1コンテキストになります ------------------ ARRAY_CONCAT:複数の配列を連結して一つの配列にします。 ARRAY_TO_STRING:配列の要素を文字列に変換し、指定された区切り文字で連結します。 CONCAT:文字列を連結します。 ------------------
  11. Copyright © GMO Research, Inc. All rights reserved. 15 Text

    Generation SELECT ml_generate_text_llm_result FROM ML.GENERATE_TEXT( MODEL `sql_rag.generate_text_model`, (SELECT content AS prompt FROM rag_prompt), STRUCT( 0.2 AS temperature, 1024 AS max_output_tokens, TRUE AS flatten_json_output)); 最後に回答を作ってもらう
  12. Copyright © GMO Research, Inc. All rights reserved. 16 全部合体してRAGが完成

    DECLARE question_text STRING; SET question_text = '複数の配列を接続する'; WITH input_text_to_vector AS ( SELECT text_embedding FROM ML.GENERATE_TEXT_EMBEDDING( MODEL `sql_rag.embeding_model`, (SELECT question_text AS content), STRUCT(TRUE AS flatten_json_output) ) ) ,context AS ( SELECT text, ML.DISTANCE(text_embedding, e.embeding) as distance FROM input_text_to_vector CROSS JOIN (SELECT * FROM `sql_rag.embeding_text`) as e ORDER BY distance limit 3 ) ,rag_prompt AS ( SELECT CONCAT( 'コンテキストに示されている過去情報に従って質問に答えてください¥n’, '明らかに関係ないコンテキストは無視してください¥n’, '明らかに関係ないコンテキストは回答に含めないでください¥n’, 'できる限り最後まで言い切ってください¥n’, '質問の内容が複数のコンテキストに合致する場合分割して回答してください¥n¥n’, '回答はテキスト形式で回答してください。¥n’, '#質問¥n’, question_text, '¥n¥n’, '# コンテキスト情報¥n’, '・1行が1コンテキストになります¥n’, '------------------¥n’, STRING_AGG(text, '¥n’), '¥n------------------¥n’ ) AS content FROM context ) SELECT ml_generate_text_llm_result FROM ML.GENERATE_TEXT( MODEL `sql_rag.generate_text_model`, (SELECT content AS prompt FROM rag_prompt), STRUCT( 0.2 AS temperature, 1024 AS max_output_tokens, TRUE AS flatten_json_output));
  13. Copyright © GMO Research, Inc. All rights reserved. 17 結果

    #回答 ARRAY_CONCAT関数を使用します。 ARRAY_CONCAT(配列1, 配列2, ...) の形式で、連結したい配列を指定します。 例えば、以下の配列を連結する場合 ``` 配列1 = [1, 2, 3] 配列2 = [4, 5, 6] ``` ``` ARRAY_CONCAT(配列1, 配列2) ``` とすると、以下の配列が返されます。 ``` [1, 2, 3, 4, 5, 6] ``` • 今回は予定通りの結果 • 例なんて、DBには入れていないにも 関わらずちゃんと出てきてるのが面 白い • 質問文によっては頓珍漢な回答され ることも
  14. Copyright © GMO Research, Inc. All rights reserved. 18 メリット

    BigQueryでセマンティック検索できるのは便利 • SQLしかわからない人でも形にはできる • BIツール(Lookerなどなど)や、redash とかでもフロントになる • Llama index とか使わなくても社内のサービスぐらいなら。。
  15. Copyright © GMO Research, Inc. All rights reserved. 20 本文書は、GMOリサーチ株式会社が著作権その他の権利を有する営業秘密です。当社の許可なく複製し利用すること

    、また漏洩することは「著作権法」「不正競争防止法」によって禁じられております。 This document and all information contained in this document are the legal property of GMO Research, Inc. Any distribution, copying, or disclosure of information contained in this document without the consent of GMO Research, Inc. is strictly forbidden by the Japanese Intellectual Property Rights Law and Fair Competition Law.