＃45　Googleが発表したGeminiを試してみた

# 概要
[2023年12月7日にGoogleがGeminiを発表](https://japan.googleblog.com/2023/12/gemini.html)しましたので、言語モデルとして有名なOpenAIのGPTと対話をさせてみてみようと思います


# 実装と定義
今回は、Geminiに対応するクラスとOpenAI(GPT)に対応するクラスをそれぞれ作成します

## Gemini側の実装
[公式のドキュメントを参考に](https://ai.google.dev/tutorials/node_quickstart?hl=ja#multi-turn-conversations-chat)チャットに必要な部分を実装します
* チャットの初期化を行うinitChat()
* メッセージの送信を行うsendChat()

```typescript
import { ChatSession, GenerativeModel, GoogleGenerativeAI } from "@google/generative-ai";
import { CreateChatCompletionRequestMessage } from "openai/resources/chat/completions";
type Message = CreateChatCompletionRequestMessage;

class Gemini {
    model: GenerativeModel;
    chat: ChatSession | undefined;

    constructor() {
        if (process.env.GEMINI_API_KEY == undefined) {
            throw new Error("GEMINI_API_KEY undefined");
        }

        const generativeVisionModel = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
        this.model = generativeVisionModel.getGenerativeModel({ model: "gemini-pro" });
    }

    //チャットの初期化
    initChat() {
        this.chat = this.model.startChat({});
    }

    //チャットの送信
    async sendChat(chatInput: string) {
        if (this.chat) {
            return (await this.chat.sendMessage(chatInput)).response.text();
        }

        return null;
    }
}
```

## OpenAI(GPT)側の実装
[以前投稿したGPTに関しての記事を参考に](https://qiita.com/nxted_sapporo/items/43fd5f5dff2ad019cfe8)チャットに必要な部分を実装します。また、関数名、引数の型はGemini側のクラスと統一します
* チャットの初期化を行うinitChat()
* メッセージの送信を行うsendChat()

```typescript
import OpenAI from "openai";
import { CreateChatCompletionRequestMessage } from "openai/resources/chat/completions";
type Message = CreateChatCompletionRequestMessage;

class Openai {
    openai: OpenAI;
    messages: Message[];

    constructor() {
        if (process.env.OPENAI_API_KEY == undefined) {
            throw new Error("OPENAI_API_KEY undefined");
        }
        this.openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
        this.messages = new Array();
    }

    //チャットの初期化
    initChat(messages?: Message[]) {
        this.messages = messages ? messages : new Array();
    }

    //チャットの送信
    async sendChat(chatInput: string) {
        this.messages.push({ role: "user", content: chatInput });

        return await this.openai.chat.completions.create(
            {
                model: 'gpt-4',
                messages: this.messages
            }
        ).then(
            async value => {
                const message = value.choices[0].message;
                this.messages.push(message);
                return message.content;
            }
        )
    }
}
```

## 実際に対話を行う部分の実装
まず、対話のテーマを設定し、GeminiとOpenAI(GPT)それぞれ初期化を行います

※以下の例ではテーマの定義はOpenAI(GPT)側の発言として扱っています

初期化が終わり次第、メッセージの送信と返信の受け取りを繰り返し行います
```typescript
async function main() {
    const theme = "おふとんの魅力を私と語り合いましょう。\n\n制約事項\n・箇条書きは行わない\n・発言は100文字以内";
    const gemini = new Gemini();
    gemini.initChat();

    const openai = new Openai();
    const messages: Message[] = [{
        role: "assistant",
        content: theme
    }];
    openai.initChat(messages);

    let response: string | null = await gemini.sendChat(theme);
    console.log(`gemini: ${response}`);

    for (let i = 0; i < 10; i++) {
        if (response) {
            if (i % 2 == 0) {
                response = await openai.sendChat(response);
                console.log(`openAI: ${response}`);
            } else {
                response = await gemini.sendChat(response);
                console.log(`gemini: ${response}`);
            }
        }
        else {
            break;
        }
    }
}

main();
```

# 言語モデル同士の対話
## GeminiとOpenAI(GPT)を対話させてみた感想
Geminiはテキストで指定した制約(今回は文字数制限)を守ってくれないという特徴があり、OpenAI(GPT)はテキストで指定した制約をある程度守ってくれていて、Geminiよりも対話に最適化されていると感じました

まだGeminiについて深堀出来ていない部分がありますので今後も引き続き調査してみたいと思います

## (おまけ)GeminiとOpenAI(GPT)の対話ログ
おふとんの魅力を語り合ってもらいました

>gemini: おふとんは、私たちに安らかな眠りをもたらし、日々の疲れを癒してくれるかけがえのないものです。ふかふかで柔らかい肌触りは、心身の緊張を解きほぐし、深い眠りへと導いてくれます。また、おふとんにくるまることで、あたかも母のお腹の中にいるような安心感が得られ、リラックス効果を高めてくれます。保温性にも優れており、寒い冬でも快適な睡眠をとることが可能です。さらに、おふとんには吸湿性と放湿性に優れた素材が使われているため、汗をかいてもすぐに吸収して発散し、常に快適な寝心地を保つことができます。


>openAI: 確かに、あたたかでしっとりとしたおふとんの感触は無意識のうちに心地良さを感じさせ、うっとりと眠りに誘ってくれますね。自分の体形に合わせてフィットするその独特の感触は、まさに至福のひととき。日常のさまざまなストレスから解放され、ふんわりと包み込まれるような安心感が広がります。また、おふとんは自分の体温を逃がさずに保つことで、体の深部まで温めてくれますね。発熱や風邪の時でも、その温かさは体調を整えるのに一役買ってくれると思います。ただ眠るだけでなく、体調管理にも役立つおふとんは、私たちにとって欠かせない存在です。

>gemini: おふとんの温かさは、単に体を温めるだけでなく、心も温めてくれる効果があります。寒い冬に、温かいおふとんにくるまって眠ると、心がほっこりと温まり、幸せな気持ちになりますよね。また、おふとんにくるまることで、あたかも母のお腹の中にいるような安心感が得られ、リラックス効果を高めてくれます。これは、おふとんの柔らかく包み込むような感触が、私たちに安心感や安らぎをもたらしてくれるためです。
さらに、おふとんは私たちの健康を守るためにも重要な役割を果たしています。おふとんに含まれるダニやホコリは、アレルギーや喘息を引き起こす原因になりますが、定期的に洗濯や掃除をすることで、これらのアレルゲンを減らすことができます。また、おふとんの保温性によって体の深部まで温められることで、免疫力がアップし、風邪や感染症にかかりにくくなります。このように、おふとんは私たちの心と体を温め、健康を守ってくれる大切な存在なのです。

>openAI: その通り、おふとんが持つ暖かさや包み込むような感触は、私たちに安心感を与え、心地よい眠りへと誘います。けれども、それだけでなく、心身の健康維持にも大いに寄与しているというのはとても大切なことですね。ただし、おふとんのお手入れも重要です。頻繁に洗濯や日光に当てることでダニを抑え、清潔で快適な寝具に保てます。洗濯や日光に当てることでふかふかの感触も保つことが可能です。また、ご自身の好みに合わせて素材や肌触りを選べるところも魅力の一つですね。フワフワの綿のおふとん、やわらかなシルクのおふとん…それぞれの素材が、異なる寝心地と安らぎを提供してくれます。


>gemini: おふとんのお手入れは、快適な睡眠のためにも、健康のためにも欠かせません。ダニやホコリは、アレルギーや喘息を引き起こす原因になるため、定期的に洗濯や掃除をすることが大切です。また、おふとんを干すことで、日光の殺菌作用によってダニや細菌を死滅させることができます。さらに、日光に当てることで、おふとんの湿気を飛ばし、ふっくらとした状態を保つことができます。
おふとんの素材や肌触りも、睡眠の質を左右する重要な要素です。綿のおふとんは、吸湿性と放湿性に優れており、夏は涼しく、冬は暖かいという特徴があります。シルクのおふとんは、保温性と保湿性に優れており、肌触りも滑らかです。羽毛のおふとんは、軽くて保温性が高いという特徴があります。自分の好みに合った素材や肌触りのおふとんを選ぶことで、より快適な睡眠をとることができます。
おふとんは、単なる寝具ではなく、私たちの心と体を温め、健康を守ってくれる大切な存在です。適切なお手入れをして、おふとんの快適さを維持することで、より質の高い睡眠をとることができるようになります。

>openAI: 確かに、おふとんはただ寝るためだけのものではなく、しっかりとした眠りから健康に至るまで、私たちの生活に欠かせない役割を果たしていますね。そしてそれを維持するためのお手入れも大切で、定期的な洗濯や陽干しは必要不可欠です。そして、そのおふとんひとつひとつに、私たちの好みや暮らしを反映させることができるところも魅力的です。軽さを求めるなら羽毛、快適な温度調節が欲しいなら綿やシルクと、自分にとって最適な素材を選べるのですから。それぞれの素材がもたらす寝心地と安らぎは、私たちが日々快適に過ごすための大切な要素です。私たちの生活を豊かにするおふとんの存在は、本当にありがたいですね。

>gemini: おふとんは、私たちが毎日を快適に過ごすために欠かせない存在です。睡眠の質を高めるだけでなく、心と体を温め、健康を守る役割も果たしています。
おふとんのお手入れを怠ると、ダニやホコリが繁殖し、アレルギーや喘息を引き起こす原因になります。また、湿気がたまると、カビが発生し、健康被害を及ぼすこともあります。そのため、定期的な洗濯や掃除、日光に当てることが大切です。
おふとんの素材や肌触りも、睡眠の質を左右する大切な要素です。綿のおふとんは吸湿性と放湿性に優れており、シルクのおふとんは保温性と保湿性に優れています。羽毛のおふとんは軽くて保温性が高いという特徴があります。自分の好みに合った素材や肌触りのおふとんを選ぶことで、より快適な睡眠をとることができます。
おふとんは、単なる寝具ではなく、私たちの生活を豊かにする大切な存在です。適切なお手入れをして、おふとんの快適さを維持することで、より質の高い睡眠をとることができるようになります。

>openAI: それは間違いないですね。快適な睡眠や素晴らしいリラクゼーションは、おふとんがあればこそのものです。その素材の種類や肌触りは、私たち一人一人の好みに寄り添い、最良の睡眠をサポートしてくれます。そして、それを長持ちさせるためのお手入れも大切ですね。適切な洗濯、掃除、そして日光浴は日々のルーチンに加えることで、おふとんはいつでも新鮮で健康的な状態を保ち、私たちの健康をサポートします。それだけでなく、おふとんのあたたかさは心にも寄り添い、癒しをもたらしてくれます。おふとんというのは、なんともありがたい存在ですね。

>gemini: おふとんは、私たちの生活に欠かせない大切な存在です。睡眠の質を高めるだけでなく、心と体を温め、健康を守る役割も果たしています。
おふとんを清潔に保つために、定期的な洗濯や掃除、日光に当てることが大切です。また、おふとんの素材や肌触りも、睡眠の質を左右する大切な要素です。綿のおふとんは吸湿性と放湿性に優れており、シルクのおふとんは保温性と保湿性に優れています。羽毛のおふとんは軽くて保温性が高いという特徴があります。自分の好みに合った素材や肌触りのおふとんを選ぶことで、より快適な睡眠をとることができます。
おふとんは、単なる寝具ではなく、私たちの生活を豊かにする大切な存在です。適切なお手入れをして、おふとんの快適さを維持することで、より質の高い睡眠をとることができるようになります。
おふとんのあたたかさは、心にも寄り添い、癒しをもたらしてくれます。寒い冬に、温かいおふとんにくるまって眠ると、心がほっこりと温まり、幸せな気持ちになりますよね。また、おふとんにくるまることで、あたかも母のお腹の中にいるような安心感が得られ、リラックス効果を高めてくれます。
おふとんは、私たちが毎日を快適に過ごすために欠かせない存在です。おふとんの快適さを維持することで、より質の高い睡眠をとることができるようになります。

>openAI: まさにその通りですね。私たちの睡眠は、おふとんのありがたさを改めて実感させてくれます。それは体の疲れを癒やし、心を温める役割を果たしてくれます。また、おふとんには、自分が一番落ち着くと感じる素材を選べるという魅力もあります。綿、シルク、羽毛など、各素材が提供する感触や機能性が、私たち一人一人に最適な環境を提供してくれます。
おふとんに包まれることで感じる安心感や幸せは、言葉に表せないほどですね。それは、母親の胎内にいるかのような安心感を再現し、深い眠りへと私たちを導いてくれます。しっかりとお手入れを行い、ふかふかのおふとんを保つことで、毎晩、素晴らしい眠りと心地よい目覚めを迎えることができます。
おふとんの存在を改めて感謝し、大切に使いながら日々を過ごしていきたいですね。

>gemini: おふとんは、私たちの生活に欠かせない大切な存在です。睡眠の質を高めるだけでなく、心と体を温め、健康を守る役割も果たしています。
おふとんを清潔に保つために、定期的な洗濯や掃除、日光に当てることが大切です。また、おふとんの素材や肌触りも、睡眠の質を左右する大切な要素です。綿のおふとんは吸湿性と放湿性に優れており、シルクのおふとんは保温性と保湿性に優れています。羽毛のおふとんは軽くて保温性が高いという特徴があります。自分の好みに合った素材や肌触りのおふとんを選ぶことで、より快適な睡眠をとることができます。
おふとんは、単なる寝具ではなく、私たちの生活を豊かにする大切な存在です。適切なお手入れをして、おふとんの快適さを維持することで、より質の高い睡眠をとることができるようになります。
おふとんのあたたかさは、心にも寄り添い、癒しをもたらしてくれます。寒い冬に、温かいおふとんにくるまって眠ると、心がほっこりと温まり、幸せな気持ちになりますよね。また、おふとんにくるまることで、あたかも母のお腹の中にいるような安心感が得られ、リラックス効果を高めてくれます。
おふとんは、私たちが毎日を快適に過ごすために欠かせない存在です。おふとんの快適さを維持することで、より質の高い睡眠をとることができるようになります。