😍

PaLMAPI本のコードをGeminiで動かす(1)

2024/07/13に公開

「Google Cloudで学ぶ生成AIアプリケーション開発入門」という本を購入して、いろいろと触っています。超面白い。本ではPaLM APIが使われていますが、もちろん新しい言語モデルのGeminiでも試してみたくなる~。

ということで、自分用メモとして、PaLM API => Geminiのコード、およびプロンプトの作成過程を残しておきます。この記事では3章のGrammarCorrectionアプリのバックエンドの部分のみをとりあげます。

元のコードはGithubのmain.pyからチェックできます。
https://github.com/google-cloud-japan/sa-ml-workshop/tree/main/genAI_book/GrammarCorrection/backend

今回試したコード、プロンプトは次の私の自作Colabから確認いただけます。

https://colab.research.google.com/drive/1SevCu3pormLqKCjlR66OCDMK9NhZWz71?usp=sharing

PaLM API => Gemini

PaLM APIからGeminiにコードを変更する際の方法は、こちらのドキュメントに載っています。

https://cloud.google.com/vertex-ai/generative-ai/docs/migrate/migrate-palm-to-gemini?hl=ja

今回はまずは、Colabでテストするため、vertexaiのAPIではなく、google.generativeaiのAPIを使ってコード作成、プロンプトテストを行います。そちらのAPIの使い方は次のドキュメントを参照しています。

https://ai.google.dev/gemini-api/docs/api-key?hl=ja

では、コードを解説していきます。

コード

import google.generativeai as genai
from google.colab import userdata
genai.configure(api_key=userdata.get('gemini-api-key')) #①

まずここでは必要なライブラリを読み込みました。
①では、Colabのシークレットに渡したgeminiのapi_keyを読み込んでいます。

model_name='gemini-1.5-flash'
model = genai.GenerativeModel(
    model_name=model_name,
    generation_config={
        'max_output_tokens': 1024,
        'temperature': 0.2
    }
)

モデルの作成。今回はgemini-1.5-flashを使います。generation_configに、temperatureなどの設定を渡します。

def get_response(prompt):
    res = model.generate_content(prompt) #②
    return res.text #③

geminiではgenerate_contentにプロンプトを渡すと、LLMからの値が得られます(②)。textで返された値のみが確認できます(③)。

プロンプトを渡す

次に、gemini-1.5-flashで本と同じことを試して、どのような返り値が得れるかを試します。まずは英文を修正してくれるかを試してみます。

text = 'I go to school yesterday. I eat apple lunch. I like apple eat.'

prompt = f"""
「text:」以下の英文を正しい英文法の文章に書き直してください。
書き直した文章のみを出力すること。

text: {text}

"""

get_response(prompt)

このコードを実行すると私の環境では次のようになりました。

I went to school yesterday. I ate an apple for lunch. I like to eat apples. 

いい感じですね。
次に、few-shotを試してみましょう。

prompt = """
「text:」以下の英文をより自然で洗練された英文に書き直した例を3つ示してください。
text: I go to school yesterday. I eat apple lunch. I like eat apples.

answer:
- I went to school yesterday. I ate an apple for lunch. I like eating apples.
- I went to school yesterday. I had an apple for lunch. I like to eat apples.
- I attended school yesterday. I enjoyed an apple for lunch. I love eating apples. 

次の質問に答えてください。
text: How are you? I send picture yesterday. It's funny and you like it.
answer:
"""
print(get_response(prompt))

返り値は次のようになります。

##  Answer:

Here are three ways to rewrite the text "How are you? I send picture yesterday. It's funny and you like it." in a more natural and refined way:

**1.  Direct and Friendly:**

> How are you doing? I sent you a picture yesterday. It's pretty funny, I hope you liked it!

**2.  More Formal:**

> I hope you are well. I sent you a picture yesterday. It's humorous, and I thought you might enjoy it.

**3.  Adding Context:**

> How are you? I sent you a picture of [describe the picture] yesterday. It's pretty funny, I hope you liked it!

**Explanation of Changes:**

* **"How are you?"** is a more common greeting than "How are you?".
* **"I sent you a picture"** is more natural than "I send picture".
* **"Yesterday"** is placed at the end of the sentence for better flow.
* **"It's funny"** is more concise than "It's funny and you like it".
* **"I hope you liked it"** is a polite way to end the sentence.
* **Adding context** (like describing the picture) makes the message more engaging.

大変丁寧に回答してくれていてよいのですが、ここは返り値を上手く扱うために、英文のみを返してほしい文脈です。ということで、ちょっとプロンプトに変更を加えます。

最後の質問文プロンプトの変更
次の質問に答えてください。 => 次が本当の質問です。例を参考に、次の英文を洗練された英文に書き直した例を3つ作り、英文のみ返してください。

prompt = '''\
「text:」以下の英文をより自然で洗練された英文に書き直した例を3つ示してください。

例:
text: I went to school yesterday. I ate an apple for lunch. I like eat apple.
answer:
- I went to school yesterday. I had an apple for lunch. I love apples.
- Yesterday, I went to school. I had an apple for lunch. I really enjoy eating apples.
- Yesterday, I went to school. I had an apple for lunch. Apples are my favorite fruit.

次が本当の質問です。例を参考に、次の英文を洗練された英文に書き直した例を3つ作り、英文のみ返してください。

text: How are you? I send picture yesterday. It's funny and you like it.
answer:
'''

print(get_response(prompt))

すると次のように英文だけを返してくれました。

- How are you doing? I sent you a picture yesterday. It's funny, I think you'll like it.
- How are you? I sent you a funny picture yesterday. I hope you enjoy it!
- How are you? I sent you a picture yesterday. It's pretty funny, I thought you might get a kick out of it.

アプリに反映

本ではこれをflaskのアプリにして、Cloud RUNで動かします。そのための作業もメモしておきます。まずは、requirements.txtのgoogle-cloud-aiplatformのバージョンを変更します。本では1.36.1なのですが、現在の最新1.58.0に変更します(④)。

Flask==2.3.2
gunicorn==21.2.0
google-cloud-aiplatform==1.58.0 #④

そして、モデルを作る部分を次のように置き換えます。

import vertexai 
vertexai.init(location='us-central1')
from vertexai.generative_models import GenerativeModel

model_name='gemini-1.5-flash'
model = GenerativeModel(model_name=model_name,
                       generation_config={
                           'temperature': 0.2,
                           'max_output_tokens': 1000,
                       }
                    )
                    
def get_response(prompt):
    res = model.generate_content(prompt)
    return res.text

(以下省略)

はい。そしてCloud RUNに載せたものを動かしたものが次です。

望み通りの反応がgemini-1.5-flashから得られました。

まとめ

という感じで「Google Cloudで学ぶ生成AIアプリケーション開発入門」のサンプルをPaLM API => Geminiに置き換え作業してみました。

モデルを変える際にプロンプトもちょっと変えたりして楽しめるのは面白いですね~。こちらの本は生成AIアプリの作り方はもちろん、クラウドの使い方も学べて非常に勉強になってます~。Google Cloudの中井さんが書かれているの超おすすめっす。

https://amzn.to/3Lpknnv

今回初めてzennに記事を書いたのですが、書き心地が非常に良く、また書きたいと思いました。

Discussion