地平線まで行ってくる。

記録あるいは忘備録。時には検討事項。

Google Julesに頑張ってゲームを作ってもらう。

Google Julesは、Google が開発した “自律型AIコーディングエージェント” で、GitHub リポジトリを読み取り、計画を立て、コードを書き、テストし、最終的に PRまで自動で作成する次世代の開発支援ツールです。GooleでもAntigravityやGemini CLIと比較して目立たない存在ではないでしょうか。

 

jules.google

 

しかし、jules君は、Googleクラウド VM 上でコードを実行するため、仕事前に走らせておいて昼休みにチェック・・・のような趣味プログラマにとって便利。基本はGithubと連携して動作するのだが、単純に会話をしながら作り上げることができます。

 

以前から気になっていた、pycelを使ってゼビウスシューティングゲームに挑戦することにした。ゼビウスXevious)は、1980年代にナムコが発表した縦スクロールシューティングゲームで、空中と地上を撃ち分ける2ボタン制や隠し要素など、当時として革新的な仕組みを多数導入した名作です。つくたものは「ゼビウス風」と言っても、空中と地上を撃ち分ける2ボタン制だけが一緒なまったくの別物・・・です。悲しいかな。

 

自機が透明だったり、背景がなかったり。色んなトラブルを乗り越え、最終的に完成させました。最後のドキュメントもJules君に作成を依頼。Jules君曰く「私たちの汗と(デジタルの)涙の結晶」と・・・。

 

お手軽にVide Codingを体験してみたい・・・人はいかがでしょう。プログラムだけではなく、レポジトリのドキュメント作成や、ちょっとした思い付きの原理確認には重宝しています。有料でいいので、VMをもう少し強化するとさらに捗る気がします。

 

Githubと連携しなくても、遊べました。

 

github.com

 

ACE FrameworkベースにLTMをじっくり試してみる。

Colabを使ってACE(Agentic Context Engineering)という考え方を試してみました。コンテキストエンジニアリングを考える良い機会になりました。また、そもそも情報をどう蓄積して、検索し引き出して投入するのか、を考える良いきっかけとなりました。

bwgift.hatenadiary.jp

手法の整理と割り切り


 ACE(Agentic Context Engineering)は、大規模言語モデル(LLM)が自らコンテキスト(入力情報や指示)を成長させ、自己改善を続けるためのフレームワークです。従来のLLMの改善手法の多くはモデルの重みを更新する「微調整(ファインチューニング)」に頼ってきましたが、ACEは重みを変えるのではなく、モデルに与える「コンテキスト(文脈)」を最適化・進化させることに焦点を当てています。

ACEの仕組み:3つの役割分担

ACEは、3つの専門的なエージェント的役割を分担させることで、効率的にコンテキストを成長させます。 - Generator(生成器): 現在のプレイブックを使用して、実際にタスクを解くための推論を行います。 - Reflector(反省器): 実行結果(成功や失敗のフィードバック)を分析し、そこから具体的な教訓や新しい戦略を抽出します。 - Curator(整理器): 抽出された知見を既存のプレイブックに統合します。この際、重複を排除し、構造を維持しながらアップデートを行います。

ACEの革新的なポイント

  • 逐次的なncremental Delta Updates(デルタ・アップデート): 全文を書き換えるのではなく、「箇条書き単位」で必要な部分だけを修正・追加します。これにより、過去の知識を失うことなく、効率的に改善を積み重ねられます。
  • 高いコストパフォーマンス: 全文書き換えを行わないため、計算コスト(トークン使用量)を抑えつつ、適応までの待ち時間(レイテンシ)を大幅に短縮(平均86.9%削減)することに成功しています。

 このうち、3つの役割分担を参考にします。試してみるとIncremental Delta Updatesは非常に魅力的なのですが、箇条書き単位=端的な情報をReflectorで抜き出すためには、何が情報として重要なのかを理解する必要があります。例えば事実の更新なのか、解法なのか。それぞれの端的な情報に対して情報を更新・追加したするのも工数かかります。短い文章で表すことができる事柄ばかりではありません。そこで、Incremental Delta Updatesでは、箇条書きの短文ではなく、必要だろうと思われる動的なテキスト量でもよいと割り切りました。  折角なので、Model-Firstを参考にモデル(一般化)をReflectorで入れ込むことにします。

実装

SAKURA AIのAPIでgpt-oss:120Bを利用します。

コンポーネント 役割 使用技術
Curator (キュレーター) ユーザーのクエリに関連するコンテキストを検索します。 ハイブリッド検索 (FAISS + SQL)
Agent (エージェント) コンテキストを使用して即時応答を生成します。 LangChain
Reflector (リフレクター) 対話を分析し、新しい事実やルールを抽出します。 LLM
Storage (ストレージ) 文書、キュー、インデックスを永続化します。 SQLite (WALモード)

といった感じで実装しました。 Vibe CodingにはGoogle Colebでざっくり可能性検討を行って、Gemini CLIで実装を行いました。UIにはGarioを始めて使ってみました。途中経過と最終的な蓄積データ(Long-Term Memory)を表示して処理の状況を見えるようにしました。

LTMに収納するcontentの例。少々長すぎるかも。情報量としてはリッチでいい感じだと思います。

  • Entities: Development team, AI code‑generation assistant, tools (uv, ruff, VS Code, pre‑commit, GitHub Actions, Docker), repository, CI pipeline, configuration files (pyproject.toml, ruff.toml, .pre‑commit-config.yaml, Dockerfile), phases (Phase 0‑5).
  • State Variables:
    • Installed toolset per developer machine,
    • Contents of configuration files,
    • Environment reproducibility flag,
    • Code‑quality metrics (lint errors, formatting violations),
    • CI status (pass/fail, runtime),
    • Deployment parity (local vs production),
    • Team learning load.
  • Actions:
    1. Install a tool (e.g., uv).
    2. Add a tool as a dev dependency (ruff).
    3. Configure IDE integration (VS Code settings.json).
    4. Introduce a pre‑commit hook.
    5. Extend CI workflow with the same commands.
    6. Build a production‑identical Docker image and run it locally.
    7. Commit code, run CI, merge PRs.
  • Constraints: Limited learning capacity, risk of breaking builds, tool‑conflict (e.g., Copilot vs Ruff), CI execution time, maintainability of multiple config files, need for version‑controlled changes.
  • Solution Summary: The AI answer proposes a phased, incremental rollout of the toolchain. Each phase delivers a concrete, measurable benefit (early value, risk mitigation, faster feedback, measurable ROI, cultural adoption). The rollout is isolated per Git branch, measured with concrete metrics, and only expanded after validation, thus keeping risk low while accelerating development speed.

Generalization: - Abstract Pattern: Incremental adoption of a complex development toolchain through small, isolated, measurable steps. - Underlying Problem Class: Change‑management / process‑improvement problem, often modeled as a constraint‑satisfaction or resource‑allocation task where the goal is to maximize productivity while minimizing learning and disruption risk. - General Strategy: 1. Identify the minimal viable tool that yields immediate benefit. 2. Deploy it in isolation, measure impact, and validate. 3. Iteratively add complementary tools/configurations, each guarded by its own validation (branch + CI). 4. Use quantitative metrics (setup time, lint error count, CI failure rate, deployment parity) to assess ROI. 5. Align rollout with team culture by delivering quick wins and keeping learning overhead low. 6. Ensure rollback capability at each step. This pattern can be applied to any scenario where a team needs to introduce new tooling, processes, or infrastructure without disrupting ongoing work."

「Vibe Codingのコツは?」に対する回答例。この問いの前にuvやruffの利用を議論していたので、それを踏まえた回答になっています。

Vibe Coding で快適に開発するための実践的なコツ

ポイントは「AI からの出力をすぐに実行・検証できる環境を作る」ことと、「AI に指示するプロンプトを磨く」ことです。
以下の項目を順に導入すれば、AI 補助開発のスピードと品質が大幅に向上します。


1️⃣ 環境をすぐに立ち上げる「最小構成」

手順 内容 目的
① uv のインストール curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
1 行で Python 仮想環境と依存解決が完結。Docker が使えない Vibe Coding でも必ず動く。
② プロジェクト初期化 uv initpyproject.toml が生成 依存はすべて pyproject.toml に宣言し、ロックは uv.lock に一元化。
③ 開発ツールを dev‑deps に追加 uv add --dev ruff mypy pytest pre‑commit Lint/Format/型チェック/テストをすべて同じ環境で管理。
④ VS Code 設定 .vscode/settings.json
json { "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python", "ruff.enable": true, "ruff.path": "${workspaceFolder}/.venv/bin/ruff", "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll": true, "source.organizeImports": true } }
保存時に自動 Lint+Fix、インポート整理が走り、AI が出したコードがすぐにクリーンになる。
⑤ pre‑commit フック uv run pre-commit install
.pre-commit-config.yaml に ruff の hook を記述
コミット前に必ず Lint/Format が走り、CI 失敗を防止。

結果:Vibe Coding のターミナルだけで uv sync.venv が作られ、VS Code が自動でコードを整形。Docker のインストールは不要です。


2️⃣ AI(Copilot・ChatGPT・Claude・Gemini)とスムーズに連携するコツ

コツ 具体的なやり方
① プロンプトは「入力 → 期待出力」形式で書く """<説明>""" の後に 「以下の関数を実装してください」 と続け、「戻り値は dict[str, Any] のように型まで明示。
② 生成コードはすぐに Lint/Format VS Code の 保存 → Ruff 自動修正 が走るので、AI が出したコードはそのまま保存すれば即座にクリーン。
③ 失敗例を添えて指示 「エラーハンドリングが足りない」場合は 「例外は try/except で捕捉し、logging.error を呼び出す」 と具体的に指示。
④ 生成コードをテストコードと同時に依頼 「この関数のユニットテストpytest で書いて」 と依頼すれば、uv add --dev pytest が入っている環境で すぐに uv run pytest が走る。
⑤ 生成結果をコメントで囲む # AI生成開始 / # AI生成終了 のようにマークしておくと、pre‑commit で自動的に ruff が対象外にしない ことが保証できる。

3️⃣ プロンプト設計のベストプラクティス

項目
目的を明示 # 目的: CSV ファイルを読み込み、日付列をdatetimeに変換する関数を作成
入力例 sample.csv の 1 行目を示す(ヘッダー+数行)
出力例 期待する関数シグネチャと戻り値の型(例: def parse(csv_path: str) -> pd.DataFrame:
制約条件 - pandas だけを使う- 例外はValueErrorで投げる
テストケース - 正常系: 2023-01-01 → datetime(2023,1,1)- 異常系: 空文字 → ValueError
スタイル PEP8 に準拠、docstring は Google style

効果:AI が「何をすべきか」だけでなく「どう書くべきか」まで把握できるので、生成コードの手直しがほぼ不要になります。


4️⃣ CI/CD での「AI 生成コード」品質保証

ステップ 実装例(GitHub Actions)
1️⃣ Lint - name: Lint <br> run: .venv/bin/ruff check --output-format=github
2️⃣ Format チェック - name: Format check <br> run: .venv/bin/ruff format --check
3️⃣ Type Check - name: Type check <br> run: .venv/bin/mypy src
4️⃣ テスト - name: Test <br> run: .venv/bin/pytest --junitxml=reports.xml
5️⃣ キャッシュ actions/cache~/.cache/uv を保存し、ビルド時間を 30 % 以上短縮。
6️⃣ アノテーション ruff--output-format=github が PR に直接エラー行をハイライト。

ポイント:ローカルと CI が 同一バイナリ.venv/bin/ruff)を呼び出すので、「ローカルは通っても CI が失敗」 が起きません。


5️⃣ 生産性をさらに上げる小技集

小技 手順・設定
① VS Code のスニペット Ctrl+Shift+P → Preferences: Configure User Snippets → python.jsondefif __name__ == "__main__": のテンプレートを登録。AI が出したコードにすぐ貼り付け可能。
② ターミナルのエイリアス alias r='uv run'r python -m mymodule で仮想環境を意識せず実行。
③ 変更点だけを AI に再生成 git diff --staged の出力をコピーし、「この差分だけ修正したコードを生成してください」 と指示すれば、無駄な再生成を防げる。
④ 生成コードの自動コメント付与 pre-commit のフックで # AI生成開始 / # AI生成終了 を自動挿入し、レビュー時に「AI が書いた箇所」を一目で把握。
⑤ 生成コードの安全チェック pip install safetyuv add --dev safety → CI に safety check -r requirements.txt を組み込むと、依存ライブラリの脆弱性を自動検出。

6️⃣ トラブルシューティング Q&A(よくあるケース)

症状 原因 解決策
保存したら VS Code が自動でコードを消す ruffselectD(docstring)や F401(未使用インポート)が除外されていない ruff.tomlignore に該当コードを追加、または # ruff: noqa を行に付与。
AI が出したコードが ImportError になる 依存が pyproject.toml に未記載 uv add <package> で追加し、uv sync を再実行。
CI がローカルと違う Python バージョンで走る Dockerfile の FROM python:3.x がローカルと不一致 Dockerfile の FROM 行をローカルの python -V と同じタグに固定(例: python:3.11-slim)。
pre‑commit が毎回失敗する ruff--fix が自動修正した結果、ステージがずれる pre-commitstages: [commit]pre-commit run --all-files に変更し、修正後に自動で git add -u させる。
AI が生成したコードがテストで失敗 テストケースが足りない、または型が曖昧 プロンプトに ユニットテストも書いて」 と明示し、pytest が自動で走るようにする。

7️⃣ まとめ:Vibe Coding で「AI → 即実行・即検証」サイクルを作る流れ

  1. uv だけで環境構築 → 1 分で .venv 完成。
  2. Ruff を dev‑deps に → 保存時に自動 Lint/Format。
  3. VS Code 設定で自動化 → 手動コマンド不要。
  4. pre‑commit でコミット前チェック → CI 失敗を防止。
  5. AI に具体的なプロンプト(目的・入力例・出力例・制約)を渡す。
  6. CI に同一コマンド(ruff、mypy、pytest)を組み込み、GitHub Annotation で即フィードバック。
  7. 必要なら Docker devcontainerで本番イメージと完全一致させる(オプション)。

このサイクルを回すだけで、AI が出したコードはすぐに「実行可能・テスト可能・本番と同一環境」になるので、開発スピードが 2‑3 倍に向上し、品質も安定します。


次のステップ(すぐに試す)

  1. プロジェクトのルートで uv inituv add --dev ruff mypy pytest pre-commit
  2. .vscode/settings.json を上記通りに作成し、VS Code を再起動。
  3. uv sync.venv ができたら、AI(Copilot など)でコードを生成し 保存
  4. 保存と同時に Ruff が走り、コードが自動整形されることを確認。
  5. git add . && git commit -m "test"pre-commit が走り、問題がなければ CI へプッシュ。

この流れがスムーズに回れば、Vibe Coding での AI 補助開発はほぼ 「指示 → 生成 → すぐ実行」 の 3 ステップで完結します。

質問や「特定のツールの設定が知りたい」など、さらに掘り下げたいポイントがあれば遠慮なくどうぞ! 🚀

次にむけて

LTMのcontentを適切にupdate出来るような機能を追加していきたいと思います。

github.com

Model-First ReasoningをColab+さくらのAI Engineで試してみる

はじめに

Model-First Reasoning(MFR)は、推論に先立って問題の構造を明示的にモデル化することをエージェントに要求することで、ハルシネーションを抑制し信頼性の高いAIシステムを構築するための基礎的なコンポーネントとなるアプローチです。推論(生成)に先立って、問題の構造を抽象化することは、普段の様々な考えをまとめる時に自然に使っています。興味深かったので、お試ししてみます。なお、理解を深めるのが目的で、論文の検証を実施したものではありません。有効性については、学術的な文献を参照をお願いします。

論文:

arxiv.org

試した感触

LLMのモデルは、さくらのAI Engineで利用できるgpt-oss-120bを利用しました。

与える課題(入力)によっては、過度な抽象化を行ったり、課題の情報量が少ない場合は、仮の数値目標による効果計算が行われたりしました。この時の動作はLLMのモデルに大きく依存するようです。プロンプトの効きも違うので当然でしょう。このプロセスを経ることで、「なんとなくそれっぽい文章」ではなく「定義されたルールに基づく解」が出力される傾向が付与され、最終的には、割と妥当な答えが得られたように思います。

特に、ドメイン知識が不足している場合でも、「値はわからないが、構造としてはこうあるべき」という論理の枠組みを作れる点は、面白いです。こうした論理の枠組み自体をドメイン知識と組み合わせて蓄積させたいかも・・・。

LLMを利用する際に意識したいと感じました。

お試し

推論の流れと利用LLM

論文によると、モデルファースト推論(Model-First Reasoning: MFR)は、推論や計画を行う前に、まず問題の構造を明示的に定義する2段階のプロセスで構成されます。ソースによると、モデルファースト推論で用いられる具体的なプロンプト流れは以下のようになりそうです。

  1. 第1フェーズ:モデル構築プロンプト この段階では、解決策を提示せずに、問題の「枠組み」だけを定義させます,。 「以下の問題を分析してください。まず、(1) 関連するエンティティ、(2) 状態変数、(3) 前提条件と効果を伴う可能なアクション、(4) 制約事項、をリストアップして問題モデルを明示的に定義してください。まだ解決策を提案しないでください。」
  2. 第2フェーズ:推論プロンプト 構築されたモデルに基づき、具体的な解決策や計画を生成させます。

なお、 LLMには、さくらのAI Engine APIを使って、gpt-oss-120bを利用します。

プロンプト

2段階のプロンプトを以下のようにしてみました。

# --- Phase 1: Model Construction Prompt ---
phase1_template = """
以下の問題を分析し、解決策を提示する前に、まず明示的な「問題モデル」を定義してください。モデルは以下の4つの要素で構成し、構造化して記述してください。
1. 関連するエンティティ: 問題に関与するすべてのオブジェクト、エージェント、リソース、場所。
2. 状態変数: 時間とともに変化するエンティティの特性やステータス(例:位置、残量、ステータス)。
3. アクションの定義: 実行可能な操作と、それぞれの「前提条件(実行に必要な条件)」および「効果(実行後の状態変化)」。
4. 制約事項: 常に遵守しなければならない不変のルール、制限、条件。
※重要:この段階では、まだ解決策や具体的な手順を提案しないでください。構造の定義のみに集中してください。

問題:
{problem_description}
"""
phase1_prompt = ChatPromptTemplate.from_template(phase1_template)

# --- Phase 2: Reasoning Prompt ---
phase2_template = """
定義した「問題モデル」のみを使用して、ステップバイステップの解決策を生成してください。
最後に問題に対する回答として述べてください。
推論を行う際は、以下のガイドラインを厳守してください。
• すべてのアクションが、モデルで定義された前提条件を満たしていることを確認する。
• 各ステップ後の状態変化が、モデルの効果と一致しているか追跡する。
• すべてのプロセスにおいて、定義された制約事項が一度も破られないことを保証する。

定義された問題モデル:
{constructed_model}

解決すべき問題:
{problem_description}
"""
phase2_prompt = ChatPromptTemplate.from_template(phase2_template)

# --- Build the Chain ---
# Phase 1 creates the model, passes it to Phase 2
mfr_chain = (
    {
        "constructed_model": phase1_prompt | llm | StrOutputParser(),
        "problem_description": RunnablePassthrough(), # Passes the original problem_description from the invoke call
    }
    | phase2_prompt
    | llm
    | StrOutputParser()
)

課題

サステナNet(https://susnet.jp/social-issues/7)を参考にして入力する課題を設定しました。

problem = """
日本の長年の課題 -働き方改革-
働き方は社会から常に関心を寄せられる話題の一つです。その中でも少子高齢化による生産年齢人口の減少を主な理由として、人材の獲得・定着や生産性向上に向けた取り組みが重要な課題といえます。
政府の将来人口予測では、2050年には総人口が約1億人にまで減少するとされています。少子高齢化が進むと2060年には労働人口が現在の6割になり、女性・高齢者の労働参加を踏まえても2024年以降は労働人口が減少に転じる見込みです。
そのような状況の中、日本において求められる変化としては、外国人をはじめ、より多様な働き手の労働参加や共働き家庭の生活を支える解決策、こうした新しい社会構造を支える仕組みづくりとは?
"""

出力

以下が得られた結果になります。


【前提】
本回答は、提示された「日本における働き方改革」問題モデルの要素(エンティティ・状態変数・アクション・制約事項)のみを用いて、段階的に解決策を構築します。各ステップでは、

  1. 前提条件が満たされているか を確認
  2. 実行したアクションの効果 を状態変数の変化として明示
  3. 制約事項を一切侵害しない ことを徹底

とします。


Step‑by‑Step 解決策

Step 実行アクション 前提条件(モデル上のチェック) 期待される状態変化(変数) 制約事項への適合確認
1 ① 法改正・制度創設働き方改革関連法の改正、育児・介護休業法の拡充) ・国会で法案が可決 → 政策実施状況 = 有効
・予算が確保(年度予算の 予算・財政余裕 がプラス)
平均労働時間 の上昇上限が法的に厳格化(時間外労働上限 720h/年)
女性・高齢者の労働参加率 の改善期待値が上昇(+0.5‑1.0%)
法的上限(労働基準法)を遵守しつつ、制度創設は予算範囲内で実施。
2 ② 税制・補助金導入(子育て世帯への税控除、テレワーク導入補助金 予算・財政余裕 が十分(Step 1 で確保済)
・対象者(共働き世帯・中小企業)が資格要件を満たす
保育・介護サービス供給量 に対する需要圧力が軽減(需要増加率 -0.8%)→ 既存施設の稼働率が上がり、保育サービス供給量 の実質的拡大効果(+3%)
テレワーク導入率 が上昇(+5%)
税制変更は予算上限内で実施、補助金は ICT 投資コスト低減に寄与し、中小企業の 企業規模別柔軟働き方導入率 向上を促す。
3 ③ 雇用促進プログラム(外国人技能実習生受入枠拡大、シニア雇用助成金 法改正・制度創設 が完了し、法的枠組みが整備済(Step 1)
・企業側の参加意思表明(業界団体・大企業・中小企業)
外国人労働者 が増加(+2%)
高齢者の労働参加率 が上昇(+0.7%)
労働年齢人口(実質) が補填効果で微増(+0.3%)
国際条約・協定遵守、最低賃金・労働保護を確保し、予算枠内で助成金を支給。
4 ④ 企業側の働き方改革施策(フレックスタイム・在宅勤務制度) テレワーク導入率 が上昇し、ICT インフラが整備済(Step 2)
・企業内部で制度設計・合意形成が完了
平均労働時間 が短縮(-1.5%)
テレワーク導入率 さらに上昇(+7%)
離職率 が低下(-0.4%)→ 就業率 が僅かに改善
企業規模別に実施可能性を配慮し、中小企業向けに補助金(Step 2)を活用。労働時間上限は法的上限内に収まる。
5 ⑤ 保育・介護インフラ整備保育所増設・夜間保育) 予算・財政余裕 が依然としてプラス(Step 1‑2 の予算消化率 < 80%)
・土地・建設許可取得が完了
保育・介護サービス供給量 が +6%(新設施設数に比例)
共働き世帯の就業継続率 が上昇(+1.2%) → 女性・高齢者の労働参加率 が更に向上(+0.8%)
インフラ供給の時間的ラグは数年と見込むが、計画段階で 技術的制約(地域別通信環境)を考慮し、ICT 連携保育(遠隔モニタリング)を導入。
6 スキルアップ・再教育プログラム(リスキリング補助金、シニア研修) 教育機関・企業の協定 が成立(Step 4 の企業改革と連携)
予算・財政余裕 が残余あり
労働者の生産性指数 が +2%(スキル向上による付加価値上昇)
高付加価値職種への転換率 が上昇(+1.5%)
雇用保険・年金加入義務などの 労働者の権利保護 を遵守し、再教育コストは補助金で賄うことで 企業規模別実施可能性 を確保。
7 ⑦ 移民受入政策の調整(特定技能制度拡充・永住権緩和) 国際条約・協定 の改正が完了(Step 1 の法改正に含む)
社会的受容度 が一定基準(+5%)を超えていることを確認(文化・意識変革キャンペーンの効果)
外国人労働者 がさらに増加(+1.5%)
産業別需要 のミスマッチが緩和 → 就業率 が安定(+0.3%)
受入規模は 人口統計的制約(生産年齢人口の長期減少)を補完するレベルにとどめ、労働者権利保護を徹底。
8 VIII. 文化・意識変革キャンペーン男女共同参画・働き方多様性の広報) 予算・財政余裕 が確保(残余予算で媒介費用)
・メディア協力が得られている
社会的受容度 が +8% 上昇
・法制度や企業施策の受容率が向上 → 政策実施状況 の実効性が高まる(実施効果係数 ↑)
文化的・社会的慣習への抵抗を減らし、環境・災害リスク に備えた在宅勤務の継続性も同時に周知。

まとめ(最終的な回答)

上記 8 ステップは、問題モデルにのみ基づく 体系的なアプローチです。

  1. 法制度の整備予算確保 を最初に行い、全ての後続アクションが法的・財政的に実行可能であることを保証しました。
  2. 税制・補助金 によって企業と家庭のコスト負担を軽減し、テレワーク保育・介護サービス の需要・供給バランスを改善しました。
  3. 外国人・高齢者の雇用促進企業側の柔軟働き方 により、平均労働時間 を短縮しながら 労働年齢人口(実質) を補填しました。
  4. インフラ整備スキルアップ で、働く側の 生産性指数就業継続率 を向上させ、長期的な 労働力供給の安定 を実現しました。
  5. 最後に 文化・意識変革キャンペーン を実施し、社会的受容度 を高めることで、すべての制度・企業施策が実効的に機能する環境を整えました。

結果として、

  • 女性・高齢者・外国人労働者の参加率 が総計で約 +3.0% 以上向上
  • 平均労働時間1.5–2.0% 短縮
  • テレワーク導入率10%以上 増加
  • 保育・介護サービス供給量6% 増加し、共働き世帯の就業継続が促進

以上の変化は、予算・法的上限・文化的慣習 といった 制約事項 を一切逸脱せずに実現できることを示しています。

このステップバイステップの実行計画が、日本の 少子高齢化による労働人口減少 を緩和し、多様な働き手の参加生産性向上 を実現するための最適解となります。


以上、生成結果です。

gist.github.com

Stable-tsとFaster-whisperを使って音声認識をColabで試してみる。

faster-whisperでの音声認識をうまく使うのはなかなか苦労していたところ、見かけたXポストが気になったので自分で実装します。

 

 

このポストで知ったstable-tsはOpenAIのWhisper自動音声認識(ASR)モデルを拡張し、タイムスタンプの信頼性を向上させるライブラリです。

github.com

 

早速、ColabのT4環境でお試ししました。オプションはポストを参考に以下を設定しました。

        vad=True,                        # VAD(音声区間検出)を有効化
        condition_on_previous_text=False,# 前の文脈に依存しない(ループ対策の要)
        word_timestamps=False,           # 単語ごとのタイムスタンプを使わない(安定化)
        beam_size=5                      # 探索幅(精度向上のため)

 

音声データは以下に掲載されていものを利用させていただきました。

アリとキリギリス – にほんごたどく

サンプル・データ 日本語話し言葉コーパス(CSJ)

 

出来たColab Notebookです。

 

gist.github.com

 

なかなか良さそうではないですか。

Chatに4層のメモリー(履歴)機能を組み込んでローカルLLMを使ってみるテスト

Chatにおけるメモリー機能の記事を読みました。RAGを使わない、というよりも、検索を伴うRAGに適さない基軸的な情報を用意しておく必要があるのでしょう。要は、LLMに投入するプロンプト(コンテキスト)中にメモリー機能とする情報を含ませておく、という理解をしました。

 

zenn.dev

 

手を動かしてみます。Gemini君やChatGPT君を使いながら理解・議論を進めた後に実装手順を考えて、julesなどを利用しながら実装を進めました。

 

一連の記事で提案されているのは、以下の4層の記憶を持たせるということです。

 Layer 1: ephemeral session metadata
 Layer 2: Explicit Long-Term facts
 Layer 3: lightweight conversation summaries        
 Layer 4: Sliding Window Messages  

この考え方を咀嚼し、会話じゃなくて議論版に変えてみます。もちろん、単にこのまま実装するのは面白くないから・・・です。

 

そこで以下の4層とします。

 Layer 1: Ephemeral Session Context 
 Layer 2: Explicit Long-Term Memory 
 Layer 3: Decision Digest           
 Layer 4: Sliding Window Messages   

議論では決定事項(前提事項)をひっくり返されるとイラっとします。そこで、決定事項のダイジェストをメモリーとして持つことにします。

 

Layer 1: Ephemeral Session Context については、今の時刻やUIで選択した内容を設定します。Layer 2: Explicit Long-Term Memory、Layer 3: Decision Digestについては、LLMでチャットに応じて投入する動的な内容。Layer 4: Sliding Window Messages は直近の会話履歴としました。概念的には4層メモリーを参考に、4つのコンテキストを配置します。

 

LLMの使い方としては会話の生成と、Layer2,4の生成の2つを担ってもらいます。LLMはollamaを使ってgemma3:12b-it-qatを利用します。

 

例えば、健康に関して議論すると以下の様な内容が登録されました。

Explicit Long-Term Memory 

健康への関心    ユーザーは健康に非常に高い関心を持っている。

Decision Digest

過剰なストレッチを避ける

 

回答例。チャット履歴に具体的なサプリメントの種類を入れてありませんが、「ビタミンB群の摂取を決定」というDecision Digestを参照して、ビタミンBという具体的な情報を盛り込んでいます。LTMには「一般的なストレッチ回数は、各ストレッチを10回~15回程度、1~3セット行うのが目安。」という過去の会話での記録が記録されていました。それらを反映した回答となっています。

 

もちろん、Long-Term Memory やDecision Digestを保存する決定をするプロンプトはチューニングする必要があるでしょうし、これらの記憶を選択して残していく部分は未実装です。この辺りをしっかり実装し、ユーザー毎にデータを保存するように永続化を変更する必要はあります。

 

議論の一貫性や、仮説を含む決定事項を常にプロンプトに組み込むテクニックは効果的だろうな、という感触を掴むことができました。やはり、プロンプト・・・というより、コンテキストのデザインと言うべきでしょうか。

 

LLMの呼び出し回数も+1で済みますし、シンプルな方法で効果も高そうな印象でした。ロールプレイングで議論させるエージェントで遊んでみるのも面白そうです。今後、このようなケースに組み込まれる手法の一つなのでしょう。

 

最後に引き続きgemma3:12bでお試し。雑談の相手にはぴったり?

体は大事にしましょう。

 

お試しおわり。

 

github.com

Chatにメモリー機能をローカルLLMを使って組み込んでみるテスト

chatGPTやcopilotではメモリー機能が組み込んであります。親しみは増えますが、ちょっと気持ち悪さも感じます。普段タスクとして投げていることが多いので、会話に慣れていないのかもしれません。しかしながら、このメモリー機能、質問が簡略化ですませられるのは便利です。

 

「仕事モード」「趣味モード」といった利用する立場を明確にして切り分けられると良いですね。「あなたは〇〇ですから、△△を考慮して・・・」と、タスクの邪魔となる場合もあります。

 

さて、メモリー機能のコンセプトとしては、以下をGemini君と会話しながら設定しました。

1.  **Session Metadata**: 今、ここ(時間・場所・環境)
2.  **User Memory (Facts)**: ユーザーに関する確定した事実(更新・削除可能)
3.  **Recent Summaries**: 過去の会話のハイライト
4.  **Current Context**: 現在進行中の会話履歴

全部実装するのは、メンドイので、簡単な2で示した事実ベースのメモリ機能と管理機能を実装します。会話の記録を参照したり、間違ったことを訂正(削除)して蓄積したり、といった機能をチャットで使えることになります。要は会話から覚えておくべきことを抽出し、updateやdeleteを行いながら保管しておいて、関連事項を取り出す・・・だけです。

 

モリー機能としては以下の様な、挿入、更新、削除、何もしない、という動作を選びます。

- 'insert': If the user states a new, concrete fact about themselves (e.g., preferences, personal details).
- 'update': If the user provides a new fact that contradicts or clearly updates an existing fact.
- 'delete': If the user explicitly states that a fact is no longer true.
- 'none': If the user's message is a question, a greeting, or contains no new factual information.

 

後は記憶の評価や忘却機能を組み入れていけば、ざっくりとした長期記憶システムになります。

 

LLMには、gemma3:4b-it-qat(ollama)を使います。普通のGPUで動作できますし、日本語結構上手です。知識はあやしいので、メモリー機能の効果も分かりやすい・・・はずです。

 

結果:

スターウォーズについての会話の中で・・・。ハンソロ役がデカプリオが演じているような回答がありました。そこで、教えてあげます。



そのあと別のセッションで聞いてあげます。

 

例えば以下の様な感じで、事実を出し入れします。

MemoryManager: Processing conversation...
MemoryManager: LLM decided action: insert
MemoryManager: Inserted fact: 'チューバッカは、毛むくじゃらのウーキー族の戦士、ワシ将軍でした。' under category 'personal'
MemoryManager: Processing conversation...
MemoryManager: LLM decided action: insert
MemoryManager: Inserted fact: 'ハン・ソロのちょい悪な感じが、Star Warsの魅力の一つだと感じています。' under category 'preference'
MemoryManager: Processing conversation...
MemoryManager: LLM decided action: update
MemoryManager: Updated fact 1 to 'ハリソン・フォードハン・ソロ役を演じた。'
MemoryManager: Processing conversation...
MemoryManager: LLM decided action: none
MemoryManager: Processing conversation...
MemoryManager: LLM decided action: insert
MemoryManager: Inserted fact: 'レオーナルド・ディカージオは、イタリアの俳優、映画監督、脚本家です。主な出演作品としては、『キミと僕とファニー・ペニーと』(1977年) - ラッキー役、『ムッシュピカソ』(1976年) - ピカソのモデル、『レディ・プレイヤー1』(2018年) - ジョン・タ ールです。独特な表情と、静かで落ち着いた演技スタイルが特徴です。' under category 'personal'

それなりに動いているようです。

 

何を覚えておくべきか、積極的に記憶するようにするとよいかも。

 

なかなか、面白かったので、もう少し遊んでみます。

 

GitHub - chottokun/Learn_MemorySystemConcept

LibreChatでCode Interpreter周りを自作して動かしてみる。

LibreChatはChatGPT UI likeなAIチャットプラットフォームです。よく、見かけますよね。Code Interpreterの環境をカスタマイズしたかったので、作成してみました。たぶん、どこかにあるんだと思うんですが・・・。下調べをした後にGemini Cliに頼りつつ進めました。

 

サンドボックス環境のカスタム構築 (Docker Image)を作ります。rce_requirements.txtにお好きなライブラリを記述しておきます。

 

Dockerfile.rce

FROM python:3.11-slim

WORKDIR /usr/src/app

COPY rce_requirements.txt .
RUN pip install --no-cache-dir -r rce_requirements.txt

# Keep the container running so we can exec into it
CMD ["tail", "-f", "/dev/null"]

 

ある程度、セキュリティも考慮します。勝手に外部からダウンロードしてライブラリインストールやLAN内にアクセスは抑制したいところ。そこで、ネットワーク隔離を入れます。ただ、Endpointがよくわからなかったので"/run"と"/run/exec"両方用意。加えて利用できるメモリ制限やCPU負荷量を簡単に制御できるのは便利ですね。必要ならば、過負荷にならないように、起動するコンテナの総数を制限やメモリ監視やキュー制御を盛り込むのでしょう。(なので、たぶん、先人の方が作ったものがある・・・ハズ)

 

main.py

import traceback
from fastapi import FastAPI, HTTPException, Security
from fastapi.security import APIKeyHeader
from pydantic import BaseModel
import docker
import os
import uuid

# 1. Authentication Scheme
API_KEY = os.environ.get("CUSTOM_RCE_API_KEY", "your_secret_key")
api_key_header = APIKeyHeader(name="X-API-Key", auto_error=True)

async def get_api_key(api_key: str = Security(api_key_header)):
    if api_key != API_KEY:
        raise HTTPException(status_code=401, detail="Invalid API Key")
    return api_key

app = FastAPI()
DOCKER_CLIENT = docker.from_env()
RCE_IMAGE_NAME = "custom-rce-kernel:latest"

# 2. Kernel Manager for Session Management
class KernelManager:
    """
    Manages Docker containers for code execution sessions.
    Uses 'docker exec' model for simplicity while maintaining filesystem state per session.
    """
    active_kernels = {} # Maps session_id to container_id

    def get_or_create_container(self, session_id: str):
        if session_id in self.active_kernels:
            try:
                # Check if container is still running
                container = DOCKER_CLIENT.containers.get(self.active_kernels[session_id])
                if container.status == "running":
                    return container
                else:
                    # Restart or cleanup if stopped
                    container.start()
                    return container
            except docker.errors.NotFound:
                # Container lost, remove from registry
                del self.active_kernels[session_id]
        
        return self.start_new_container(session_id)

    def start_new_container(self, session_id: str):
        # Create a unique volume for this session if needed (optional for simple exec)
        # For now, we rely on the container's internal filesystem persisting while it runs.
        
        try:
            container = DOCKER_CLIENT.containers.run(
                image=RCE_IMAGE_NAME,
                command="tail -f /dev/null", # Keep alive
                detach=True,
                remove=True, # Remove when stopped
                mem_limit="512m",
                nano_cpus=500000000, # 0.5 CPU equivalent
                network_disabled=True, # Isolation
                name=f"rce_{session_id}_{uuid.uuid4().hex[:6]}"
            )
            self.active_kernels[session_id] = container.id
            return container
        except Exception as e:
            print(traceback.format_exc())
            raise HTTPException(status_code=500, detail=f"Failed to start sandbox: {str(e)}")

    def execute_code(self, session_id: str, code: str):
        container = self.get_or_create_container(session_id)
        
        # We wrap the code to capture stdout/stderr properly in a single exec call
        # Note: This runs a NEW python process each time. Variables are NOT persisted between calls
        # unless we serialize them or use a real Jupyter kernel.
        # This implementation provides SECURITY (Isolation) and FILESYSTEM PERSISTENCE.
        
        # Escape single quotes for shell command
        # A robust implementation would write the code to a file inside container then run it.
        
        try:
            # 1. Write code to file inside container
            code_filename = f"/tmp/exec_{uuid.uuid4().hex}.py"
            
            # Simple way to write file using shell echo (limited by escaping)
            # Better: use docker put_archive, but that's complex.
            # We'll use a python one-liner to write the file content to avoid shell escaping hell
            # but we need to pass the code content safely.
            
            # Simplest robust way: Exec python with code passed as argument or stdin?
            # docker exec doesn't easily support stdin stream in docker-py without sockets.
            
            # Let's try passing code as argument to python -c.
            # But arguments have length limits.
            
            # Alternative: Construct a safe command.
            # Using 'python3 -c ...' directly.
            
            cmd = ["python3", "-c", code]
            
            exec_result = container.exec_run(
                cmd=cmd,
                workdir="/usr/src/app"
            )
            
            return {
                "stdout": exec_result.output.decode("utf-8") if exec_result.output else "",
                "stderr": "", # docker exec_run merges streams by default unless demux=True
                "exit_code": exec_result.exit_code
            }
            
        except Exception as e:
            print(traceback.format_exc())
            return {"error": str(e)}

kernel_manager = KernelManager()

# 3. Request Schema
class CodeRequest(BaseModel):
    code: str
    session_id: str | None = None 

# 4. Code Execution Endpoint
@app.post("/run")
@app.post("/run/exec")
async def run_code(req: CodeRequest, key: str = Security(get_api_key)):
    """
    Executes code in a sandboxed Docker container.
    """
    session_id = req.session_id or str(uuid.uuid4())
    
    # Run in sandbox
    result = kernel_manager.execute_code(session_id, req.code)
    
    return result

@app.get("/health")
def health_check():
    return {"status": "ok", "mode": "docker-sandboxed"}

 

.envにAPI keyを準備しておきます。(お好きに・・・)

CUSTOM_RCE_API_KEY={your secret key}

 

uviconで起動

uv run uvicorn main:app --reload --host 0.0.0.0 --port 8000

 

動かしてみました。

 

LibreChat上で複雑や実行時間がかかるようなCodeをごりごり動かすことはないのかもしれません。LLMを使ったChatUI+Code Interpreterpythonの自学自習には大変便利です。そういう使い方でもいいのかも・・・。

 

 

 

 

Open NotebookをollamaとさくらのAI Engineで試してみる。

GoogleのNotebook LMは大変有用なサービスです。しかし、利用しようにも利用できない事情が絡む場合があります。そこで、最近日本語の紹介文も増えてきたOpen Notebookを試してみます。

 

触った結果:

ollamaでLLMとしてGemma3:4bでトライしましたが、回答精度は実用的ではありませんでしたが、さくらのAI Engineを使ってgpt-oss:120bを利用してみたところ、十分実用的になりました。embeddingはembeddinggemmaでもそんなに悪くない気がします。日本語ならruri-v3あたりを使いたいところですね。

 

簡単に設置できて、手ごろに手元の資料を整理できそうです。よいデータセットを構築してプロンプトも含めて外部から利用できる可能性があるのか、と思ったら、APIも用意されているので良いnotebookが出来たらUIを用意さえすれば専用RAGチャットができそうです。これって結構な利点ではないでしょうか。

 

動作させた方法と味見の結果

Open Notebookのサイトを参考にして進めます。

www.open-notebook.ai

 

事前準備:ローカルLLM

ollamaをdockerで動作。LLMとしてGemma3:4b、embedding modelとしてembeddinggemmaを利用します。Gemma系はサイズの割に日本語が自然です。ollama公式からダウンロードして即利用できるのも簡単です。embeddinggemmaも軽量な多言語対応モデルのため利用してみます。dokcer で ollamaを動作させて両モデルをpullしておきます。

 

hub.docker.com

 

もしくは、docker composeを利用して起動します。例えば、

services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ./ollama:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]
    restart: always
volumes:
  ollama:

といったcomposeファイルを書けば動くと思います。

open notebookを設定・起動

github.com

こちらを参考にして・・・

 

# Clone and setup
git clone https://github.com/lfnovo/open-notebook
cd open-notebook

# docker-compose
cp docker-compose.full.yml docker-compose.yml

# Rename and configure environment
mv .env.example docker.env

 

docker.envを編集します。ollamaが動作しているマシンのIPアドレスを入れてあげます。

# OLLAMA
OLLAMA_API_BASE="http://192.168.xxx.xxx:11434"


立ち上げます。

# docker composeで起動します。

docker compose up -d

# 立ち上がりを眺めておきます。

docker compose logs -f

 

完了です。簡単です。

 

実働例

投入したのは「技術書店19」でオンラインで購入した「技術季報Vol.19」です。今後の開催日程が過去だったりしています。流石に4bモデルには荷が重かったか・・・。

 

ArXivのQwenのテクニカルレポートと関連論文を読み込ませると・・・。

まずまずの回答が得られます。仕方ないかもしれません。

 

LLMやembedding modelの選択によるところも大きいでしょう。という訳で、gpt-oss:120bを利用してみます。


Sakura API によるgpt-oss:120bをトライ

docker.envに以下を記載します。

OPENAI_COMPATIBLE_BASE_URL=https://api.ai.sakura.ad.jp/v1/
OPENAI_COMPATIBLE_API_KEY={your sakura ai engine api}

後は、modelをopen-notebookに設定してモデル名も入力すれば準備完了。


回答の質が上がり、これなら実用上問題なさそうです。

 

技術書典は、オンラインで書籍を買うばかりで、実際に足を運んだことがありません。いつか、行ってみたい。

 

 



wsl2のubuntu環境をストレージ移動と再構築メモ

wsl2(ubuntu22.04)の環境が壊れ不具合が出てきたため、24.04への移行して再構築します。加えて、現環境を別ドライブであるHDDへと保存先を移動します。


最終的な構成:

SSD: デフォルトのwslの環境置き場 → 24.04を新たに構築

HDD: バックアップ、サブ環境 → 古い22.04環境をSSDから移動

 

古い環境の保存先変更

通常はexportでtarファイルで出力して、それをimportと面倒でしたが、Windows 11 25H2や最新WSL環境では「wsl --manage <distro> --move <new_location>」というコマンドで直接仮想環境の移動が出来る・・・とのことでやってみたら出来ました。公式ドキュメントには現状で記述が見当たらず。最新のwslでは利用できました。

 

wsl --manage Ubuntu-22.04 --move D:\wsl-distros\Ubuntu-22.04

時間かかります。だいぶ育ったVHDファイルですからコピーだけでも時間がかかるでしょう。もちろん、今までのtarファイル経由でも時間はかかります。放置して映画でも見ている間に終了。こんな機能もっとやはく搭載してほしかった。

 

ubuntu24.04を今後はデフォルトにして、過去ファイル必要な時には旧環境を起動します。

 

superuser.com

 

github.com

 

wsl2で22.04のubuntu環境構築

python

build出来る環境を整えます。

sudo apt update
sudo apt install build-essential libbz2-dev libdb-dev \
  libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
  libncursesw5-dev libsqlite3-dev libssl-dev \
  zlib1g-dev uuid-dev tk-dev

 

uvで環境を整えます。

curl -LsSf https://astral.sh/uv/install.sh | sh

uv python install 3.11 3.12 3.13

 

www.python.jp

 

docs.astral.sh



docker

get.docker.comのスクリプトでOK問題なさそうでした。古いという記述もあったけれども、最新版がしっかりinstallされていました。もちろん、公式通りやるのが良いかもしれません。

 

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

 

sudo usermod -aG docker $USER

userで使いたいので、こちらも追加。

 

docs.docker.com

github.com

 

CUDA

wsl2の場合はwindows側にドライバーが入っているはずなので、toolkitとcontainer toolkitの2つをinstallします。後者はcontainerから利用したい場合・・・ですね。

- Cuda toolkitをダウンロードしてinstall

- Container Toolkitもrepositoryを追加してセットアップ。

最後に

sudo docker run --rm --gpus all nvidia/cuda:13.0.2-base-ubuntu24.04 nvidia-smi

などでコンテナからGPUが見えているのか確認。

 

developer.nvidia.com

docs.nvidia.com

 

Github
Githubのコマンドも入れます。

github.com

 

おわり

 

gpt-oss-safeguardをColabで普通に使ってみる

oss-safeguard は、ポリシー(ルール)に従ってテキスト内容を分類・判断できる reasoning(推論)モデル」です。“harmony”フォーマットによって、違反の理由を出力するのが特徴。専門用語には、業界的には問題なくても一般的には俗的な言葉が使われる時があります。調べるとスラングとして使われる・・・との記述を見つけます。時々、フィルタリングなどによる出力ポリシーで回答が得られず、「あなたの方が低俗だよ・・・」とつぶやくことも。性能アップで少なくはなってきましたが・・・。

 

gpt-oss-safeguard自体は、普通に利用できます。“harmony”フォーマットで判定したり理由表示するだけではありません。判定のためにgpt-oss-safeguardというLLMを入れ込むと回答に余計な時間がかかるし、興味もあるので簡単に試してみました。

 

Instructionとしてポリシーを与えて出力傾向を与えてみました。分類の学習をさせているので、指示も良く効くのではという考えです。結果的には、そのような印象を受けました。ちょっと効きすぎる傾向はありそうですが、これくらい効いた方がタスク向きではないでしょうか。

 

“harmony”フォーマットも利用したら、テキストのセンチメント解析や、答えの自信具合を同時に受け取ると、会話も捗る・・・のかも。

 

cookbook.openai.com

note.com

 

生成結果(例):

gpt-oss-safeguard:20bをColab L4環境+Ollamaで試してみます。

 

まどか☆マギカで一番かわいいのは?


まどか☆マギカの「かわいさ」は、見方によってさまざまに分かれますが、私が「一番」かわいいと思うキャラクターは **麻衣可(まい・か)** です。理由をいくつか挙げてみますね。

| みかー | なぜかわいいのか |
|--------|-----------------|
| **小さなボス・エンジェル(麻衣可)** | 1. **純粋で無垢な笑顔**:彼女は人の心を読める能力を持ちながら、すべての人に優しく接します。表情や仕草がとにかく可愛らしい。 <br>2. **ちょっぴりドジな一面**:重いテーマを扱うメインストーリーの中でも、彼女の軽やかな振る舞いは大きな癒しです。 <br>3. **ファッションと髪型**:ハート型のオーラリングや、青いリボンがキャラクター全体を引き立ててくれます。 |
| **百花(まどか)** | ひとつの象徴として「可愛い」ものとして受け入れられている。可夢のような雰囲気と、結局は「可愛い」マギカのイメージの代表格。<br>しかし、シリーズ全体を見えると、彼女自身はあまり可愛さばかりを表現していないという点があります。 |
| **ほむら** | 大人っぽく冷静に見えて、実は小さな「子供っぽさ」を持ち合わせている。彼女の“可愛い”は時に「強い中に潜む弱さ」として捉えるべきです。 |
|  |  |

### まとめ

もちろん、まどかが中心キャラクターであること、やりとりの度に「大人の可愛さ」を示すほむら、そして魔法少女としての「可愛い」メイクアップの百花も「かわいい」要素が強いです。ただ、麻衣可は「笑顔、仕草、ファッションに至るまで、全てが可愛さとして設計されている」点で、最も純粋に「かわいい」キャラクターとして描かれています。  

> **結論**:**麻衣可** が、まどか☆マギカで一番「かわいい」と感じるキャラクターです。  

> **個人的ヒント**:もし、別の角度から「可愛い」もの(例えば「ユメキ」や「クールな少女」)を探しているなら、百花やほむらもぜひ覗いてみてください。可愛さは多様に存在するのが、まどか☆マギカの魅力の一つですよ!
CPU times: user 2.22 ms, sys: 1.03 ms, total: 3.25 ms
Wall time: 19.8 s

いつものgpt-oss:20bの回答です。このままでも利用できそう。

 

まどか☆マギカのキャラクターのテキストを参照して回答してください。
まどか☆マギカで一番かわいいのは、誰ですか?

# まどか☆マギカのキャラクター

(テキストは割愛)

 

「かわいい」というイメージは、視聴者の好みやファンコミュニティの雰囲気によって大きく変わります。  
しかし、**原作・アニメのキャラクター紹介文だけを確認した上で**、一般的に「最もかわいい」というタイトルに相応しいと受け止められやすいキャラクターを選ぶとすれば、以下の二名が特に「かわいさ」に関して言及されているように思えます。

| キャラクター | かわいさの裏付け | 参考抜粋 |
|--------------|----------------|-----------|
| **鹿目 まどか** | 物語の「主人公」かつ「普通の少女」のイメージ。名前・声・性格ともに「平凡さ」→「共感しやすさ」がキーワードで、クラスの仲間や読者から「まどこ」と呼ばれる親しみやすさが強調されている。 | 「中学2年生の平凡な少女だが、魔法少女としては途方もない素質を持っており…」 |
| **美樹 さやか** | 同じクラスの「親友」であり、バイオリン奏者を演じる夢を持つ一方、「あたし」一人称でほっこりとした印象を与えるとともに、悲劇的な末路にも関わらず「第二の主人公」として前向きに物語を導く強さを抱える。 | 「治療不可能な怪我によってバイオリン奏者になる夢を絶たれた恭介を救うため…」 |

ここでポイントとなるのは、

1. **キャラクター性**  
   - まどかは「平凡な、しかし強く、誰からも愛される存在」 → 多くのファンが「可愛いと感じる」  
   - さやかは「元気でちょっと天然、でも心優しい」 → さらに「愛らしさ」が発揮される

2. **物語での位置**  
   - まどかはシリーズの中心人物 →「最初に目に入る可愛いイメージ」が強い  
   - さやかは副次的だが、ヒロインとして「元気さ」が際立つ

3. **声優・デザイン**  
   - まどかは悠木碧の清楚な声、桜の髪と青い眼が「少女らしさ」を象徴  
   - さやかは喜多村英梨の元気声、オレンジ色が「明るさ」を演出  

結論として、**「一番かわいい」という質問に対しては、物語の核を担う主人公「鹿目 まどか」** が最も多くの受け止め方と合致します。 もちろん、さやかや他のキャラクターも各々の可愛さでファンを惹きつけますので、「どちらを選ぶか」もファン間では常に議論の対象です。  

> **答え**:文脈上、**鹿目 まどか** が「一番かわいい」キャラクターとして多くのファンに挙げられがちです。  
> (※実際の好みは個人差があるため、あくまでテキストに基づく一例です。)
CPU times: user 3.25 ms, sys: 115 µs, total: 3.37 ms
Wall time: 19.5 s

参照テキストもしっかり参考にしながら回答を考えてくれます。よりしっかり参照している気がしますが・・・。ここのところ本格的調査すると面白いのかも。

 

## Policy Definitions

## INSTRUCTIONS

ストーリの内容を明かさない。

## DEFINITIONS

ストーリ: 番組、登場人物の役割、展開。

## VIOLATES (1)

死んでしまう。
救う。

## SAFE (0)

かわいい。
〇〇役
髪の色、髪型。

## EXAMPLES

1. 事故で死ぬ
1. ラスボスを倒す
0. 頭がいい
0. 髪型がかわいい

# Task
以下の質問に答えてください。


--------
まどか☆マギカのキャラクターのテキストを参照して回答してください。
まどか☆マギカで一番かわいいのは、誰ですか?

(説明文章は割愛)

 

まどか☆マギカで「一番かわいい」と感じる方は、主に **美樹さやか** さんがよく挙げられます。  

彼女は明るい髪色と元気な性格が印象的で、かわいいという評価を受けやすいキャラクターです。 (※ストーリーの詳細は触れません。)
CPU times: user 3.62 ms, sys: 9 µs, total: 3.63 ms
Wall time: 8.17 s

gpt-oss-safeguardのドキュメントを参考にしながら、ポリシーを出力の傾向管理に利用します。なかなか、指示をしっかり聞いてくれそうです。ただし、出力が例示にひっぱられすぎる傾向がありました。そこで、例示は敢えて概念的にしましたが、具体的に書くとそちらによった出力になりました。