Geminiの出力形式をJSONに強制
背景
OCRの実装で列形式の出力に揃えたかったときに活用した。 OpenAIでいうJsonモードにあたるはず。 ChatGPTは激古、Gemini先生はやや古いバージョンを出力、解説記事も大体ちょい古いのでメモ。
実装のメイン
出力のスキーマはあらかじめ定義しておく。
response_schema = { "type": "object", "properties": { "items": { "type": "array", "items": { "type": "object", "properties": { "date": {"type": "string"}, "debit": {"type": "string"}, "debit_amount": {"type": "integer"}, }, "required": ["date", "debit", "debit_amount"] } } }, "required": ["items"] }
例えば以下のようにproperties
で"列名 : {"type" : "型名"}
と設定する。
型名は以下で確認できる。
GenerativeModelでgenerate_contentを使うときに引数generation_config
内で指定する
from vertexai.generative_models import GenerationConfig, GenerativeModel model = GenerativeModel("gemini-1.5-flash") response = model.generate_content( [prompt], generation_config=GenerationConfig( response_mime_type="application/json", response_schema=response_schema ) )
お勉強した順
- Gemini API を使用して構造化された出力を生成する | Google AI for Developers
- GenerationConfig | Google AI for Developers
- スキーマ | Google AI for Developers
補足
画像入れるならImageを定義しておいて、promptの隣に含める
from vertexai.generative_models import GenerationConfig, GenerativeModel model = GenerativeModel("gemini-1.5-flash") image = Image.load_from_file(image_path) response = model.generate_content( [images, prompt], generation_config=GenerationConfig( response_mime_type="application/json", response_schema=response_schema ) )
OpenAI apiのpythonパッケージで画像を使いたいけど公式docどこや
ChatGPTに聞いても古いコード出してくる
画像化したエクセルファイルとファイル内の文字列を合わせて、構造型文章に直そうとしたらChatGPTがまともなコードを吐かない パッケージのGitHub見に行ったけど前処理含めた例が見当たらない、、 公式ドキュメントを探しても出てこない、、
たまたま見たブログ記事で公式URLを紹介してくれていた
本当にありがとう。
公式URL
紹介記事
新しいアプリを立ち上げるときの手順を考える:コミュニケーション環境編
アプリ作成プロジェクト立ち上げ時のコミュケーション環境
プロジェクト立ち上げ時は割と定型作業なのに、「最初だけだから、、」とマニュアル化せず車輪の再開発しがち、、
実際は立ち上げ時は開発環境くらいやること多い。
各作業は簡単だけどおろそかにすると関係者で勘違いが多発して大損害なったりする。
特にスピードで価値が出るタイプのプロジェクトだと悲しい。
例
- 資料のバージョン間違えて会話
- 作業進捗の確認の遅れ
- 全体進行の遅れ
コミュニケーション環境の要素って?
コミュニケーションに必要なツールは現状下記。
- チャットツール
- 共有フォルダ
- 進捗確認ツール
チャットツール
大体の場合、社内とクライアントで計2チャンネル作成する
必要な作業
共有フォルダ
プロジェクトフォルダ ┗ 📂 内部 ┗ 📂 契約関連 ┗ 📄 そのほかファイル ┗ 📂 外部 ┗ 📂 共有フォルダ1:共有者名 ┗ 📂 00_資料 ┗ 📂 01_契約関連 ┗ 📂 02_試作1
進捗確認ツール
週1程度の報告するタスクIssueとして作る
- Issue
- タイトル:定期報告
- アサイン:窓口担当
- *完了したら次週分作成。質問など別途連絡した週は飛ばす。
参考
新しいアプリを立ち上げるときの手順を考える・バックエンド編
複数巡回セールスマンの研究事例を検索してみた
研究事例を検索、中身はまだみてない
必要があって、複数巡回セールスマンをざっと理解したくて検索したのでメモメモ。
次は強化学習系もさらっておこうと思う。関数でかける(厳密解がでそう)なら強化学習は遠回りみたいなポストを見たけど、今ところしっくりきてない。現実にある組合せ最適化問題で厳密解に遠い近似解になっちゃうのが出発点ではという気持ち。
原, 沼田, 松浦 (2017) minmax型m人巡回セールスマン問題の解法に関する研究
minmaxは「各セールスマンの合計移動距離が等しくなるように」という意味らしい
小林 合流巡回セールスマン問題に関する研究 (スライド)
「特定の巡回箇所は複数人で巡回しなくていけない」みたいな制約をつける問題設定かな
田川, 浜松, 星野 (平成25年度) 巡回セールスマン問題に対するクラスタリングを用いた近似解法
巡回対象の集合を担当者ごとに、巡回対象間の距離をもとにクラスタリングして割り振る?
土屋, 本間 (2018)** スケジュール決定者の裁量権を維持した複数巡回セールスマン問題の見積もり
費用対効果を見て、リソース配分を意思決定する流れ?課題は多目的最適化とかDEAっぽいかもしれない
Zheng, Hong, Xu, Li, Chen (2022)** An Effective Iterated Two-stage Heuristic Algorithm for the Multiple Traveling Salesmen Problem
means系でクラスタリングして、貪欲法で経路最適化に分ける感じかな
GitHub Actions + cloud run のメモ
GitHub Actions で自動テスト・本番環デプロイ
状況的に特に下記の点が良き
気をつけたいこと
サービスアカウントの権限
GCP側で用意するサービスアカウントの権限はこれで動いた。 紹介資料とかだとアドミンでやってるので、ここまで絞るのに結構苦労した。 まだ絞れるかも?
- Artifact Registry 管理者
- Cloud Build サービス アカウント
- Cloud Run 管理者
- Service Usage ユーザー
- Workload Identity ユーザー
- サービス アカウント トークン作成者
- サービス アカウント ユーザー
- ストレージ管理者
firesotre使う場合は下記が追加で必要だった
- Cloud Datastore ユーザー
- Firestore サービス エージェント
新規リポジトリ作成
一回作っちゃえば、だいたい下記を変えてらいい。
GCPを利用している前提。
これみて作りました
無しだとできなかったリンク集です。
大感謝
あとはchatgpt 先生。
svelte+Cloud Run、わかったこと
フロントエンドをsvelte、デプロイをCloud Runにしたい
小・中規模開発に向いてるというsvelteを、Cloud Runでデプロイしようとしたら四苦八苦したのでメモ
困ったこと
だいたいこのあたり
npm run dev
が実行できない- 環境変数が読み込まれない
cloud run deploy
でデプロイできない
ベストプラクティスはこれ(?)
1. svletekitでプロジェクトを作成する
プロジェクトのルートフォルダで下記を実行する。svelteをそのまま(chatgptとかで)野良実装するとnpm run dev
・gcloud run deploy
が通らなかった。savetltekitにキャリーしてもらう。
Terminal
npx sv create {プロジェクト名}
2. 作成されたフォルダレイアウトに沿って編集する
ちなみに.env
の変数を読み込むには差し当たってこうした。クライアントに読み込ませたくない場合は記述が異なるので注意。とりあえず、デプロイできるか確認したかったので後で考える。
+page.sevelte
import { PUBLIC_変数名 } from '$env/static/public' // 環境変数からAPIのベースURLを取得 const 変数 = PUBLIC_変数名 ;
ー Environment variables / $env/static/private • Svelte Tutorial
3. デプロイする
プロジェクトのルートフォルダ下記でコードからデプロイする。必須のフラグ(CLIで求められる)以外のflagをつけるとポートがずれるとか言われてデプロイされない。Github Actionsでも、未承認許可以外のflagを外すとデプロイできた。
Terminal
gcloud run deploy