Node.jsでGemini 1.5 FlashをAPI経由で使う

鼻血が出るくらい簡単です

先日のエントリ、

Node.jsでGPT-4oをAPI経由で使う

と同じことを、Gemini 1.5 Flashでもやってみました。

こっちはさらに簡単でした。

背景

要するにChatGPT APIでしていたことと同じことをさせてみたかっただけです。

あと、Geminiの方が無料でできることが多いので、比較的気楽にできるということがあります。

Gemini 1.5 Flashだと、

こんな料金設定です。バッチ処理でがーっとやるのでなければ、今回の処理なら無料で結構なことが出来そうです。お金に余裕ができたらバッチでやるようにしても良いなと思うのですが、それ以前に「嘘ついてないか?」というあたりを確認しているとバッチでやるのはなかなか難しいです。実際処理していて気がついたのは、何らかの転みでウェブサーバの初期画面が出て来るようなURLを指定してしまうと、ソフトウェアの説明として「そのウェブサーバ」について説明するという、わけのわからないことが起きたりします。当分バッチでやるのはやめた方がいいなと思いました。

同じようなことが同じような能力で出来るのであれば、両方使えるようにしておくのがリスクマネージメント的に良いですよね。

やり方

私はGeminiを「Google AI Studio」で使っています。

ここで適当に会話をしたら、右上の方にある「< > Get code」というボタンをクリックします。

そうすると、

こんなダイアログが出て来るので、自分の使いたい言語のタブを開けば、そこに「そのセションを再現するのに必要なコード」が出て来ます。これを元に適当に修正してやれば希望するコードが手に入ります。

ね、簡単でしょう?

実はこのことを知らなくて、ChatGPTでやるように「これをコードにして」みたいなことを言ってたんです。ところが、それだと何だか訳のわからないクロールの一般論みたいな話をされて「Gemini役に立たないな」って思ってたんですが、ボタン一発でコードがゲットできるのでChatGPTよりもさらに簡単ですね。

コード例

公開する程度のコード片が作れそうなので、公開してみます。

import {GoogleGenerativeAI, HarmCategory, HarmBlockThreshold, } from  "@google/generative-ai";

const apiKey = process.env.GEMINI_API_KEY;
const genAI = new GoogleGenerativeAI(apiKey);
  
const model = genAI.getGenerativeModel({
    model: "gemini-1.5-flash",
});
  
const generationConfig = {
    temperature: 1,
    topP: 0.95,
    topK: 64,
    maxOutputTokens: 8192,
    responseMimeType: "application/json",
};
  
export const getSoftwareDescription = async (urls, tags,) => {
    const chatSession = model.startChat({
        generationConfig,
        // safetySettings: Adjust safety settings
        // See https://ai.google.dev/gemini-api/docs/safety-settings
        history: [
            {
                role: "user",
                parts: [
                    {
                        text: `
You will receive a URL of an open-source software's description page. Read the description on that page and, if necessary, follow links from that page to 
-- ここは秘伝のタレ --
Your task is to generate a simple summary of the software in JSON format:
{
    "summary": "One-line summary",
    "body": "Detailed description in HTML",
    "tags": ["search tags"...]
}
-- ここは秘伝のタレ --
All descriptions must be in Japanese except for tags.
`}
                ],
            },
        ],
    });
    let query = `URLs: ${urls.join(',')}\n`;
    if  ( tags.length > 0 ) {
        query += `TAGs: ${tags.join(',')}`;
    }
    const result = await chatSession.sendMessage(query);
    
    let json = result.response.text().replaceAll('\\n', '');
   
    return  (JSON.parse(json));
}

 

主にはプロンプトの文字列なわけで。

説明がなくても何となくわかりますね。とゆーか、私も説明を見ずに動かしてます。

結果に対して妙なreplaceAllがあるのは、なんか余分な\nをつけて来るからです。なんでそんな必要があるんでしょうね。

まとめ

どうってことないです。これだけのコードです。

でもこれは相当に強力で、指定したURLの情報を元に、「概要」「機能」「特徴」「稼動プラットフォーム」をまとめてくれた上に、検索用に適当なタグをつけてくれます。まぁそーゆープロンプトにしてるだけなんですが。

LLMと言うと、派手な応用ばかりが話題になりますが、こういった用途もなかなか便利ですね。

最近のエントリー

404 WASP not found

第12回 「パーソナルサーバ」について考える

Jar Gardenに植物を植える

新しいお友達

Google翻訳、ChatGPT、Gemini...

Node.jsでGemini 1.5 FlashをAPI経由で使う

今日は「ぴろろんの日」

Node.jsでGPT-4oをAPI経由で使う

遠隔手話通訳実験

LLMと戯れてみる

新刊情報の収集

最近のできごと

Hieronymusのインボイス番号対応について

会計システム「Hieronymus」の現状

OrangePi5にZabbixをインストールする

オープンソースのノートアプリ「SiYuan」 - CasaOS AppStoreレビュー

お気に入りの色さがし1

創立記念日

SPDX License Listをデータ化した

Orange Pi5でC3TR-Adapterを試す