ogochan
先日のエントリ、
と同じことを、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と言うと、派手な応用ばかりが話題になりますが、こういった用途もなかなか便利ですね。