2026年1月25日日曜日

LLM向けのドキュメント整備論

 LLMのことは、LLMに聞くのが良いと思います。

ここ最近、AIと付き合ってみて、非常に優秀だと思う反面、さっき説明したのに、何故分かってくれないのだろう?と思うことがあり、LLM特有の理解特性がありそうだな?と感じています。言葉や図の説明だけではなく、例を挙げて説明した方が、確実な理解につながる、ということを経験しました。なので,Json snippetsを多数、例として挙げることを考えました。

もしかしたら、LLMが理解し易いドキュメント構造が最も効果的な自然言語モデリング対策になるのではないでしょうか? 

以下の回答で、特に、LLMが理解し易い構造と、人間のそれとは、全く異なる、というのは衝撃で、この知見は、何処でも見たことがありません。差分が得意というのも知りませんでした。JSON Schema は LLM にとってノイズが多い、というのも知りませんでした。

なお、コパイの回答(Chat GPT)は、質問者に忖度してしまう傾向があると思います。正しい答えなのに、「ここが間違っている」という誤った指摘をすると、それに忖度してしまう傾向も見て取れました。なので、100%信頼する訳には行かない、というのは付記しておきます。





Q.MCP Resourceのサイト構成について参考になるサイトを教えて。JSONスニペットを多数配置したいのだが、参考になるのが見当たらない。

MCP Resource のサイト構成を「JSON スニペットを大量に載せたい」という観点で探すと、実は“公式の構成テンプレート”は存在しません。ただし、実際に JSON を多用して解説している良質な記事はいくつかあり、構成の参考として非常に役立ちます。以下に、特に「JSON を多く掲載しつつ、読みやすい構成」をしているサイトを厳選して紹介します。


📘 JSON スニペットを大量に載せる構成の参考になるサイト

1. Qiita: Model Context Protocol 完全解説シリーズ(特に Resources 編)

JSON の掲載量が多く、セクション分割・コードブロックの使い方・説明文の配置が非常に参考になります。
特に Resources 編は、JSON の例を段階的に示す構成が優秀です。

参考ポイント

  • JSON スニペットを「段階的に増やす」構成
  • 各 JSON の前後に短い説明を置く
  • 「なぜその JSON が必要か」を明確に書く

2. GitHub リポジトリを Resource 化する実例(Remote MCP Server)

GitHub のファイルを Resource として扱う実例で、構成図+コード+JSONの三点セットが揃っている。
JSON の置き方や、説明との距離感がとても参考になります。

参考ポイント

  • 図 → JSON → 実装コード の順で並べる構成
  • JSON の意味を「図」で先に理解させる
  • JSON スニペットを短く分割して掲載

3. MCP 公式ドキュメント(Resources)

公式は JSON の量は少なめですが、**情報の階層構造(セクション構成)**が非常に優れている。
JSON を大量に載せる場合でも、この構造を真似ると読みやすくなります。

参考ポイント

  • 「概要 → 目的 → 使い方 → 例 → 応用」の構成
  • JSON を“例”のセクションにまとめる
  • ページ全体の階層が明確

4. FastMCP 入門(npaka)

JSON(dict)を返すリソースの例が豊富で、コードと JSON の混在構成がとても参考になります。

参考ポイント

  • JSON を返す関数の例が多数
  • 「説明 → コード → JSON 出力」の三段構成
  • JSON の用途ごとにセクションを分けている

5. MCP リクエストの JSON 形式まとめ(jun01t)

JSON スニペットの量が最も多い記事のひとつ
「Tools / Resources / Prompts」など、MCP の全体像を JSON で説明しており、スニペットの並べ方の参考として最適

参考ポイント

  • JSON を「用途別」に分類して掲載
  • 大きな JSON を細かく分割して説明
  • JSON の“型・名前・説明”をセットで示す

🧩 JSON スニペットを大量に載せるサイト構成のベストプラクティス

あなたが MCP Resource のドキュメントを作る際に特に役立つ構成パターンをまとめます。

✔ 1. 用途別にセクションを分ける

1. Resource の基本構造
2. 静的 Resource の JSON 例
3. 動的 Resource の JSON 例
4. Resource Template の JSON 例
5. メタデータ付き JSON 例
6. 応用(URI パラメータ、フィルタリングなど)

✔ 2. 各 JSON の前後に短い説明を置く

  • JSON の前:目的・背景
  • JSON の後:ポイント・注意点

✔ 3. 大きな JSON は分割して掲載

1つの巨大 JSON を載せるより、段階的に増やすほうが圧倒的に読みやすい。

✔ 4. 図(構成図)→ JSON → コード の順に並べる

GitHub Resource 化の記事が採用している構成。
読者の理解がスムーズになる。


🔍 もっと具体的な「構成テンプレート」が必要なら作成できます

あなたの MCP Resource ドキュメントの目的(例:Schedule Nurse、Solver、Config、API など)に合わせて、最適なサイト構成テンプレートを作成できます。

たとえば:

  • JSON スニペット 50 個以上を載せる構成
  • LLM 向けに最適化した JSON の並べ方
  • 人間と LLM の両方が読みやすい構成
  • Mermaid 図と JSON の組み合わせ方

必要であれば、**あなたのプロジェクトに最適化した「完全テンプレート」**を作ります。
どんな種類の JSON を載せたいか、少し教えてもらえますか?

Q.LLM 向けに最適化した JSON の並べ方

LLM に最適化した JSON の並べ方は、人間向けの可読性とはまったく別物になります。
あなたのように「大量の JSON スニペットを扱う MCP Resource ドキュメント」を作る場合、LLM が誤読しない・構造を正しく学習する・参照しやすいという 3 点を満たす構成が圧倒的に重要です。

仙台でシステムアーキテクトとして日々構造化ドキュメントを作っているあなたなら、ここを押さえるだけで LLM への“餌の質”が劇的に変わります。


🧠 LLM 向けに最適化された JSON の並べ方(決定版)

🎯 1. 1 セクション = 1 意味(1 JSON)にする

LLM は「セクションの意味」を強く利用します。
1 セクションに複数の JSON を置くと、どれが正なのか判断できず混乱します。

悪い例(混在)

## Resource examples
{...}
{...}
{...}

良い例(意味ごとに分割)

## Static Resource example
{...}

## Dynamic Resource example
{...}

## Resource with metadata
{...}

📏 2. JSON は “小さく分割” して段階的に示す

巨大 JSON を一気に出すと、LLM は途中で構造を失います。

ベストパターン

  1. 最小構造
  2. プロパティ追加版
  3. 完成版
### Step 1: 最小構造
{
  "name": "patients",
  "type": "resource"
}

### Step 2: プロパティ追加
{
  "name": "patients",
  "type": "resource",
  "schema": {...}
}

### Step 3: 完成版
{
  "name": "patients",
  "type": "resource",
  "schema": {...},
  "examples": [...]
}

LLM は「差分」を理解するのが得意なので、段階的構成は非常に効きます。


🧩 3. JSON の前後に “短い説明” を必ず置く

LLM は JSON 単体より、説明 + JSON のペアで意味を学習します。

最適フォーマット

### この JSON の目的
患者一覧を返す静的 Resource の最小構造。

```json
{
  "name": "patients",
  "type": "resource",
  "items": [...]
}

この JSON のポイント

  • 静的 Resource
  • items は固定

説明は **短く・箇条書き** が最適。

---

## 🧱 4. **JSON の “型” を先に宣言する**
LLM は「型 → インスタンス」の順で理解すると精度が跳ね上がります。

Resource 型(抽象)

{ "name": "string", "type": "resource", "schema": "object", "examples": "array" }

Resource の実例

{ "name": "patients", "type": "resource", "schema": {...}, "examples": [...] }


抽象 → 具体 の順は LLM にとって非常に学習しやすい。

---

## 🧭 5. **JSON の “差分” を明示する**
LLM は差分を理解するのが得意なので、比較は効果的。

Before

{ "name": "patients" }

After(schema を追加)

{ "name": "patients", "schema": {...} }


---

## 🗂 6. **JSON を “用途別” に分類する**
MCP Resource なら、以下の分類が最適。

| セクション | JSON の種類 |
|-----------|-------------|
| 基本構造 | 最小 JSON |
| 静的 Resource | 固定データ |
| 動的 Resource | パラメータ付き |
| Resource Template | 変数展開 |
| メタデータ付き | schema / description |
| 応用 | フィルタリング・URI パラメータ |

LLM は「分類」を強く利用するため、誤読が激減します。

---

## 🧱 7. **Mermaid 図 → JSON → コード の順に並べる**
あなたが普段やっている構成図の活用は、LLM にも非常に効きます。

flowchart TD A[Resource] --> B[Schema] B --> C[Examples]


→ JSON  
→ 実装コード

この順番は **LLM の理解順序と一致** しています。

---

# 🧠 まとめ:LLM に最適化した JSON の並べ方(黄金ルール)

- 1 セクション = 1 JSON  
- JSON は段階的に増やす  
- JSON の前後に短い説明  
- 抽象(型)→ 具体(実例)  
- 差分を明示  
- 用途別に分類  
- 図 → JSON → コード の順  

あなたが作っている MCP Resource ドキュメント(特に Schedule Nurse のような複雑系)に、この構成を当てはめると、**LLM が誤読しない“強いドキュメント”**になります。

---

必要なら、  
**あなたの MCP Resource ドキュメントを丸ごと LLM 最適化した構成テンプレート**  
を作ります。

どの Resource(patients / shifts / assignments / solver / config など)から整えたいですか?


Q.構造は、同じなのですが、JsonSnippetsは、ユーザ言語で違います。現在は、日本語と英語をサポートしていますが、どうしたらよいですか?

多言語対応の JSON スニペットを扱うとき、構造は同じだが内容(説明文・ラベル・コメント)が言語ごとに異なるという状況は、MCP Resource ドキュメントではよく起こります。
あなたのように「LLM に最適化したドキュメント」を作りたい場合、ここを丁寧に設計すると LLM の理解精度が劇的に上がるので、かなり重要なポイントです。

以下に、**最適解(ベストプラクティス)**をまとめます。


🌍 結論:JSON スニペットは「言語ごとに別セクション」で分けるのが最適

LLM にとって最も誤読が少なく、かつ拡張性が高い方法はこれです。


🧠 ベストプラクティス:言語ごとにセクションを分ける

✔ 1. 構造は 1 つだけ説明する

まず「構造(schema)」は言語に依存しないので、最初に 1 回だけ説明します。

## Resource schema (共通構造)

```json
{
  "name": "string",
  "description": "string",
  "items": "array"
}

✔ 2. 言語ごとに JSON スニペットを分ける

次に、Language: en / ja のようにセクションを分けて掲載します。

English version

{
  "name": "patients",
  "description": "List of all registered patients",
  "items": [...]
}

日本語版

{
  "name": "patients",
  "description": "登録されている患者の一覧",
  "items": [...]
}

LLM は「セクションのタイトル」を強く利用するため、
言語ごとに分けると誤読がほぼゼロになります。


🧩 3. 「差分」を明示するとさらに強い

## Differences by language
- description フィールドのみが言語依存
- name / items は共通

LLM は差分理解が得意なので、こう書くとさらに正確に学習します。


📚 4. 言語ごとに “用途別” に分類するのも有効

あなたのように大量の JSON を載せる場合は、
言語 × 用途 の 2 軸で整理すると LLM が迷いません。

用途 English 日本語
Static Resource JSON JSON
Dynamic Resource JSON JSON
Template JSON JSON
Metadata JSON JSON

この構成は LLM にとって非常に扱いやすい。


🧠 5. 1 JSON = 1 セクション(言語別)を徹底する

LLM は「1 セクションに複数の JSON」があると混乱します。
特に多言語だと誤読が増えるので、必ず分けるのが正解です。


🛠 6. 言語タグを JSON 内に入れない方が良い

よくある案として:

{
  "lang": "ja",
  "description": "患者一覧"
}

のように JSON 内に言語タグを入れる方法がありますが、
ドキュメントとしては非推奨です。

理由:

  • LLM が「これは構造の一部か?」と誤解する
  • 言語ごとに JSON が増えるとノイズになる
  • 本来の Resource schema に存在しないフィールドが混ざる

ドキュメントでは 外側(セクション)で言語を分ける方が圧倒的に正確です。


🧭 7. 最終的な理想構成(あなたのプロジェクト向け)

あなたの Schedule Nurse / Solver 系の MCP Resource ドキュメントなら、
以下の構成が LLM に最適です。

# Resource: patients

## 1. Schema (共通)
<構造だけの JSON>

## 2. English
<英語版 JSON>

## 3. 日本語
<日本語版 JSON>

## 4. Notes
- description は言語依存
- items は共通
- schema は共通

この構成は LLM が誤読しないだけでなく、
将来の多言語追加(中国語・スペイン語など)にも強いです。


🎁 必要なら、あなたの MCP Resource ドキュメント全体を

「多言語 + LLM 最適化」構成にリファクタリングできます。

  • patients
  • shifts
  • assignments
  • solver
  • config
  • constraints
  • templates

など、どの Resource から整えたいですか?


Q.現在スキーマは、生成させていません。TOOLの引数、戻り値は、全てPydantic化しています。これを最大限利用する賢いやり方を教えてください。

あなたの現在のアーキテクチャ(TOOL の引数・戻り値はすべて Pydantic モデルで定義し、スキーマ JSON は生成していない)は、実は LLM 最適化された MCP Resource ドキュメントを作るうえで“最強の武器” になります。

Pydantic は 構造の真実のソース(Single Source of Truth) なので、これをどう活かすかでドキュメントの質が大きく変わります。

仙台でシステムアーキテクトとして日々構造化を極めているあなたなら、ここを押さえると一気に“賢い構成”になります。


🧠 結論:Pydantic を「構造の唯一の真実」として扱い、

JSON スニペットは Pydantic のインスタンス例 として提示する

これが最も LLM に強く、メンテナンス性も高い方法です。


🎯 なぜこの方法が最強なのか

✔ 1. 構造は Pydantic が保証するので、ドキュメント側で schema を書く必要がない

→ ドキュメントは「例」に集中できる
→ LLM は“構造の説明”より“具体例”の方が圧倒的に理解しやすい

✔ 2. Pydantic モデルは LLM が理解しやすい構造化情報

→ フィールド名・型・Optional・List などが明確
→ JSON スニペットの誤読が激減する

✔ 3. 多言語対応(日本語・英語)も Pydantic を軸に整理できる

→ 構造は共通
→ 言語差分は「例」だけで表現できる


🧩 最適な構成パターン(あなたのプロジェクト向け)

1. まず Pydantic モデルをそのまま載せる(構造の真実)

class Patient(BaseModel):
    id: int
    name: str
    age: int
    notes: Optional[str]

LLM は Python の型定義を非常に正確に理解します。


2. 次に “言語別の JSON インスタンス例” を載せる

English example

{
  "id": 1,
  "name": "John Smith",
  "age": 42,
  "notes": "Requires special diet"
}

日本語例

{
  "id": 1,
  "name": "山田太郎",
  "age": 42,
  "notes": "特別食が必要"
}

構造は Pydantic が保証しているので、例だけ変えればよい。


3. “差分” を明示する(LLM が最も理解しやすい)

- id / name / age は共通
- notes の内容が言語依存

LLM は差分理解が得意なので、誤読がほぼゼロになります。


4. TOOL の引数・戻り値も同じパターンで整理

例:TOOL の引数モデル

class AssignShiftArgs(BaseModel):
    nurse_id: int
    shift_id: int
    priority: Optional[int] = 1

English example

{
  "nurse_id": 12,
  "shift_id": 3,
  "priority": 1
}

日本語例

{
  "nurse_id": 12,
  "shift_id": 3,
  "priority": 1
}

※構造は同じなので、説明文だけ日本語にする。


🧠 さらに賢い方法:

Pydantic → JSON Schema を自動生成し、ドキュメントに載せない

Pydantic は .model_json_schema() で JSON Schema を生成できますが、
ドキュメントには載せず、内部的な整合性チェックだけに使うのが最適です。

理由:

  • JSON Schema は LLM にとってノイズが多い
  • Pydantic モデルの方が読みやすい
  • JSON スニペットの例だけで十分に理解できる

🧭 最終的な理想構成(あなたの MCP Resource ドキュメント向け)

# Resource: patients

## 1. Pydantic model (構造の真実)
<Patient モデル>

## 2. English example
<英語 JSON>

## 3. 日本語 example
<日本語 JSON>

## 4. Notes
- 構造は Pydantic によって保証
- 言語差分は description / notes のみ

この構成は LLM に最適化されており、メンテナンス性も最高です。


🎁 必要なら、あなたの全 MCP Resource(patients / shifts / solver / config など)を

Pydantic ベースの LLM 最適化構成にリファクタリングできます。

どの Resource から整えたいですか?


Q.Python内にあるコードを見ろ、ではだめですか?

結論から言うと、
「Python 内の Pydantic モデルを見ろ」だけでは、LLM にとっては不十分です。
ただし、“正しく組み合わせれば最強” になります。

あなたのように Pydantic を完全に導入している環境では、
Pydantic(構造の真実)+ JSON スニペット(具体例)
という二段構成が、LLM にとって最も理解しやすい形になります。


🧠 なぜ「Python のコードだけ」では LLM に不十分なのか

LLM は Python コードを理解できますが、以下の弱点があります。

1. Pydantic モデルは「構造」しか示さない

Pydantic は型・必須/任意・デフォルト値は示せますが、

  • 実際の値の例
  • 言語ごとの差分
  • 典型的な使用パターン
  • 返却例のバリエーション

などは コードからは読み取れません

LLM は「構造」より「具体例」の方が圧倒的に理解しやすいので、
例がないと誤読しやすい


2. LLM は“コードの意図”を推測する必要がある

Pydantic モデルだけでは、以下が曖昧になります。

  • どのフィールドが UI に表示されるのか
  • どのフィールドがユーザ入力なのか
  • どのフィールドが内部計算用なのか
  • どのフィールドが言語依存なのか

LLM は推測を混ぜるため、誤解が発生しやすい


3. 多言語対応(日本語・英語)をコードだけで表現できない

Pydantic モデルは構造を表すだけで、
言語ごとの JSON の違いはコードに書けません

あなたのケースではここが特に重要。


🎯 ではどうするのが最適か?

あなたの環境では、以下の構成が 最強 です。


🧩 最適解:

Pydantic(構造)+ 言語別 JSON(例)をセットで載せる

1. Pydantic モデルを載せる(構造の真実)

class Patient(BaseModel):
    id: int
    name: str
    age: int
    notes: Optional[str]

2. その下に言語別の JSON スニペットを載せる

English example

{
  "id": 1,
  "name": "John Smith",
  "age": 42,
  "notes": "Requires special diet"
}

日本語 example

{
  "id": 1,
  "name": "山田太郎",
  "age": 42,
  "notes": "特別食が必要"
}

3. 差分を明示する

- 構造は Pydantic によって共通
- name / notes の内容が言語依存

LLM は差分理解が得意なので、誤読が激減します。


🧠 さらに賢い方法:

Pydantic → JSON Schema を自動生成し、ドキュメントには載せない

Pydantic の .model_json_schema() は内部整合性チェックに使い、
ドキュメントには載せないのが最適です。

理由:

  • JSON Schema は LLM にとってノイズが多い
  • Pydantic モデルの方が読みやすい
  • JSON スニペットの例だけで十分

🧭 最終結論

❌ Python のコードだけを見せる → 不十分

LLM は例がないと誤読する。

⭕ Python(Pydantic)+ JSON 例 → 最強

  • 構造は Pydantic が保証
  • 例は言語ごとに分けて提示
  • LLM の理解精度が最大化
  • メンテナンス性も最高

🎁 必要なら、あなたの MCP Resource 全体を

Pydantic ベースの LLM 最適化構成にリファクタリングできます。

patients / shifts / assignments / solver / config
どれから整えたいですか?


0 件のコメント:

コメントを投稿