0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ハーネスエンジニアリングを始める前に】gpt-oss:20b の入出力データから、LLMの動作を理解する

0
Posted at

herness2.png

1.はじめに

最近は、CursorAntigravity などのAIエージェント前提の統合開発環境や、Claude Code DesktopCodex アプリ などのPC上のオブジェクト操作が可能なデスクトップアプリ、 Open Claw といったPC全体の操作をリモートで任せてしまうようなソフトウェアなどがどんどん登場しています。

これらのソフトウェアすべてが、LLM (大規模言語モデル)をAPI経由で使用しています。CursorやAntigravity、Claude DesktopやCodex アプリ、Gemini のWeb UINotebookLMDifyn8nDevin 、OpenClaw、Claw EmpireAnima Works などのソフトウェア自体にはAIが搭載されておらず、LLM APIの デコレーター として複雑な機能を補填しています。こういったソフトウェアを”ハーネス"と呼ぶ記事が増えてきています。

ハーネスは、LLMの入出力を補完するためのソフトウェアであり、LLMが理解できる形式で入力を提供し、LLMからの出力を適切に処理してユーザに返す役割を果たしています。これらのハーネスは、LLMがより効果的に機能するための重要な要素となっています。ハーネスは用途に応じて様々な実装が存在しています。AnthropicやOpenAI、Googleは、ハーネスに"長期記憶"や"ツール使用"、"マルチモーダル入力"などの機能を提供することで、LLMの能力を拡張しています。

特に最近はハーネスの進化がすすんでおり、様々な機能(RAG(Retrieval-Augmented Generation:知識補填)、ツール利用(プログラム実行結果の活用)、マルチモーダル入力、コンテキスト (Webアプリのセッションみたいなもの)など)が提供されるようになっています。これらの機能は、LLMがより複雑なタスクを処理できるようにするためのものであり、ユーザがLLMをより効果的に活用できるようにするためのものです。

どんどん新しいものが登場するため、ハーネスの中身を学習する場合は、なかなか大変です。そこでユーザからのハーネスへの入出力ではなく、ハーネスからLLMへの入出力を実際に見ることで、ハーネスではどんなことをしているのかを理解することができます。

2. サンプルの前提

  • LLM:gpt-oss:20b 、OpenAI社が提供しているオープンモデル、gpt-4.1-mini相当の能力があるといわれている
  • ハーネス:search、open、findという関数をもつbrowserツールが使える状態、RAGなし
  • 質問文「ホルムズ海峡の最新状況をおしえて」

3.ハーネスとLLMの入出力例

3.1ハーネス→LLM 1回目の入力

<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.
Knowledge cutoff: 2024-06
Current date: 2026-04-08

Reasoning: high

# Tools

## browser
// Tool for browsing.
// The `cursor` appears in brackets before each browsing display: `[{cursor}]`.
// Cite information from the tool using the following format:
// `〖{cursor}†L{line_start}(-L{line_end})?〗`
namespace browser {
// Searches for information related to `query` and displays `topn` results.
type search = (_: {
query: string,
topn?: number,
source?: string,
}) => any;

// Opens the link `id` from the page indicated by `cursor`.
type open = (_: {
id?: number | string,
cursor?: number,
loc?: number,
num_lines?: number,
view_source?: boolean,
source?: string,
}) => any;

// Finds exact matches of `pattern` in the current page, or the page given by `cursor`.
type find = (_: {
pattern: string,
cursor?: number,
}) => any;

} // namespace browser

# Valid channels: analysis, commentary, final. Channel must be included for every message.<|end|>
<|start|>developer<|message|># Instructions

- User requests about "latest" or "recent" information must be verified with browser.
- Prefer reputable, up-to-date sources.
- Summarize the situation in Japanese.
- Include concrete dates when useful.
- Keep the final answer concise but informative.<|end|>
<|start|>user<|message|>ホルムズ海峡の最新情報をまとめて報告して<|end|>
<|start|>assistant

<|start|><|message|>などのタグのような文字列は、ハーネスがLLMに入力する際のフォーマットで定められた予約済みのトークンを示しています。これらのトークンは、LLMがどのような情報を受け取っているかを理解するためのものです。トークンの文字列は各モデルで似通っていますが、厳密には統一されていません。各モデルはそれぞれが定義した予約済みトークンをつけた文字列で学習させているのです。LLMはこれらの予約済みトークン付きの入力を受け取り、返事にも同様にトークンをつけて返します。

(今のところ)予約済みトークンの標準がないのは、おそらく原文をトークンに変換するトークナイザを各社で勝手に作ってしまったことが原因でないかな..と思います。モデルはトークンという複数文字単位を1つのトークンとして扱います。そのときの変換するプログラムがトークナイザなのですが、各言語で扱う文字記号がことなったり英語のように単語区切りが明確だったり、日本語のように単語区切りがあいまいだったりするため、各社が独自のトークナイザを作ってしまったのではないかと推測しています。そしてトークナイザの仕様によってモデル性能の差がでるのではないかという研究もつづいているため、落ち着く様子がなさそうです。
そしてオープンモデルを各社連携なしにだしてしまったことも足並みを乱れさせてしまったかな..と。予約済みトークンの種類もいくつか存在します。最初に出てきたのは旧Facebookのllamaのもので、<s></s>[INST]<<SYS>>などが含まれています。今回の例でも使っているOpenAI系は、<|start|><|end|>などのトークンを使っています。Googleは、[START][END]などのトークンを使っています。これらの各社が共同研究したなら、予約済みトークンの標準もできて、ハーネスエンジニアリングもやりやすくなったのかもしれません。

<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.は、いわゆる SYSTEMメッセージ というもので、ハーネス側から与えられます。SYSTEMメッセージは毎回の入力テキストの冒頭に入るもので、LLMに対して「あなたはこういう存在である」ということを伝えるためのものです。LLMはこのSYSTEMメッセージを受け取ることで、自分がどのような役割を果たすべきかを理解します。Difyやn8nの研修などでSYSTEMメッセージはとても重要と説明されているのはこのためです。

Difyなどの独自ワークフローを作成できるツールでSYSTEMメッセージを設定する場合、長々とテキストを書き入れてしまうと、コンテキストウィンドウをたちまち食いつぶしてしまいます。SYSTEMメッセージは、Keep it Simple, Stupid (KISS)の原則に従って、できるだけ簡潔に書くようにしましょう。

Reasoning: highは、gpt-oss:20b固有のトークンで、LLMに対して「今回は高度な推論が必要なタスクである」ということを伝えるためのものです。gpt-oss:20bでは、Reasoning に指定されたレベルに応じて、試行モードの深さを調節しています。Reasoning: lowであれば、LLMは浅い試行モードで動作し、Reasoning: highであれば、LLMは深い試行モードで動作します。Reasoningのレベルを指定することで、LLMがタスクに対してどの程度の推論を行うべきかを制御することができます。そういう動作を gpt-oss:20b トレーニング時にLLMが学習されているのです。

# Tools以降は、ハーネスがLLMに対して「あなたはこういうツールを使うことができますよ」と伝えるためのものです。ここでは、browserというツールが使えることが示されています。browserツールにはsearch、open、findという関数が定義されており、LLMはこれらの関数を呼び出すことでブラウザ操作を行うことができます。注意すべきは、コメントで仕様を文章で定義しているところです。コメントは簡潔かつ不明瞭な動作にならないような記述にしておく必要があります。

こういった定義はハーネス側の処理で書き込まれます。ハーネスにビルトインされたツールは、ユーザが変更することは(おそらく)できないですが、独自ツールをハーネスに対して指定する場合は、SYSTEMメッセージ同様注意して設定してください。

LLM自体にはツールを実行する機能がありません。これはハーネス側でどのようなツールが使える状態であるかを示しており、MCP(Multi-Channel Processing) ツールもこのツール機能の一種です。このためMCPツールやハーネス自体の持つツールの数が増えると、入力テキスト長がどんどんながくなります。こういったツール爆発の対策として、スキルという機能をハーネスに持たせることが一般的になりつつあります。

<|start|>user<|message|>ホルムズ海峡の最新情報をまとめて報告して<|end|>は、ユーザからの入力を示しています。LLMはこの指示を受け取ることで、ハーネスが提供するツールを使ってホルムズ海峡の最新情報を収集し、それをまとめて報告するタスクを実行することになります。

<|start|>assistantでとまっており、<|end|>がないのは、LLM自体が文章の続きを予測して出力するだけのAPIであるということを示しています。GeminiやOpenAI、Claudeをつかっていると、あたかも対話しているように見えますが、誰がどういうメッセージを発しているかという形式でLLMを学習させることで、回答文を返答させているにすぎないのです。

3.2 LLM→ハーネス 1回目の出力

<|channel|>analysis<|message|>ユーザは「最新情報」を求めている。ホルムズ海峡は地政学・海運・エネルギー市場に関わるため、知識カットオフ後の情報確認が必要。まずニュース検索で直近の主要論点と日付を把握する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.search <|constrain|>json<|message|>{"query":"Hormuz Strait latest news shipping security oil April 2026","topn":5,"source":"web"}<|call|>

入力の末尾では<|start|>assistantとなっていたので<|message|>から始まるはずなのですが、<|channel|>analysisになっています。これは、いわゆる思考中のメッセージを出力していることを表していて、<|channel|>analysisから<|end|>までが思考している内容を表していることを指しています。assistantの出力がこのテキストにないのは、まだLLMが思考を継続していて、正式な返答をまだ返していない状態であることを示しています。

LLMは応答テキストを生成していくうちに、ニュース検索をまずすべきという文章を出力し、次にハーネス側がもっているツールのうち、browserツールのsearch関数を呼び出すべきだと判断しています。LLMは、ハーネス側が提供するツールを呼び出すためのフォーマットである<|start|>assistant<|channel|>analysis to=browser.search <|constrain|>json<|message|>{...}<|call|>という形式で出力することで、ハーネス側に「私は今からこのツールを呼び出しますよ」ということを伝えています。

この返事を受け取ったハーネスは、テキスト内に、ツール実行指示があると判断し、browser.search関数を呼び出すための引数をJSON形式で抜き取ります。そして、ハーネス側でbrowser.search関数を呼び出し、ブラウザ操作を行います。

3.3 ハーネス→LLM 2回目の入力

<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.
Knowledge cutoff: 2024-06
Current date: 2026-04-08

Reasoning: high

# Tools

## browser
// Tool for browsing.
namespace browser {
type search = (_: {
query: string,
topn?: number,
source?: string,
}) => any;

type open = (_: {
id?: number | string,
cursor?: number,
loc?: number,
num_lines?: number,
view_source?: boolean,
source?: string,
}) => any;

type find = (_: {
pattern: string,
cursor?: number,
}) => any;

} // namespace browser

# Valid channels: analysis, commentary, final. Channel must be included for every message.<|end|>
<|start|>developer<|message|># Instructions

- User requests about "latest" or "recent" information must be verified with browser.
- Prefer reputable, up-to-date sources.
- Summarize the situation in Japanese.
- Include concrete dates when useful.
- Keep the final answer concise but informative.<|end|>
<|start|>user<|message|>ホルムズ海峡の最新情報をまとめて報告して<|end|>
<|start|>assistant<|channel|>analysis<|message|>ユーザは「最新情報」を求めている。ホルムズ海峡は地政学・海運・エネルギー市場に関わるため、知識カットオフ後の情報確認が必要。まずニュース検索で直近の主要論点と日付を把握する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.search <|constrain|>json<|message|>{"query":"Hormuz Strait latest news shipping security oil April 2026","topn":5,"source":"web"}<|call|>
<|start|>browser.search to=assistant<|channel|>analysis<|message|>[0] Reuters — Apr 7, 2026 — Insurers raise watch level for Gulf shipping after regional tensions flare.
[1] AP News — Apr 7, 2026 — U.S. Navy says commercial traffic continues, but alerts remain elevated near the Strait of Hormuz.
[2] UKMTO advisory — Apr 6, 2026 — Merchant vessels advised to maintain heightened vigilance in the Gulf, Gulf of Oman, and Strait of Hormuz.
[3] Lloyd's List — Apr 7, 2026 — Tanker operators review routing risk premiums.
[4] Bloomberg — Apr 7, 2026 — Oil markets react to renewed Hormuz transit concerns.<|end|>
<|start|>assistant

2回目の対話なのに<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.からはじまっています。これはLLM APIは、ステートレスであり、過去の会話を覚えていないため、毎回の入力にSYSTEMメッセージからつける必要があるためです。ツールの説明も前回と同様につけていますが、当然LLM側は忘れてしまっているので、ハーネスは毎回の入力にツールの説明もつける必要があるわけです。

<|start|>user<|message|>ホルムズ海峡の最新情報をまとめて報告して<|end|> と最初の質問文がそのまま今回の入力テキストに入っているのも、LLMがステートレスだからです。

ユーザとハーネスの対話を長く続けると、回答精度が落ちる理由は、このように過去の対話内容を含めた入力テキストを毎回送るため、テキスト(トークン)量がスウェーデンリレー走者の距離のようにどんどん長くなっていくからです。最新のハーネスでは、要約したテキストに圧縮して入力テキストに送るなどの工夫がされています(要約するLLMとの応対が1回以上行われる)が、対話が長くなればなるほど、LLMにとっては過去の対話内容を理解することが難しくなっていきます。

<|start|>browser.search to=assistant<|channel|>analysis<|message|>[0] Reuters.. は、ハーネスがツール実行した結果をLLMに伝達するために入力テキストに添付されて送られます。RAGを使う場合も、このようにRAGで得られたチャンクテキストを入力テキストにつけて送信しているので、あたかも最新知識を知っているかのように動作します。

3.4 LLM→ハーネス 2回目の出力

<|channel|>analysis<|message|>主要論点は、1) 通航自体は継続、2) 警戒水準上昇、3) 保険料・原油市場への影響。Reuters と UKMTO を開いて、封鎖の有無と警戒勧告の文言を確認する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{"cursor":0,"id":0,"loc":1,"num_lines":80,"source":"web"}<|call|>

<|channel|>analysisから<|end|>までのテキストなので、2回目の出力内にもまだ最終回等がなく、まだハーネスとの対話が必要であることがわかります。

前回の検索結果を受け取った内容をもとに続きの文章を出力しています。LLMは、<|channel|>analysis<|message|>主要論点は、1) 通航自体は継続、2) 警戒水準上昇、3) 保険料・原油市場への影響。Reuters と UKMTO を開いて、封鎖の有無と警戒勧告の文言を確認する。<|end|>にあるとおりロイターとUKMTO(?)の記事検索が必要と判断したようです。LLMは、ハーネス側が提供するツールのうち、browserツールのopen関数を呼び出すべきだと判断しています。LLMは、ハーネス側が提供するツールを呼び出すためのフォーマットである<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{...}<|call|>という形式で出力することで、ハーネス側に「私は今からこのツールを呼び出しますよ」ということを伝えています。

ここではLLMが検索対象を指定していますが、あくまで一例です。ハーネス側の提供するツールに検索対象を任せる場合もあります。検索対象をツール内で制限するという方法もあります。提供ツール自体をPerplexity SearchTavily AI Search などの検索ツールをMCP指定すると、ツール側の実装に依存することになります。

ハーネスはこの内容からツール実行に必要な情報を抜き取り、実行します。この場合は、ブラウザで検索結果の一番目のリンクを開くという操作になります。ブラウザでリンクを開いた後の内容は、次の入力テキストでLLMに伝えられます。

3.5 ハーネス→LLM 3回目の入力

<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.
Knowledge cutoff: 2024-06
Current date: 2026-04-08

Reasoning: high

# Tools

## browser
namespace browser {
type search = (_: {
query: string,
topn?: number,
source?: string,
}) => any;

type open = (_: {
id?: number | string,
cursor?: number,
loc?: number,
num_lines?: number,
view_source?: boolean,
source?: string,
}) => any;

type find = (_: {
pattern: string,
cursor?: number,
}) => any;

} // namespace browser

# Valid channels: analysis, commentary, final. Channel must be included for every message.<|end|>
<|start|>developer<|message|># Instructions

- User requests about "latest" or "recent" information must be verified with browser.
- Prefer reputable, up-to-date sources.
- Summarize the situation in Japanese.
- Include concrete dates when useful.
- Keep the final answer concise but informative.<|end|>
<|start|>user<|message|>ホルムズ海峡の最新情報をまとめて報告して<|end|>
<|start|>assistant<|channel|>analysis<|message|>ユーザは「最新情報」を求めている。ホルムズ海峡は地政学・海運・エネルギー市場に関わるため、知識カットオフ後の情報確認が必要。まずニュース検索で直近の主要論点と日付を把握する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.search <|constrain|>json<|message|>{"query":"Hormuz Strait latest news shipping security oil April 2026","topn":5,"source":"web"}<|call|>
<|start|>browser.search to=assistant<|channel|>analysis<|message|>[0] Reuters — Apr 7, 2026 — Insurers raise watch level for Gulf shipping after regional tensions flare.
[1] AP News — Apr 7, 2026 — U.S. Navy says commercial traffic continues, but alerts remain elevated near the Strait of Hormuz.
[2] UKMTO advisory — Apr 6, 2026 — Merchant vessels advised to maintain heightened vigilance in the Gulf, Gulf of Oman, and Strait of Hormuz.
[3] Lloyd's List — Apr 7, 2026 — Tanker operators review routing risk premiums.
[4] Bloomberg — Apr 7, 2026 — Oil markets react to renewed Hormuz transit concerns.<|end|>
<|start|>assistant<|channel|>analysis<|message|>主要論点は、1) 通航自体は継続、2) 警戒水準上昇、3) 保険料・原油市場への影響。Reuters と UKMTO を開いて、封鎖の有無と警戒勧告の文言を確認する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{"cursor":0,"id":0,"loc":1,"num_lines":80,"source":"web"}<|call|>
<|start|>browser.open to=assistant<|channel|>analysis<|message|>[1] Reuters
L1: Apr 7, 2026
L2: Insurers raised watch levels for Gulf shipping after regional tensions intensified.
L3: Commercial vessel traffic through the Strait of Hormuz continued on Tuesday.
L4: No authority announced a formal closure of the waterway.
L5: Analysts said risk premiums for tankers and some cargoes could rise if tensions persist.
L6: Energy traders monitored the situation for possible supply disruption concerns.<|end|>
<|start|>assistant

3回めの対話なので、過去2回のやりとりが入力テキストを占めるようになってきました。LLMは、ブラウザで開いた記事の内容を受け取ると、記事の内容をもとに次の文章を出力しています。LLMは、<|channel|>analysis<|message|>主要論点は、1) 通航自体は継続、2) 警戒水準上昇、3) 保険料・原油市場への影響。Reuters と UKMTO を開いて、封鎖の有無と警戒勧告の文言を確認する。<|end|>にあるとおりロイターの記事から主要論点を抽出し、次にUKMTOの記事も開いて内容を確認する必要があると判断したようです。LLMは、ハーネス側が提供するツールのうち、browserツールのopen関数を呼び出すべきだと判断しています。LLMは、ハーネス側が提供するツールを呼び出すためのフォーマットである<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{...}<|call|>という形式で出力することで、ハーネス側に「私は今からこのツールを呼び出しますよ」ということを伝えています。

ハーネスは前回同様この内容からツール実行に必要な情報を抜き取り、実行します。この場合は、ブラウザで検索結果の二番目のリンクを開くという操作になります。ブラウザでリンクを開いた後の内容は、次の入力テキストでLLMに伝えられます。

3.6 LLM→ハーネス 3回目の出力

<|channel|>analysis<|message|>Reuters で「通航継続」と「正式封鎖なし」を確認。次に UKMTO で船舶向け警戒勧告の範囲を確認する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{"cursor":0,"id":2,"loc":1,"num_lines":80,"source":"web"}<|call|>

この出力もまだ最終回答が含まれていません。

LLMは、ブラウザで開いた記事の内容を受け取ると、記事の内容をもとに次の文章を出力しています。LLMは、<|channel|>analysis<|message|>Reuters で「通航継続」と「正式封鎖なし」を確認。次に UKMTO で船舶向け警戒勧告の範囲を確認する。<|end|>にあるとおりロイターの記事から「通航継続」と「正式封鎖なし」を確認し、次にUKMTOの記事も開いて内容を確認する必要があると判断したようです。LLMは、ハーネス側が提供するツールのうち、browserツールのopen関数を呼び出すべきだと判断しています。

ハーネスは、指示通りツールを実行します。

3.7 ハーネス→LLM 4回目の入力

<|start|>system<|message|>You are ChatGPT, a large language model trained by OpenAI.
Knowledge cutoff: 2024-06
Current date: 2026-04-08

Reasoning: high

# Tools

## browser
namespace browser {
type search = (_: {
query: string,
topn?: number,
source?: string,
}) => any;

type open = (_: {
id?: number | string,
cursor?: number,
loc?: number,
num_lines?: number,
view_source?: boolean,
source?: string,
}) => any;

type find = (_: {
pattern: string,
cursor?: number,
}) => any;

} // namespace browser

# Valid channels: analysis, commentary, final. Channel must be included for every message.<|end|>
<|start|>developer<|message|># Instructions

- User requests about "latest" or "recent" information must be verified with browser.
- Prefer reputable, up-to-date sources.
- Summarize the situation in Japanese.
- Include concrete dates when useful.
- Keep the final answer concise but informative.<|end|>
<|start|>user<|message|>ホルムズ海峡の最新情報をまとめて報告して<|end|>
<|start|>assistant<|channel|>analysis<|message|>ユーザは「最新情報」を求めている。ホルムズ海峡は地政学・海運・エネルギー市場に関わるため、知識カットオフ後の情報確認が必要。まずニュース検索で直近の主要論点と日付を把握する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.search <|constrain|>json<|message|>{"query":"Hormuz Strait latest news shipping security oil April 2026","topn":5,"source":"web"}<|call|>
<|start|>browser.search to=assistant<|channel|>analysis<|message|>[0] Reuters — Apr 7, 2026 — Insurers raise watch level for Gulf shipping after regional tensions flare.
[1] AP News — Apr 7, 2026 — U.S. Navy says commercial traffic continues, but alerts remain elevated near the Strait of Hormuz.
[2] UKMTO advisory — Apr 6, 2026 — Merchant vessels advised to maintain heightened vigilance in the Gulf, Gulf of Oman, and Strait of Hormuz.
[3] Lloyd's List — Apr 7, 2026 — Tanker operators review routing risk premiums.
[4] Bloomberg — Apr 7, 2026 — Oil markets react to renewed Hormuz transit concerns.<|end|>
<|start|>assistant<|channel|>analysis<|message|>主要論点は、1) 通航自体は継続、2) 警戒水準上昇、3) 保険料・原油市場への影響。Reuters と UKMTO を開いて、封鎖の有無と警戒勧告の文言を確認する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{"cursor":0,"id":0,"loc":1,"num_lines":80,"source":"web"}<|call|>
<|start|>browser.open to=assistant<|channel|>analysis<|message|>[1] Reuters
L1: Apr 7, 2026
L2: Insurers raised watch levels for Gulf shipping after regional tensions intensified.
L3: Commercial vessel traffic through the Strait of Hormuz continued on Tuesday.
L4: No authority announced a formal closure of the waterway.
L5: Analysts said risk premiums for tankers and some cargoes could rise if tensions persist.
L6: Energy traders monitored the situation for possible supply disruption concerns.<|end|>
<|start|>assistant<|channel|>analysis<|message|>Reuters で「通航継続」と「正式封鎖なし」を確認。次に UKMTO で船舶向け警戒勧告の範囲を確認する。<|end|>
<|start|>assistant<|channel|>analysis to=browser.open <|constrain|>json<|message|>{"cursor":0,"id":2,"loc":1,"num_lines":80,"source":"web"}<|call|>
<|start|>browser.open to=assistant<|channel|>analysis<|message|>[2] UKMTO advisory
L1: Apr 6, 2026
L2: Merchant vessels are advised to maintain heightened vigilance.
L3: The advisory applies to the Gulf, Gulf of Oman, and Strait of Hormuz.
L4: Ships should review security measures and report suspicious activity.
L5: Operators are encouraged to monitor official updates continuously.<|end|>
<|start|>assistant

ハーネスは、過去の対話履歴+ツール実行結果をつけてLLMに送信します。

3.8 LLM→ハーネス 4回目の出力(最終回答)

<|channel|>analysis<|message|>十分。ユーザは要約報告を求めているので、日本語で、最新時点の要点、封鎖有無、海運・エネルギー市場への影響を短く整理して返す。Reuters と UKMTO を引用する。<|end|>
<|start|>assistant<|channel|>final<|message|>ホルムズ海峡の最新状況を要約します。

- 2026年4月7日時点の報道では、周辺の緊張上昇を受けて海運保険やリスク監視が強化されています。〖1†L1-L5〗
- ただし、少なくともこの時点で**海峡の正式封鎖が発表されたわけではなく、商船の通航自体は継続**しています。〖1†L3-L4〗
- 一方で、UKMTO は 2026年4月6日付で、**ペルシャ湾・オマーン湾・ホルムズ海峡を航行する船舶に高度な警戒維持**を勧告しています。〖2†L1-L5〗
- 実務上の含意としては、直近の焦点は「通航停止そのもの」よりも、**警戒レベル上昇、保険料・リスクプレミアム上振れ、原油輸送不安による市場反応**です。〖1†L5-L6〗

要するに、最新公開情報ベースでは「全面封鎖」ではなく、**通航は続いているが安全保障リスクが高まっている局面**として捉えるのが妥当です。<|return|>

<|channel|>analysis<|message|>十分。ユーザは要約報告を求めているので、日本語で、最新時点の要点、封鎖有無、海運・エネルギー市場への影響を短く整理して返す。Reuters と UKMTO を引用する。<|end|>の直後に<|start|>assistant<|channel|>finalと出力されています。ようやくassistantとして最終回答を行うことを示しています。

この出力メッセージは<|return|>で終わっています。これもgpt-oss:20b固有の湯役済みトークンのひとつで、LLMに対して「これが回答のおわりである」ということを伝えるためのものです。ハーネス側はこのトークンを受け取ると、LLMからの回答が完了したと判断し、ユーザに返すなどの次の処理に移ります。

ハーネスは、この最終回等からユーザに渡すべきメッセージを切り取ってユーザに返します。ユーザはこの最終回答を受け取ることで、ホルムズ海峡の最新状況を把握することができます。

ホルムズ海峡の最新状況を要約します。

- 2026年4月7日時点の報道では、周辺の緊張上昇を受けて海運保険やリスク監視が強化されています。〖1†L1-L5〗
- ただし、少なくともこの時点で**海峡の正式封鎖が発表されたわけではなく、商船の通航自体は継続**しています。〖1†L3-L4〗
- 一方で、UKMTO は 2026年4月6日付で、**ペルシャ湾・オマーン湾・ホルムズ海峡を航行する船舶に高度な警戒維持**を勧告しています。〖2†L1-L5〗
- 実務上の含意としては、直近の焦点は「通航停止そのもの」よりも、**警戒レベル上昇、保険料・リスクプレミアム上振れ、原油輸送不安による市場反応**です。〖1†L5-L6〗

要するに、最新公開情報ベースでは「全面封鎖」ではなく、**通航は続いているが安全保障リスクが高まっている局面**として捉えるのが妥当です。

ユーザの回答に検索元リンクをつけたりする化粧はハーネス側で行っています。このように、ハーネスはLLMの入出力を補完するためのソフトウェアであり、LLMが理解できる形式で入力を提供し、LLMからの出力を適切に処理してユーザに返す役割を果たしています。これらのハーネスは、LLMがより効果的に機能するための重要な要素となっています。

4. まとめ

LLM APIの基本機能は Sequence 2 Sequence の時代のAPIと基本変わっていません。入力テキストの続きを返すだけの関数です。過去の記憶保持機能もありません。

ハーネスはWebアプリケーションサーバ+Webアプリケーションフレームワークのようなものです。
LLM APIの世界にはHttpSessionはないので、過去の応対文まるまるを送る、いわゆるhiddenタグ内に過去のログぜんぶほうりこんでいる旧世代のWebアプリのようなつくりをしています。

スキル 機能は、入力テキストのサイズをできるだけ減らすために、ハーネス内でどのツール情報を送るべきかを判断しています(もちろんこの判断にSkill.mdの内容をLLMに送って、使うかどうかを判断させる通信が1回以上はいってます)。スキル機能がないと、ツールの数が増えるたびに入力テキストがどんどん長くなっていきます。スキル機能は、LLMに対して「今回はこのツールだけ使えるようにしてください」と伝えるためのものです。

最近危険視されているOpenClawは、(メンテナーによる安全・危険の判断をしていない)たくさんのスキルをサポートしています。しかしOpenAI社はOpenClaw開発者を引き抜きました。
OpenClawには、長期記憶を保持させる機能をハーネスとして持たせているためです。といって、複雑な手段を講じているわけではありません。我々がGitHub Copilotを使っているときに、対話内容とか毎日の作業ログとかを指示して書かせている人はいるとおもいますが、その作業をハーネス内で実行しているのです。

オープンモデル系LLMのファインチューニングを行う場合、ハーネス海面での入出力ではなく、上記のようなLLM海面での入出力テキストを意識する必要があります。...一部ウソです、unsloth ライブラリなどファインチューニング用ライブラリの機能で、元モデル固有の予約トークンを補完するような機能をもっていることがあります。ファインチューニングする場合は、どのライブラリで行うかにより用意する学習データセットのフォーマットを変える必要があります。ファインチューニングの難易度が、ほかのAI系ソリューションとくらべて一段難易度が高い理由の一つでもあります。とにかくファインチューニングをサンプルコード以上のことをさせたい場合は、動作するハーネスが ReAct (Reasoning and Acting) でどのようなメッセージに加工しているのか、という機能要件も把握する必要があります。

5. おわりに

ここまでのLLMとのやり取りを理解すると、AIツールの直近の動きが予測できます。

まず、ハーネスはどんどん新しい機能を付加させていくでしょう。

ツール機能はとても便利だけど、トレードオフが激しい機能です。

LLMはコンテキストウィンドウ(LLMの送受信できるテキストサイズ上限のようなもの)をどんどん大きくし、かつコンテキスト内のどこにかかれた文章も情報もれなく理解できるようにしていくでしょう。

LLMの思考モードは、とても強力だけど、ハーネスの用途によっては不要になる場合もあるのでgpt-oss:20bのように、Reasoningのレベルを指定するような機能を持たせてきました。ハーネスでReasoningするかどうか、する場合はどのくらいのふかさまでやらせるかを指定できるようになったので、最近のLLMには思考モードをスイッチできるようなモデルばかりになりました。

スキルは標準になるのは、当たり前の話だと理解できます。我々は入出力テキストのサイズで従量課金されているので、過去の内容をまるまるおくっていては、ユーザが暴動起こしかねません..

OpenAIやAnthropicがなぜエージェント間の通信プロトコルを公開しているのかも、LLM同士が通信する際の入出力テキストのフォーマットを統一することで、LLM同士が互いに理解できるようにするためだと理解できます。LLM同士が互いに理解できるようなフォーマットで通信することで、LLM同士がより効果的に協力してタスクを実行できるようになります。

そして、複数エージェントを管理するハーネス、いわゆるAIオーケストレーターが少しづつでてきています。おかげでサブスク契約が爆発的に増え、自社でつくったものではないハーネスはサブスクではない従量課金にして、自社ソフトの囲い込みにはいっています。OpenClawに対してOpenAIやAnthropicがサブスク契約での接続を禁止したのもその一環です。

今回の内容から、LLMモデルをトレーニングするための学習データセットをつくることがどれだけ大変なのか、よくわかるとおもいます。だから 知識蒸留 によるオープンモデルのLLMを公開している企業に対して、OpenAI/Anthropic/Googleが抗議していることも理解できるとおもいます。そこが彼らの重要なノウハウなんだから。データを制するものが、AIを制す、ということですね。

以上です、ご参考まで。

A.注意

本記事の、サンプル記述は一部省略しているので、gpt-oss:20bの実際の入出力テキストはもうすこし複雑です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?