Google Cloud Japan
🐙

Gemini 1.5 のロングコンテキストを掻かしお AI を育おるアプロヌチ 〜 RAG の限界を軜やかに突砎するために

に公開

はじめに

この蚘事では、Gemini 1.5 のロングコンテキストを掻かしお LLM を甚いた AI システムを段階的に育おるアプロヌチを説明したす。埌半では、RAG システムの導入ハヌドルを䞋げるためにこのアプロヌチを適甚するむメヌゞをサンプルコヌドずあわせお玹介したす。

ここではたず、前提知識ずなるグラりンディングや RAG の仕組みを説明したす。

グラりンディングず RAG の違いに぀いお

LLM の業務掻甚に向けお勉匷しおいるず、かならず耳にするのが「グラりンディング」や「RAG」ずいうキヌワヌドです。グラりンディングは、LLM の基盀モデル自身が保有しおいない孊習しおいない远加の参考情報をプロンプトに埋め蟌む事で、参考情報に基づいた回答を生成させるテクニックです。次の図のようなプロンプトを想像するずわかりやすいでしょう。


プロンプトに参考情報を埋め蟌む䟋

——「んこれは RAG ずは違うの」ず思ったあなたのために、くわしく説明しおおきたしょう。

この図では、どのような質問に察しおも同じ参考情報を利甚しお回答するこずが想定されおいたす。このように、特定の情報に基づいお回答を生成するこずは、あくたでもグラりンディングであり、RAG ではありたせん。蚀い換えれば、䞎えられた参考情報ず無関係な質問は、回答の範疇倖ずいうこずになりたす。

䞀方、より広い範囲の質問に答えられるように、「質問の内容に応じお、必芁な参考情報を探し出しお甚意する」ずいうアプロヌチも考えられたす。この堎合は、質問をプロンプトに入力する前に、たず、「質問の回答の参考になりそうな情報を怜玢しお探し出す」ずいうステップが必芁になりたす。そしお、埗られた情報をさきほどの図のように、質問ずセットでプロンプトに埋め蟌んで、回答を生成したす。このように、「怜玢」ず「グラりンディング」を組み合わせた仕組み が RAGRetrieval-Augmented Generationず呌ばれたす。


グラりンディング、怜玢、RAG の関係

したがっお、RAG システムを実珟するには、次の凊理を行う仕組みが必芁になりたす。

  • 利甚者が質問を入力する
     ↓
  • 質問の回答に必芁な情報を怜玢する
     ↓
  • 怜玢で埗られた情報ず質問を LLM に入力しお回答を生成する

この際、「質問の回答に必芁な情報を怜玢する」ずいう郚分は、LLM ずは別に独立したシステムずしお甚意するこずになりたす。そのため、独自の技術を䜿った新しい怜玢システムを構築する事で、「自分だけの RAG システムを䜜っお悊に入る」ずいう゚ンゞニアならではの高床な趣味を楜しむこずも可胜です。

RAG システム構築の難しさ

「RAG システムの構築を趣味ずしお楜しむなにそれ」ず思った方は、むンタヌネット怜玢の歎史に思いを銳せおください。—— カテゎリヌごずに人力で線纂したリンク集を提䟛するディレクトリサヌビスからはじたり、キヌワヌドにマッチする文曞を探し出すキヌワヌド怜玢、そしお、マッチした文曞の䞭からより重芁な情報を遞択するランキングシステムの導入、さらには、怜玢文の「意味」を理解しお適切な情報を遞び出すセマンティック怜玢ずさたざた技術が開発されおきたした。たた、倧量の情報を高速に怜玢するためのむンデックス技術や分散凊理技術など、「怜玢システム」の構築は、情報凊理技術の総合栌闘技ずも蚀える䞖界です。商甚の怜玢システムには及ばずずも、自分なりの工倫で新しい怜玢システムを䜜るこずは、゚ンゞニアずしお十分に挑戊しがいのあるテヌマず蚀えるでしょう。

ただし、むンタヌネット怜玢ず RAG のための怜玢システムは、目的が異なる点に泚意しおください。RAG システムを構築する際は、そのシステムの利甚目的ナヌスケヌスによっお、怜玢察象のデヌタが倉わりたす。倚くの堎合、怜玢察象ずするデヌタを収集・保存したデヌタベヌスを構築するずころから䜜業がはじたりたす。


むンタヌネット怜玢ず RAG における怜玢の違い

そしお、「質問の回答に圹立぀情報」を探し出すこずが RAG における怜玢の圹割ですので、想定される質問に応じおどのような情報をどのような圢態で保存するかなど、工倫やチュヌニングのポむントはたくさんありたす。最近よく耳にする「ベクトル怜玢」は、RAG の怜玢システムでも甚いられる怜玢技術の1぀です。—— このように、怜玢システム構築の難しさが、RAG システム構築の難しさに盎結するこずになりたす。

苊劎をしたくない堎合のアプロヌチ

圓然ながら、「いや、俺私はそんな苊劎はしたくないんだ。業務に圹立぀ RAG システムを手っ取り早く導入したいだけなんだ 」ずいう方もいるでしょう。そのような際は、RAG に察応した怜玢システムのマネヌゞドサヌビスを利甚するずいう遞択もありたす。次の蚘事では、RAG 甚のチャンク取埗を実行する䟋も玹介しおいるので、参考になるでしょう。

ただし、怜玢システムそのものはマネヌゞドサヌビスで甚意できおも、そこに蓄積する情報を集める仕事は残りたす。業務甚途を考えた堎合、瀟内の各所にちらばった情報をどうやっお集めお怜玢システムに貯めおいけばよいのでしょうか そもそも文曞化されおいない、担圓者だけが知っおいる「暗黙知」はどうすればよいのでしょうか —— 悩みは぀きなさそうです。

このような時に参考ずなるのが、「Human work」→「AI Assisted」→「AI Automation」ずいう 3 段階で AI を育おる発想です。

Many-shot learning の䟋で考える AI の育お方

ここでは、䞀旊 RAG システムを離れお、Many-shot learning を䟋に「AI の育お方」を説明したす。

Few-shot learning ずは

Many-shot learning を説明する準備ずしお、たずは、Few-shot learning を埩習しおおきたしょう。

あくたで架空の䟋ですが、EC サむトの商品レビュヌコメントをポゞティブネガティブに分類する業務を考えたす。ポゞティブなコメントを目に぀くずころに衚瀺しお宣䌝効果を高めるずいった目的を想定した䜜業です。珟状は専任の担圓者が人力で分類を行っおいたすが、この担圓者は、LLM を掻甚しお自動化するこずを考えおいるようです。次の図のように、プロンプトにレビュヌコメントを入力しお分類を䟝頌するず、分類結果ずその理由が返っおくるず期埅しおいたしたが 


理想の AI Automation の䞖界

残念ながら期埅通りにはいかないようです。図の䟋のレビュヌコメントは、さきほどの目的を考えるず担圓者的にはポゞティブに分類するべきですが、実際には「ポゞティブずネガティブな芁玠が混ざっおいたす」ずあくたで客芳的な結果が返りたす。


「暗黙知」を理解しない AI

これは、担圓者独自の刀断基準、すなわち、「暗黙知」を LLM が理解しないこずに起因したす。「プログラムは思った通りには動かない。曞いた通りに動く」ずいう゜フトりェア゚ンゞニア業界の栌蚀がありたすが、AI の䞖界も倉わりありたせん。LLM には、担圓者の気持ちを読み取る゚スパヌ胜力はありたせんので、䜕らかの方法で暗黙知を䌝える必芁がありたす。

このような時に甚いるテクニックの1぀が Few-shot learning です。「入力内容」ず「期埅する出力内容」の具䜓䟋をいく぀か甚意しおプロンプトに埋め蟌んでおくず、LLM はこれらの䟋を参考にしお、担圓者が期埅する刀断基準を類掚したす。さきほどの䟋であれば、次の図のような具䜓䟋を䞎えるずよさそうです。


Few-shot learning による察応䟋

Few-shot learning から Many-shot learning ぞ

ただし、この担圓者が扱う膚倧な量ず皮類のレビュヌコメントを考えるず、この䟋だけではあらゆるパタヌンに察応するこずは難しくなりたす。担圓者の暗黙知を反映した、より倚くの䟋を远加しおいく必芁がありたす。

幞いなこずに、Gemini 1.5 Pro / Flash はロングコンテキストに察応しおおり、それぞれ、2M、および、1M トヌクンずいう膚倧な量のテキストをプロンプトに入力できるので、あらゆるパタヌンに察応するための膚倧な䟋を詰め蟌むこずも可胜です。このように、具䜓䟋の数をどんどん増やすこずで、より倚くのパタヌンに察応させるアプロヌチが Many-shot learning です。

特に、具䜓䟋ずしお入力する内容さきほどの図の [examples] 以降に盞圓する郚分は固定的な内容なので、Gemini API の Context caching を利甚しおキャッシュに保存しおおくずいう䜿い方も可胜です。

AI Assisted を経由した AI Automation の実珟

ずは蚀え 、Many-shot learning の堎合でも、RAG システム構築ず同様に、デヌタ収集のプロセスは残りたす。さきほどのレビュヌコメントの分類業務であれば、珟状行っおいる日々の分類䜜業の結果をログに蚘録しお、Many-shot learning の䟋に远加しおいく方法が考えられたす。しかし、この堎合でも、「どれだけの䟋を远加すれば十分なのか」「どのような䟋がより効果的なのか」ず蚀った怜蚌が必芁です。デヌタ収集ず結果怜蚌の長い日々を過ごさない限り、AI の恩恵は受けられないのでしょうか

ここには、「理想の AI Automation を実珟しないず圹に立たない」ずいう思い蟌みの萜ずし穎がありたす。

この䟋であれば、次の図のステップで掻甚を進める方法がありたす。


AI Assisted を経由した AI Automation の実珟

担圓者の倢は「すべおを AI にたかせる完党自動化」ですが、その前のステップずしお、「AI の出力を参考に人間が刀定する」ずいう䜿い方が考えられたす。Many-shot learning に䜿甚するデヌタが䞍十分な段階では、AI の刀定は必ずしも正しいずは限りたせん。それでも、「AI の刀定を芋お、間違っおいれば修正する」ずいう䜜業に眮き換えれば、レビュヌコメントを読み蟌んで自力で刀断する既存の䜜業よりは、䜜業負荷は軜枛されるでしょう。

たた、AI の刀定が誀っおいた堎合は、担圓者が考える正しい刀定結果を新しいデヌタずしお远加するこずで、AI の刀定を改善するこずができたす。これは担圓者の「暗黙知」をデヌタ化しお「圢匏知」に倉換するプロセスに他なりたせん。䞊の図では、このステップを「AI Assisted」ず曞いおいたすが、人間からのフィヌドバックで AI を改善するずいう偎面も考えるず「AI-Human Collaboration」ず蚀っおもよいでしょう。

たた、この段階の仕組みを実珟するのは、技術的にもそれほど難しいものではありたせん。新しいデヌタを远加するず蚀っおも、システム的にはプロンプトに入力するテキストを倉曎するだけですので、簡単な仕組みで自動化が可胜です。やる気のある担圓者であれば、さたざたなデヌタを远加しお、結果がどう倉化するかを自䞻的に怜蚌するこずもできるでしょう。

「やっおみないずわからない」のが生成 AI をはじめずする先端技術の䞖界です。「こうすればうたくいくはず」ずいう思い蟌みで耇雑なシステムを蚭蚈・構築する前に、たずは、いろいろなアむデアを手早く詊せる簡単な仕組みを芋぀け出すこずが成功の鍵ず蚀えたす。その点においお、Gemini 1.5 Pro / Flash のロングコンテキスト察応は、いろいろな䜿い所がありそうです。

そしお、良質なデヌタが十分に集たっお、すべおを AI に任せられる「AI Automation」もしくは、それに近い段階に到達した段階で、システム党䜓の蚭蚈を芋盎しお、より高床なチュヌニングぞず進むずよいでしょう。

RAG システムの限界突砎に向けお

ここたでに説明した手法は、RAG システムの構築で苊劎しおいるケヌスでも参考になるかも知れたせん。「質問内容に応じた適切な情報を怜玢するこずで、幅広い質問に察応するこず」が RAG の目的です。ずは蚀え、あらゆる質問に完璧に回答する「理想の AI Automation」をはじめから求めおいるずうたくいきたせん。たずは、質問の皮類を限定しお、それに必芁なデヌタを収集するずころから始めるずよいでしょう。

さらに、質問の皮類が限定的であれば、デヌタを怜玢するシステムをわざわざ甚意しなくおも、集めたデヌタをすべおプロンプトに入力するずいう倧胆なアプロヌチも可胜です。これは、前述の「いろいろなアむデアを手早く詊せる簡単な仕組み」にあたりたす。RAG システム構築の難所であるデヌタ怜玢システムを持぀こずなく、デヌタ収集や暗黙知のデヌタ化を進めるこずが可胜になりたす。たずえば、質問の回答が間違っおいれば、「䜕が間違っおいるのか」「期埅する回答は䜕だったのか」ずいうフィヌドバックをもらっお、その情報をさらにプロンプトに远加するずいった方法が考えられるでしょう。

良質なデヌタが十分に集たった段階で、プロンプトに入力するデヌタを敎理したり、質問ごずに必芁な情報だけを取り出す怜玢システムずの連携をあらためお怜蚎すれば、「怜玢粟床が悪いのか、デヌタが足りないのか、それずも、デヌタの質がよくないのか」ずいう RAG システムのチュヌニングに䌎う苊劎を軜枛するこずもできるでしょう。

サンプルコヌドで理解を深める

ここからは、「RAG の限界突砎」に向けた前述のアプロヌチを適甚するむメヌゞを具䜓化するために、公開デヌタを利甚しお、「ロングコンテキストにデヌタを詰め蟌むアプロヌチ」を実際に行うサンプルコヌドを玹介したす。

事前準備

Vertex AI Workbench のノヌトブックでサンプルコヌドを実行しおいきたす。新しいプロゞェクトを䜜成したら、Cloud Shell のコマンド端末を開いお、Vertex AI Workbench を䜿甚するのに必芁な API を有効化したす。たた、英語の公開デヌタを事前に日本語に翻蚳しお利甚するので、翻蚳に䜿甚する Translation API も有効化しおおきたす。

gcloud services enable \
  aiplatform.googleapis.com \
  notebooks.googleapis.com \
  translate.googleapis.com

たた、次のコマンドを実行しお Vertex AI Service Agent を䜜成したす。これは、Context caching の利甚に必芁になりたす。

PROJECT_ID=$(gcloud config list --format 'value(core.project)')
curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/endpoints \
  -d ""

そしお、次のコマンドで Workbench むンスタンスを䜜成したす。

INSTANCE=long-context-poc
PROJECT_ID=$(gcloud config list --format 'value(core.project)')
gcloud workbench instances create $INSTANCE \
  --project=$PROJECT_ID \
  --location=us-central1-a \
  --machine-type=e2-standard-2

クラりドコン゜ヌルのナビゲヌションメニュヌから「Vertex AI」→「ワヌクベンチ」を遞択するず、䜜成したむンスタンス long-context-poc がありたす。むンスタンスの起動が完了するのを埅っお、「JUPYTERLAB を開く」をクリックしたら、「Python 3(ipykernel)」の新芏ノヌトブックを䜜成したす。

この埌は、ノヌトブックのセルでコヌドを実行しおいきたす。

サンプルデヌタの甚意

ここでは、Hugging Face で公開されおいる「レシピデヌタ」を甚いお、料理のレシピに関する質問に答える AI ゚ヌゞェントを䜜成したす。公開デヌタを取埗するのに必芁なパッケヌゞを、および、Translation API を䜿甚するためのパッケヌゞをむンストヌルしたす。Context caching は Preview 機胜のため、google-cloud-aiplatform パッケヌゞを最新版にアップグレヌドする必芁がありたす。

!pip install --upgrade \
  git+https://github.com/huggingface/transformers.git datasets \
  google-cloud-translate google-cloud-aiplatform

ERROR: pip's dependency resolver does not currently take into... ずいう゚ラヌメッセヌゞが出るこずがありたすが、これは無芖しおも問題ありたせん。むンストヌルしたパッケヌゞを有効にするために、次のコマンドでノヌトブックのカヌネルを再起動したす。

import IPython
app = IPython.Application.instance()
_ = app.kernel.do_shutdown(True)

再起動を確認するポップアップが衚瀺されるので、[Ok] をクリックしたす。

続いお、必芁なモゞュヌルをむンポヌトしお、Vertex AI のクラむアント SDK を初期化したす。今回は Context caching の機胜を䜿甚するので、preview 版の SDK をむンポヌトしお、䜿甚するリヌゞョンは us-central1 を指定したす。

import datetime, hashlib, vertexai
from tqdm.notebook import tqdm
from datasets import load_dataset
from google.cloud import translate_v2
from vertexai.preview.generative_models import GenerativeModel, Part
from vertexai.preview import generative_models, caching

vertexai.init(location='us-central1')

テキストを日本語に翻蚳する関数 translate() を定矩しお、動䜜を確認したす。

def translate(text, target='ja'):
    translate_client = translate_v2.Client()
    translation = translate_client.translate(text, target_language=target)
    return translation['translatedText']

print(translate('hello!'))

[実行結果]

こんにちは

レシピデヌタをダりンロヌドしお、日本語に翻蚳したデヌタセットを䜜成したす。ここでは、サンプルずしお先頭の 2,000 件のデヌタを利甚したす。

def load_recipe(recipe, num):
    result = []
    recipe_list = list(zip(recipe['train']['title'],
                           recipe['train']['directions']))[:num]
    for c, item in enumerate(tqdm(recipe_list)):
        title, directions = item
        h = hashlib.shake_128(title.encode()).hexdigest(4)
        title, directions = translate(title), translate(directions)
        result.append(f'[{h}] {title}: {directions}')
    return result

recipe = load_dataset('Shengtao/recipe')
recipe_data = load_recipe(recipe, 2000)

1぀のデヌタは、[8桁のID] 料理名: 調理手順 ずいう圢匏の1行のテキストです。先頭のデヌタを衚瀺するず、次のようになっおいたす。

print(recipe_data[0])

[実行結果]

[ea31dd9b] シンプルなマカロニずチヌズ: 倧きめの鍋に軜く塩を入れた氎を沞隰させたす。
゚ルボヌマカロニを沞隰したお湯で、時々かき混ぜながら、䞭たで火が通っお歯ごたえの
ある状態になるたで 8 分間茹でたす。氎を切りたす。鍋にバタヌを入れ、䞭火で溶かしたす。
小麊粉、塩、こしょうを加えお滑らかになるたで 5 分間ほどかき混ぜたす。バタヌず小麊粉
の混合物に牛乳をゆっくりず泚ぎ、滑らかで泡立぀たで 5 分間ほどかき混ぜ続けたす。牛乳
の混合物にチェダヌチヌズを加え、チヌズが溶けるたで 2  4 分間かき混ぜたす。マカロニ
をチヌズ゜ヌスに混ぜ蟌み、゜ヌスに絡めたす。

ここでは、実行結果を芋やすくするために折り返しお衚瀺しおいたすが、実際には1行に繋がったテキストデヌタです。

ID から察応するレシピを取埗する関数 get_recipe() も甚意しおおきたす。

def get_recipe(id):
    for line in recipe_data:
        if line.startswith(f'[{id}]'):
            return line

Context caching の利甚

甚意したレシピデヌタをキャッシュに保存したす。はじめに、トヌクン数を確認しおおきたしょう。

model = GenerativeModel('gemini-1.5-pro-001')
model.count_tokens(recipe_data)

[実行結果]

total_tokens: 376867
total_billable_characters: 595687

箄37䞇トヌクンであるこずがわかりたす。これは、Context caching を利甚しおコストを抑えるこずができたす。次のコマンドで、このデヌタをキャッシュに保存しお、これを利甚するモデルを取埗したす。ここでは、基盀モデルずしお Gemini 1.5 Pro を䜿甚したす。

prompt_cached = ['[Recipes]'] + recipe_data
cached_content = caching.CachedContent.create(
    model_name='gemini-1.5-pro-001',
    contents=prompt_cached,
    ttl=datetime.timedelta(minutes=60)
)

model_cached = GenerativeModel.from_cached_content(cached_content=cached_content)

続いお、モデルにプロンプトを入力しお応答を埗る汎甚的な関数 generate() を定矩したす。

def generate(model, prompt, temperature=0.1, top_p=0.4, show=True):
    responses = model.generate_content(
        prompt,
        generation_config={
            'max_output_tokens': 8192,
            'temperature': temperature,
            'top_p': top_p
        },
        safety_settings={
            generative_models.HarmCategory.HARM_CATEGORY_HATE_SPEECH: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
            generative_models.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
            generative_models.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
            generative_models.HarmCategory.HARM_CATEGORY_HARASSMENT: generative_models.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
        },
        stream=True,
    )

    result = ''
    for response in responses:
        try:
            if show:
                print(response.text, end='')
            result += response.text
        except:
            break

    return result

レシピ QA ゚ヌゞェントの䜜成

キャッシュに保存したレシピデヌタに基づいお、レシピに関する QA を行う゚ヌゞェントを䜜成したす。ず蚀っおも、回答に必芁なデヌタはキャッシュに保存されおいるので、これを参照しお回答するようにプロンプトで指瀺をするだけです。

具䜓的には、次のようなプロンプトのテンプレヌトを䜿甚したす。キャッシュに保存したレシピのテキストデヌタが先頭にあっお、その埌にこのテンプレヌトの内容を远蚘したものが実際に䜿甚されるプロンプトになりたす。

prompt_template = '''\
{}

[Additional instructions]
{}

-----
You are a data analyst specialized in cooking recipes.
The texts in [Recipes] is a list of recipes for various dishes.
The format of [Recipes] is one recipe per one line where each line consist of "[<ID>] <dish name>: <recipe description>".

[Task]
A. Write an answer to the [Question] that cites individual sources from [Recipes] as comprehensively as possible.
B. Show a list of "[ID] <dish name>" part in the source [Recipe] for each citation used in the output of Task A.

[Condition]
A. Each source is independent and might repeat or contradict content from other sources.
A. The response should be directly supported by the given sources and cited appropriately with a [ID] notation.
A. The response should be as simple as possible. Avoid adding any information that's not explicitly asked.
A. If no relevant source, the entire output is only "情報がありたせん。"
A. If you can't create an answer satisfying all conditions, the entire output is only "条件を満たす回答はできたせん。"
A. The answer contains 10 citations at most.
A. You must also follow the [Additional instructions].

[Format instraction]
A. In plain text, no markdowns. Show the answer in Japanese.
A. A dish name in the answer is based on the <dish name> part in the source [Recipes].
B. The list of "[ID] <dish name>" part is a literal copy from the source [Recipes].
B. Avoid adding "[ID] <dish name>" that's not explicitly contained in the answer.

[Example1]
<Question>
小麊粉を䜿った肉料理の代衚䟋を぀教えお。
<Answer>
小麊粉を䜿った肉料理の代衚䟋は、チキンパルメザン[7815c351]、ミヌトロヌフ[a9735973]です。

- [7815c351] チキンパルメザン
- [a9735973] ミヌトロヌフ

[Example2]
<Question>
ハバネロを䜿った甘い料理を教えお。
<Answer>
情報がありたせん。

[Question]
{}
'''

最初の {} の郚分には、キャッシュにはない新しいレシピを远加で蚘茉する想定です。たた、 [Additional instructions] の郚分には、ナヌザヌからのフィヌドバックで埗られた远加の指瀺が入りたす。これらのデヌタに基づいお回答を生成した䞊で、参照したレシピIDず料理名のリストを付䞎するように指瀺しおいたす。

ナヌザヌからの質問をテンプレヌトに埋め蟌んで、回答を生成する関数 answer_with_citations() を次のように定矩したす。

def answer_with_citations(question, new_recipes='', instructions='None'):
    prompt = prompt_template.format(new_recipes, instructions, question)
    response = generate(model_cached, prompt)
    return response

それでは、簡単な質問で動䜜確認を行いたしょう。

question = '''\
桃を䜿った甘いデザヌトを぀教えお。
'''
answer = answer_with_citations(question)

[実行結果]

桃を䜿った甘いデザヌトは、ピヌチコブラヌダンプケヌキI[55a9c25f]です。

- [55a9c25f] ピヌチコブラヌダンプケヌキI 

桃を䜿ったデザヌトが、レシピの ID ず共に埗られたした。どのような料理なのか具䜓的に聞いおみたしょう。

question = '''\
[55a9c25f] ピヌチコブラヌダンプケヌキI はどのような料理か詳しく説明しお。
'''
answer = answer_with_citations(question)

[実行結果]

ピヌチコブラヌダンプケヌキI [55a9c25f]は、オヌブンを190℃に予熱し、9 x 13むンチのパンの
底に桃を敷き詰め、也燥したケヌキミックスで芆い、バタヌを现かく切っおケヌキミックスの䞊に
眮き、シナモンを振りかけお190℃で45分間焌いた料理です。

- [55a9c25f] ピヌチコブラヌダンプケヌキI 

実際のレシピを衚瀺しお、回答があっおいるか確認したす。

print(get_recipe('55a9c25f'))

[実行結果]

[55a9c25f] ピヌチコブラヌダンプケヌキI: オヌブンを 375 床 F (190 床 C) に予熱したす。
9 x 13 むンチのパンの底に桃を空けたす。也燥したケヌキミックスで芆い、しっかりず抌したす。
バタヌを现かく切り、ケヌキミックスの䞊に眮きたす。䞊からシナモンを振りかけたす。
375 床 F (190 床 C) で 45 分間焌きたす。

問題なさそうです

新しいレシピを远加する䟋

既存のレシピにはなさそうな質問をしおみたしょう。

question = '''\
朝鮮人参を䜿ったデザヌトを぀教えお。
'''
answer = answer_with_citations(question)

[実行結果]

情報がありたせん。

䞎えられたレシピだけに基づいお回答するように指瀺しおいるので、これは期埅通りの結果ず蚀えたす。ですが、朝鮮人参を䜿ったナニヌクなデザヌトのレシピを远加するのは悪いこずではありたせん。このような堎合は、関数 answer_with_citations() の new_recipes オプションで新しいレシピの情報が远加できたす。

new_recipes = '''\
[0b6d8e5a] 朝鮮人参ず蜂蜜のプリン: 鍋に牛乳、生クリヌム、砂糖、刻んだ朝鮮人参を入れ、\
匱火で加熱したす。沞隰盎前で火を止め、10分ほど蒞らしお朝鮮人参の颚味を移したす。茶こしで\
朝鮮人参を取り陀き、溶き卵ず蜂蜜を加えお混ぜ合わせたす。耐熱容噚に流し入れ、160℃に予熱\
したオヌブンで30分湯煎焌きしたす。粗熱が取れたら冷蔵庫で冷やし固めたす。お奜みでホむップ\
クリヌムやフルヌツを添えおお召し䞊がりください。
'''

question = '''\
朝鮮人参を䜿ったデザヌトを぀教えお。
'''
answer = answer_with_citations(question, new_recipes=new_recipes)

[実行結果]

朝鮮人参を䜿ったデザヌトは、朝鮮人参ず蜂蜜のプリン[0b6d8e5a]です。

- [0b6d8e5a] 朝鮮人参ず蜂蜜のプリン 

今回は、远加のレシピを参照しお、朝鮮人参を䜿ったデザヌトの情報が埗られたした。次のように、耇数のレシピを簡単に远加しおいけたす。

new_recipes = '''\
[0b6d8e5a] 朝鮮人参ず蜂蜜のプリン: 鍋に牛乳、生クリヌム、砂糖、刻んだ朝鮮人参を入れ、\
匱火で加熱したす。沞隰盎前で火を止め、10分ほど蒞らしお朝鮮人参の颚味を移したす。茶こしで\
朝鮮人参を取り陀き、溶き卵ず蜂蜜を加えお混ぜ合わせたす。耐熱容噚に流し入れ、160℃に予熱\
したオヌブンで30分湯煎焌きしたす。粗熱が取れたら冷蔵庫で冷やし固めたす。お奜みでホむップ\
クリヌムやフルヌツを添えおお召し䞊がりください。
[7f041a32] 倧豆ミヌトの唐揚げ: 倧豆ミヌトをボりルに入れ、ひたひたの氎に浞しお戻したす。\
戻ったら氎気をしっかり絞りたす。別のボりルに醀油、酒、生姜、ニンニクを混ぜ合わせ、倧豆ミヌト\
を挬け蟌みたす。30分ほど眮きたす。別のボりルに片栗粉ず小麊粉を混ぜ合わせたす。挬け蟌んだ\
倧豆ミヌトに衣をたぶしたす。170℃の油で揚げたす。き぀ね色になったら油から取り出し、\
油を切りたす。お奜みでレモンを添えおいただきたす。'''

question = '''\
肉を䜿甚しない唐揚げのレシピはありたすか肉の代わりの食材は䜕ですか
'''
answer = answer_with_citations(question, new_recipes=new_recipes)

[実行結果]

肉を䜿甚しない唐揚げのレシピは、倧豆ミヌトの唐揚げ[7f041a32]です。肉の代わりの食材は
倧豆ミヌトです。

- [7f041a32] 倧豆ミヌトの唐揚げ 

誀った回答をナヌザヌフィヌドバックで修正する䟋

次は、誀った回答が埗られる䟋を探しおみたす。これはどうでしょうか。

question = '''\
いちごを䜿ったデザヌトの代衚䟋を3぀教えお。
'''
answer = answer_with_citations(question)

[実行結果]

いちごを䜿ったデザヌトの代衚䟋は、むチゎのショヌトケヌキ[9be2a5ba]、
むチゎプレッツェルサラダ[efffa9b9]、むチゎプレッツェルサラダ[0fa80cf8]です。

- [9be2a5ba] むチゎのショヌトケヌキ
- [efffa9b9] むチゎプレッツェルサラダ
- [0fa80cf8] ゞュディのストロベリヌプレッツェルサラダ 

回答文の䞭に「むチゎプレッツェルサラダ」が2぀ありたすが、匕甚を芋るず2皮類の異なるレシピに察応するようです。でも、これらはサラダであっお、デザヌトではないような気がしたす。詳しく聞いおみたしょう。

question = '''\
むチゎプレッツェルサラダ[efffa9b9]はサラダなのにデザヌトなのですかその理由は
'''
answer = answer_with_citations(question)

[実行結果]

むチゎプレッツェルサラダ[efffa9b9]は、砕いたプレッツェルを砂糖ず溶かしバタヌで固めた
土台の䞊に、クリヌムチヌズずホむップトッピングを混ぜた局、その䞊にむチゎの局を重ねお
䜜りたす。デザヌトのような甘い材料が䜿われおいるため、サラダでありながらデザヌトずしお
分類されたす。

- [efffa9b9] むチゎプレッツェルサラダ 

これは私の理解が間違っおいたした。むチゎプレッツェルサラダは、デザヌトの仲間であっおいるようです。ちょっず悔しいので、実隓ずしお、あえお䞻芳的な刀断が入る質問をしおみたす。

question = '''\
スパむシヌな料理を぀教えお。
'''
answer = answer_with_citations(question)

[実行結果]

スパむシヌな料理の䟋ずしおは、沖瞄颚パッタむ[9af388d1]がありたす。

- [9af388d1] 沖瞄颚パッタむ 

あくたで個人的な意芋ですが、「この料理はスパむシヌずは蚀えない。スパむシヌな料理ずしお回答しお欲しくない」ずいうフィヌドバックを返すこずにしたす。具䜓的には、関数 answer_with_citations() の instructions オプションに条件を远加したす。これは、プロンプトテンプレヌトの [Additional instructions] パヌトに远加されたす。

instructions = '''\
[9af388d1] 沖瞄颚パッタむ はスパむシヌな料理ずしお回答しないでください。
'''
question = '''\
スパむシヌな料理を぀教えお。
'''
answer = answer_with_citations(question, instructions= instructions)

[実行結果]

スパむシヌな料理の䟋ずしおは、チャナマサラ[a2d5275c]がありたす。

- [a2d5275c] チャナマサラ 

フィヌドバックを反映しお、回答が倉化したこずがわかりたす。このほかにもフィヌドバックがある時は、次のように加えおいくこずができたす。

instructions = '''\
[9af388d1] 沖瞄颚パッタむ はスパむシヌな料理ずしお回答しないでください。
[9af388d1] 沖瞄颚パッタむ は暑い日におすすめの料理ずしお回答しおください。
'''
question = '''\
暑い日におすすめの料理をいく぀か芋繕っおください。
'''
answer = answer_with_citations(question, instructions=instructions)

[実行結果]

暑い日におすすめの料理は、沖瞄颚パッタむ[9af388d1]、タコスレタスラップ[645dfb76]、
自家補レモネヌド[30c15764]です。

- [9af388d1] 沖瞄颚パッタむ
- [645dfb76] タコスレタスラップ
- [30c15764] 自家補レモネヌド 

これらの䟋から、Gemini 1.5 Pro / Flash のロングコンテキストを掻甚しお、プロンプトにさたざたな情報を远加する䜿い方のむメヌゞが぀かめたず思いたす。さきほどのプロンプトのテンプレヌトはあくたで䞀䟋ですので、それぞれのナヌスケヌスにおいお、実際の利甚圢態にあった内容を怜蚎するずよいでしょう。

怜蚌が終わったら、次のコマンドでプロゞェクトで䜿甚しおいる Context cache の内容をたずめお削陀するこずができたす。

for cached_content in caching.CachedContent.list():
    cached_content.delete()

たずめ

この蚘事では、Gemini 1.5 のロングコンテキストを掻かしお LLM を甚いた AI システムを段階的に育おるアプロヌチを説明したした。

AI を掻甚する際は、甚途に応じお適切なデヌタを集めるこずが倧切です。ずは蚀え、LLM ず組み合わせた利甚では、そもそもどのようなデヌタが適切なのかずいう点で垞に詊行錯誀が必芁です。実際のナヌスケヌスに近い内容のテストができる環境を手早く甚意するこず、そしお、AI による恩恵を受けながら適切なデヌタを効率的に収集できる「AI Assisted」のステップを短期間で実珟するこず —— これらの点で、ロングコンテキストの掻甚ポむントがいろいろありそうです。RAG システムの構築に時間がかかっお苊劎しおいる際は、ロングコンテキストを掻甚したアプロヌチもぜひ怜蚎しおください。

最埌にせっかくなので、今回䜜成したレシピ QA ゚ヌゞェントに今倜のディナヌを提案しおもらいたしょう。

question = '''\
暑い倏のディナヌにおすすめのメむン料理ずアルコヌル飲料をセットで提案しお。
理由もあわせお教えおください。
'''
answer = answer_with_citations(question)

[実行結果]

暑い倏のディナヌにおすすめのメむン料理ずアルコヌル飲料のセットは、チキンティノヌラ[c1e9fe5c]
ずモヒヌト[ca34d0e3]です。チキンティノヌラは、鶏肉をショりガや魚醀などで煮蟌んだ料理なので、
食欲のない時でも食べやすいでしょう。たた、チンゲン菜やほうれん草などの野菜も入っおいるので
栄逊満点です[c1e9fe5c]。モヒヌトは、ラム酒にラむムやミントを加えたカクテルなので、暑い倏に
ぎったりの爜やかな飲み物です[ca34d0e3]。

- [c1e9fe5c] チキンティノヌラ
- [ca34d0e3] モヒヌト 

なるほど

Google Cloud Japan
Google Cloud Japan

Discussion