Noz

オペレーションズリサーチ出身・田舎在住, データ分析・ツール作成

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
   )
)

お勉強した順

  1. Gemini API を使用して構造化された出力を生成する  |  Google AI for Developers
  2. GenerationConfig | Google AI for Developers
  3. スキーマ | 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どこや

2024・干し椎茸

ChatGPTに聞いても古いコード出してくる

画像化したエクセルファイルとファイル内の文字列を合わせて、構造型文章に直そうとしたらChatGPTがまともなコードを吐かない パッケージのGitHub見に行ったけど前処理含めた例が見当たらない、、 公式ドキュメントを探しても出てこない、、

たまたま見たブログ記事で公式URLを紹介してくれていた

本当にありがとう。

公式URL

platform.openai.com

紹介記事

OpenAIのAPI使って簡単な画像認識を実装してみた【Python】|yuki@AIキャラ開発P

新しいアプリを立ち上げるときの手順を考える:コミュニケーション環境編

長洲・長洲漁港

アプリ作成プロジェクト立ち上げ時のコミュケーション環境

プロジェクト立ち上げ時は割と定型作業なのに、「最初だけだから、、」とマニュアル化せず車輪の再開発しがち、、

実際は立ち上げ時は開発環境くらいやること多い。

各作業は簡単だけどおろそかにすると関係者で勘違いが多発して大損害なったりする。

特にスピードで価値が出るタイプのプロジェクトだと悲しい。

  • 資料のバージョン間違えて会話
  • 作業進捗の確認の遅れ
  • 全体進行の遅れ

コミュニケーション環境の要素って?

コミュニケーションに必要なツールは現状下記。

  • チャットツール
  • 共有フォルダ
  • 進捗確認ツール

チャットツール

大体の場合、社内とクライアントで計2チャンネル作成する

必要な作業

  • 社内
    • チャンネルを作る
    • 参画者を登録する
    • githubの更新通知を設定する
    • クラウドインフラの通知を設定する
  • クライアント
    • クライアントを含むチャンネルを作る

共有フォルダ

プロジェクトフォルダ
┗ 📂 内部
 ┗ 📂 契約関連
 ┗ 📄 そのほかファイル
┗ 📂 外部
 ┗ 📂 共有フォルダ1:共有者名
  ┗ 📂 00_資料
  ┗ 📂 01_契約関連
  ┗ 📂 02_試作1

進捗確認ツール

Githubで立ち上げ用のIssue・Wikiを作成する

  • Isssue

    • タイトル:立ち上げ
    • アサイン:参画者全員
    • *ここでgithub→チャットツールへの通知の動作確認をする
  • Wiki

    • 同上

週1程度の報告するタスクIssueとして作る

  • Issue
    • タイトル:定期報告
    • アサイン:窓口担当
    • *完了したら次週分作成。質問など別途連絡した週は飛ばす。

参考

qiita.com

新しいアプリを立ち上げるときの手順を考える・バックエンド編

尾瀬・山の鼻 ー 牛首

今作ってるアプリテンプレのバックエンドについてメモ

業務改善webアプリの最低限の構成とは

  • ログイン画面
  • ホーム画面
  • データ可視化画面
  • 実行の画面

バックエンド側で対応させるインフラ

  • 全体:Cloud Run
  • ログイン画面:firestore
  • データ可視化、実行の画面:google cloud storage

新規アプリ作成時に必要な作業

前提:cloud runのデプロイはGitHub Actionsを使う。ここはWorkload Identity使う

  • GitHub Actionsのworkflowでアプリ名を入力する
  • google cloud storageで新しいバケットを作って、Github Actionsのバケット名のフラグを変更する
  • firestoreで新しいデータベース作って、コレクションにsessionsusersを追加する
  • サービスアカウントで鍵を作って、リポジトリの鍵記載のjsonファイルを更新する

複数巡回セールスマンの研究事例を検索してみた

江須賀・駅館川

研究事例を検索、中身はまだみてない

必要があって、複数巡回セールスマンをざっと理解したくて検索したのでメモメモ。

次は強化学習系もさらっておこうと思う。関数でかける(厳密解がでそう)なら強化学習は遠回りみたいなポストを見たけど、今ところしっくりきてない。現実にある組合せ最適化問題で厳密解に遠い近似解になっちゃうのが出発点ではという気持ち。

原, 沼田, 松浦 (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を利用している前提。

  • GCP
    • Workload identifyのサービスアカウントに対して、新しい許可を与える
    • Google cloud storageで新バケットを作成する
  • GitHub リポジトリ
    • yamlファイルで、cloud runでデプロイするサービス名を変更する
    • yamlファイルで、バケット名を変更する

これみて作りました

無しだとできなかったリンク集です。

大感謝

あとはchatgpt 先生。

blog.g-gen.co.jp

blog.g-gen.co.jp

zenn.dev

cloud.google.com

svelte+Cloud Run、わかったこと

院内・寒水川

フロントエンドをsvelte、デプロイをCloud Runにしたい

小・中規模開発に向いてるというsvelteを、Cloud Runでデプロイしようとしたら四苦八苦したのでメモ

困ったこと

だいたいこのあたり

  • npm run devが実行できない
  • 環境変数が読み込まれない
  • cloud run deployでデプロイできない

ベストプラクティスはこれ(?)

1. svletekitでプロジェクトを作成する

プロジェクトのルートフォルダで下記を実行する。svelteをそのまま(chatgptとかで)野良実装するとnpm run devgcloud run deployが通らなかった。savetltekitにキャリーしてもらう。

Terminal

npx sv create {プロジェクト名}

create-svelteが使えなくなりました

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

クイックスタート: Cloud Run に SvelteKit サービスをデプロイする