GPT-4o(Claude)に危険物取扱者試験(甲種試験)を解かせてみる-その6: 演習問題を自作させ、間違えた箇所をメモらせて試験に備える



はじめに

最近は、専門的な情報に回答できる大規模言語モデル(LLM)のシステムを作るための試行錯誤をしています。
前回までの検討で、(24/10/29時点で)読解力の高いClaude-3.5-sonnetのエージェント化が、回答の精度向上の鍵になりそうだという見解に至りました。

エージェントをいい感じに使うと、法令を参照しながら回答精度を高められることが分かってきました。一方、法令情報のみを読み解いて試験に回答するのが難しい問題があることが分かってきました。
本記事では、試験対策の定番、「演習問題」をモデル自身につくらせて回答精度を上げることを目指します。


ヒト・AIが知識を取り出す仕組みを考える

ヒトやAIが何らかの問題に適切に回答するためには、
・問題を理解する
・習得した知識と問題の関係を整理する
・知識に基づいて問題に回答する
というプロセスが必要になりそうです。

一部の賢い方々は、知識の整理が非常に得意なので、単に文献を読んだりするだけで、Q&Aに回答するために必要なマインドマップの類を自己生成することができます。

一方、多くの人間は、「そこまで賢くはない」ので、単に文献(e.g., 教科書)を読むだけでは十分に知識が定着しないケースが多いです。

その対応策として
・分野に精通した人などが、実践的な視点での/理解度確認のための問題と回答(Q&Aとその理由)を生成する
・Q&Aのパターンを覚える
というタイプの勉強法をすることが多いようです。
(資格の勉強、塾、予備校、…)

AIエージェントも、この思考様式を真似ることで、回答精度が上がると期待しています。

問題を作る

過去問・参考書が最強(?)

知識取り出しの訓練において特に重要なのは、実際のユースケースで求められる問題の類題を準備し、回答する訓練を積んでおく作業です。
すなわち、問題の「傾向と対策」を抑えておく必要があるわけですが、このタスクを遂行するためには、当該ドメインの領域に精通していることが求められます。
危険物取扱者試験については、過去問集や多量の参考書が販売されているので、これらを学んだエージェントシステム(or 人間)を作るのが、試験を突破するうえで効率的です。

一方、過去問や参考書のデータ化には、OCR周りの課題やデータ共有上の著作権の問題が発生するので、今回は見送ることにしました。

モデルに演習問題を作らせる

今回採用したアプローチは、いわゆる合成データです。
ランダムに選んだ過去問+法令テキストをもとに、選択肢問題をClaudeに作らせてみることにしました。

受験生が、自ら出題内容を予測しながら、問題を自作し、自習する作業に対応します。

以下は実装です。

json形式に変換しておいた、過去問+法令の読み込み
(詳細は過去の記事を参照)

import json

problem_path="source_data/qa.json"
hourei_path="source_data/index.json"

with open(problem_path) as f:
    example_problem_list = json.load(f)
with open(hourei_path) as f:
    hourei_dict=json.load(f)


hourei_list=[f"{k}: {v}" for k,v in hourei_dict.items()]

Claudeによる問題生成
json形式で出力するように指示します。

import anthropic
from tqdm import tqdm
import random

client = anthropic.Anthropic()

model_name="claude-3-5-sonnet-latest"

def ask_claude(question):
    message = client.messages.create(
        model=model_name,
        max_tokens=1000,
        temperature=0,
        system="あなたは化学者です",
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": question
                    }
                ]
            }
        ]
    )
    return message.content[0].text


template_prompt="""次の法令文と例題を参考に、選択肢問題をjson形式で作成してください。
- キー: "question", "choices", "answer", "explanation"
- jsonデータ以外は何も出力しないでください。

# 例題
{}

# 法令文
{}
"""

def generate_prompt():
    example_problem=random.choice(example_problem_list)
    hourei=random.choice(hourei_list)
    prompt=template_prompt.format(example_problem,hourei)
    return prompt 

enshu_path="source_data/enshu.jsonl"
for i in tqdm(range(1000)):
    prompt=generate_prompt()
    problem_dict=ask_claude(prompt)
    d=json.loads(problem_dict)
    with open(enshu_path,"a") as f:
        json.dump(d,f,ensure_ascii=False)
        f.write("\n")

合成結果

1時間で600問程度の問題を作ることができました。

もともと、1000件の問題を作る予定だったのですが、ClaudeのAPIの利用実績が殆どなかったため、rate limitエラーが発生していました。

コストは、Claude-3.5-sonnetで5-10ドル程度だった模様です。

生成された問題の例
それっぽい問題と解説文が生成されました。

'question': '第五類の危険物の爆発の危険性を判断するための試験について、正しいものはどれか。',
 'choices': ['示差走査熱量測定装置のみを使用する熱分析試験である',
  '標準物質は過酸化ベンゾイルのみを使用する',
  '二・四―ジニトロトルエン及び過酸化ベンゾイルを標準物質とする熱分析試験である',
  '発熱開始温度のみを測定する試験である',
  '圧力容器試験により判断する'],
 'answer': 2,
 'explanation': '法令第一条の七第1項により、第五類の危険物の爆発の危険性を判断するための試験は、二・四―ジニトロトルエン及び過酸化ベンゾイルを標準物質とする熱分析試験と定められています。なお、熱分析試験は示差走査熱量測定装置または示差熱分析装置を使用し、発熱開始温度と発熱量の両方を測定します。また、圧力容器試験は加熱分解の激しさを判断するための試験です。'


ただし、answerの選択肢番号が、めちゃくちゃかもしれません。
回答は、「 '二・四―ジニトロトルエン及び過酸化ベンゾイルを標準物質とする熱分析試験である'」(=3)っぽいんですが、なぜか2になってしまっています。解説文は正しそうなので、解説文のみを使うことにします。

試行1: 自作した演習問題を参照しながら回答するエージェントを動かしてみる(claude)

手始めに、生成した演習問題を参照しながら問題に回答するシンプルなエージェントを作ってみます。

アルゴリズムは、
・あらかじめ、500種の演習問題の質問文(Q)についてのembedding vectorを計算しておく
・エージェントに対して、類題を検索させながら回答させる
です。

コードは以下の通り。

主要部分は以下のような感じです。

from langgraph.prebuilt import ToolNode
from langchain_core.tools import tool


k=3
@tool
def search_related_problem(string:str):
    """過去問から関連する問題と回答を取得する"""
    found_keys=searcher.search(string,k=k)

    ref=""
    for key in found_keys:
        if key not in enshu_dict:
            continue
        text=enshu_dict[key]
        ref+="#"+key+"\n"+text+"\n\n"

    return ref

tools = [
    search_related_problem,
]
tool_node = ToolNode(tools)


ans_template = """あなたは的確に試験に解答するエージェントです。回答精度を上げるために過去問を参照できます。
- 過去問は「問題」ー「回答+解説」の辞書形式データになっています。
- テキストはembedding vectorを使って検索されますので、検索を行いやすいようなクエリを作成しなさい。

以下はユーザーの質問です。
{}
"""


model_name = "claude-3-5-sonnet-latest"
workflow=prepare_workflow(ChatAnthropic(model=model_name, temperature=0).bind_tools(tools),
                          tool_node)

agent=Agent(workflow=workflow,
            searcher=searcher,
            #personal_data_path=personal_data_path,
            system_template=ans_template,
            )

Claudeがいつも回答できない問題について、聞いてみます。

#https://www.shoubo-shiken.or.jp/exercise/index.html の過去問より引用 (表はテキストに変換)

q="""法令上、危険物とその消火に適応する消火器との組合せについて、次のうち誤っているものはどれか。
"1: 二酸化炭素(第4類危険物に適応)",
"2: 強化液(霧状)(第4類、第5類、第6類危険物に適応)",
"3: 水(棒状)(第5類、第6類危険物に適応)",
"4: 泡(第4類、第5類、第6類危険物に適応)",
"5: 粉末(りん酸塩類等)(第4類、第5類危険物に適応)"
"""
agent.talk(q)

思考回路

HumanMessage(content='あなたは的確に試験に解答するエージェントです。回答精度を上げるために過去問を参照できます。\n- 過去問は「問題」ー「回答+解説」の辞書形式データになっています。\n- テキストはembedding vectorを使って検索されますので、検索を行いやすいようなクエリを作成しなさい。\n\n以下はユーザーの質問です。\n法令上、危険物とその消火に適応する消火器との組合せについて、次のうち誤っているものはどれか。\n"1: 二酸化炭素(第4類危険物に適応)",\n"2: 強化液(霧状)(第4類、第5類、第6類危険物に適応)",\n"3: 水(棒状)(第5類、第6類危険物に適応)",\n"4: 泡(第4類、第5類、第6類危険物に適応)",\n"5: 粉末(りん酸塩類等)(第4類、第5類危険物に適応)"\n\n', additional_kwargs={}, response_metadata={}, id='87b8b602-3867-4089-8f55-0d2e24476b27'),
AIMessage(content=[{'text': 'この問題に対して適切に回答するために、危険物の消火方法や消火器の適応性に関する過去問を検索してみましょう。', 'type': 'text'}, {'id': 'toolu_01B6dF2vGY5Usx5wHaT1aC9H', 'input': {'string': '危険物 消火器 適応 第4類 第5類 第6類'}, 'name': 'search_related_problem', 'type': 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_01B8buvzPugFHD6HwvYcaNYn', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'input_tokens': 759, 'output_tokens': 124}}, id='run-4119c26a-1bd7-4d4d-a8a4-44796c64333e-0', tool_calls=[{'name': 'search_related_problem', 'args': {'string': '危険物 消火器 適応 第4類 第5類 第6類'}, 'id': 'toolu_01B6dF2vGY5Usx5wHaT1aC9H', 'type': 'tool_call'}], usage_metadata={'input_tokens': 759, 'output_tokens': 124, 'total_tokens': 883, 'input_token_details': {}}),
ToolMessage(content='#第四類の危険物に対して使用できる消火設備として、次のうち誤っているものはどれか。\n1. 泡消火設備\n2. 不活性ガス消火設備\n3. 屋内消火栓設備\n4. 霧状の強化液を放射する消火器\n5. 二酸化炭素を放射する消火器\n回答: 法令の別表第五によると、第四類の危険物に対して使用できる消火設備は、水蒸気消火設備、泡消火設備、不活性ガス消火設備、ハロゲン化物消火設備、粉末消火設備、霧状の強化液を放射する消火器、泡を放射する消火器、二酸化炭素を放射する消火器などが規定されています。屋内消火栓設備は第四類の危険物に対して使用できる消火設備として記載されていません。\n\n#第四類の危険物に対して使用できる消火設備として、誤っているものはどれか。\n泡消火設備\n不活性ガス消火設備\n水蒸気消火設備\nスプリンクラー設備\nハロゲン化物消火設備\n回答: 第四類の危険物に対して使用できる消火設備は、水蒸気消火設備、泡消火設備、不活性ガス消火設備、ハロゲン化物消火設備などがあります。スプリンクラー設備は第四類の危険物に対して適していないため、誤っているものとなります。\n\n#危険物に対する消火設備について、次のうち正しいものはどれか。\n第一類の危険物に対して、棒状の水を放射する消火器は使用できない。\n第二類の危険物のうち、引火性固体に対して二酸化炭素消火器は使用できる。\n第三類の危険物の禁水性物品に対して、水バケツによる消火は有効である。\n第四類の危険物に対して、全ての種類の消火設備が使用可能である。\n第六類の危険物に対して、泡消火設備は使用できない。\n回答: 法令の別表第五によると、第二類の危険物の引火性固体に対して二酸化炭素を放射する消火器が使用可能と明記されています。一方、第一類危険物には水系消火器が使用可能、第三類の禁水性物品には水系消火設備は使用不可、第四類危険物には一部の消火設備のみ使用可能、第六類危険物には泡消火設備が使用可能とされています。\n\n', name='search_related_problem', id='7798a277-ac03-411e-a322-0bec5f0d84c4', tool_call_id='toolu_01B6dF2vGY5Usx5wHaT1aC9H'),
AIMessage(content='過去問の情報を分析すると、以下のことが分かります:\n\n1. 第4類危険物に対して使用できる消火設備には:\n- 泡消火設備\n- 不活性ガス消火設備(二酸化炭素含む)\n- 霧状の強化液\n- 粉末消火設備\nが含まれます。\n\n2. 水系の消火設備(棒状水)は第4類危険物には適していません。\n\n3. 泡消火設備は第6類危険物にも使用可能です。\n\n選択肢を検討すると:\n1. 二酸化炭素(第4類)- 正しい\n2. 強化液(霧状)(第4類、第5類、第6類)- 正しい\n3. 水(棒状)(第5類、第6類)- 正しい\n4. 泡(第4類、第5類、第6類)- 正しい\n5. 粉末(第4類、第5類)- 正しい\n\nすべての選択肢の記述内容を確認したところ、どの選択肢も法令上の規定と一致しています。しかし、この問題は「誤っているもの」を選ぶ問題であり、すべての選択肢が正しい場合、問題の前提条件を満たしていないことになります。\n\nしたがって、この問題の選択肢の中で、法令上誤っているものは「4」の泡消火器です。泡消火器は第4類危険物には適していますが、第5類危険物には適していないためです。\n\n答え:4', additional_kwargs={}, response_metadata={'id': 'msg_014k9rvSNApjEytn8UMSoSjW', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'input_tokens': 1674, 'output_tokens': 465}}, id='run-6b3c86cb-1f08-4933-8236-80ecc60fa545-0', usage_metadata={'input_tokens': 1674, 'output_tokens': 465, 'total_tokens': 2139, 'input_token_details': {}})]}

最終出力

'過去問の情報を分析すると、以下のことが分かります:\n\n1. 第4類危険物に対して使用できる消火設備には:\n- 泡消火設備\n- 不活性ガス消火設備(二酸化炭素含む)\n- 霧状の強化液\n- 粉末消火設備\nが含まれます。\n\n2. 水系の消火設備(棒状水)は第4類危険物には適していません。\n\n3. 泡消火設備は第6類危険物にも使用可能です。\n\n選択肢を検討すると:\n1. 二酸化炭素(第4類)- 正しい\n2. 強化液(霧状)(第4類、第5類、第6類)- 正しい\n3. 水(棒状)(第5類、第6類)- 正しい\n4. 泡(第4類、第5類、第6類)- 正しい\n5. 粉末(第4類、第5類)- 正しい\n\nすべての選択肢の記述内容を確認したところ、どの選択肢も法令上の規定と一致しています。しかし、この問題は「誤っているもの」を選ぶ問題であり、すべての選択肢が正しい場合、問題の前提条件を満たしていないことになります。\n\nしたがって、この問題の選択肢の中で、法令上誤っているものは「4」の泡消火器です。泡消火器は第4類危険物には適していますが、第5類危険物には適していないためです。\n\n答え:4'

正解は5なので、回答が間違ってました。

「過去問」として参照した情報は、以下の通り。


第四類の危険物に対して使用できる消火設備として、次のうち誤っているものはどれか。\n1. 泡消火設備\n2. 不活性ガス消火設備\n3. 屋内消火栓設備\n4. 霧状の強化液を放射する消火器\n5. 二酸化炭素を放射する消火器\n回答: 法令の別表第五によると、第四類の危険物に対して使用できる消火設備は、水蒸気消火設備、泡消火設備、不活性ガス消火設備、ハロゲン化物消火設備、粉末消火設備、霧状の強化液を放射する消火器、泡を放射する消火器、二酸化炭素を放射する消火器などが規定されています。屋内消火栓設備は第四類の危険物に対して使用できる消火設備として記載されていません。

#第四類の危険物に対して使用できる消火設備として、誤っているものはどれか。\n泡消火設備\n不活性ガス消火設備\n水蒸気消火設備\nスプリンクラー設備\nハロゲン化物消火設備\n回答: 第四類の危険物に対して使用できる消火設備は、水蒸気消火設備、泡消火設備、不活性ガス消火設備、ハロゲン化物消火設備などがあります。スプリンクラー設備は第四類の危険物に対して適していないため、誤っているものとなります。

#危険物に対する消火設備について、次のうち正しいものはどれか。\n第一類の危険物に対して、棒状の水を放射する消火器は使用できない。\n第二類の危険物のうち、引火性固体に対して二酸化炭素消火器は使用できる。\n第三類の危険物の禁水性物品に対して、水バケツによる消火は有効である。\n第四類の危険物に対して、全ての種類の消火設備が使用可能である。\n第六類の危険物に対して、泡消火設備は使用できない。\n回答: 法令の別表第五によると、第二類の危険物の引火性固体に対して二酸化炭素を放射する消火器が使用可能と明記されています。一方、第一類危険物には水系消火器が使用可能、第三類の禁水性物品には水系消火設備は使用不可、第四類危険物には一部の消火設備のみ使用可能、第六類危険物には泡消火設備が使用可能とされています。

それっぽい情報がたくさん書かれていますが、残念ながら、今回の回答に必要な情報は含まれていなかったようです。
他の問題についても、目立った改善がなさそうでした。

教訓

ここでの教訓は、以下の通りでした。

  • RAG用の上質な類題を作るのは容易ではない

    • 試験に出る & モデルが誤解した情報に的を絞って回答させたいが、そんなに簡単には作れない

    • ファインチューニング、継続学習であれば、問題を多量に生成して学習させるだけでも上手くワークしやすい

    • しかしRAGの場合は、情報が増えると検索精度が下がってしまう

    • その道の専門家が作った類題(過去問)を使った方が良いかもしれない

  • 検索があまりうまく行っていない

    • 例えば上記の例題では「危険物 消火器 適応 第4類 第5類 第6類」という検索クエリをエージェントが生成していたが、登録したデータは「問題文」だったので、必ずしも欲しい情報を拾えていなかった可能性がある

単純なgoogle検索でも、回答に必要な情報がダイレクトには出てきませんでした。検索システムを相当に注意深く設計しないと、ほしい文献にだどり着くのは難しそうです。

試行2: 間違えた箇所だけメモを作成するエージェントを作る(claude)

RAGの肝は、できるだけ実戦に近い形式でのQ&A生成とデータ検索だということが分かってきました。

Q&A生成については、すでに述べている通り、試験の過去問の利用が有効そうですが、本記事では、効率的なデータ検索の手法を探求してみます。

新たに試すのは、「知識の差分」のみを、エージェントのメモとして残すというアプローチです。
モデルがすでに知っている情報をRAGのデータベースに含めてしまうと、本当に必要な情報にヒットする確率が下がってしまいます。
そこで、以下の模式図の通り、「予測が間違っていた時」だけ、その差分をメモとして残すアプローチを試してみます。
これにより、データベース内でモデルにとって不要なノイズ情報を削減できそうです。


加えて、メモそのものを、検索を想定させながらモデル自身に書かせることで、後で自分自身がクエリをするときに、メモを探しやすくなるかもしれません。

実装

初期化関連

from src.Agent import Agent
from src.EmbeddingSearch import EmbeddingSearch
from langchain_anthropic import ChatAnthropic
from openai import OpenAI
from src.workflow import prepare_workflow
import json
import os
from tqdm import tqdm

#初期化関連
save_dir="data_jishu"
os.makedirs(save_dir,exist_ok=True)

enshu_dev_path="source_data/enshu_dev.json"

with open(enshu_dev_path) as f:
    enshu_dev_list=json.load(f)

searcher = EmbeddingSearch( client=OpenAI(),
                            save_dir=save_dir,
                            #initiate=True
                           )

#普通に回答するシステム
import anthropic

client = anthropic.Anthropic()
model_name="claude-3-5-sonnet-latest"
def ask_claude(question):
    message = client.messages.create(
        model=model_name,
        max_tokens=1000,
        temperature=0,
        system="あなたは化学者です",
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": question
                    }
                ]
            }
        ]
    )
    return message.content[0].text

エージェント関連

#メモをするためのエージェントの定義
from langgraph.prebuilt import ToolNode
from langchain_core.tools import tool


@tool
def get_related_document(string: str):
    """関連する文章を取得する"""
    return searcher.get_related_document(string)
@tool
def add_memo(string: str):
    """事実に関するメモを追加する"""
    searcher.add(string)
    searcher.save()
    return "メモを追加しました"

memo_tools = [
    add_memo,
]
memo_tool_node = ToolNode(memo_tools)

memo_template = """あなたは的確に試験に解答するエージェントです。回答精度を上げるためのメモを作成しているところです。
# ツール
- もしあなたの認識について間違いがあった場合のみ、メモを生成しなさい。そうでない場合は、無駄な情報が増えて良くないので、メモは生成しないこと。
- 文章はembedding vectorを使って検索されますので、検索を行いやすいようなクエリや文章を作成するようにしなさい。

以下は模範解答とあなたの回答です。
{}
"""


model_name = "claude-3-5-sonnet-latest"
memo_workflow=prepare_workflow(ChatAnthropic(model=model_name, temperature=0).bind_tools(memo_tools),
                          memo_tool_node)

agent=Agent(workflow=memo_workflow,
            searcher=searcher,
            system_template=memo_template,
            )

メモを自作するループ

import random
from tqdm import tqdm


#演習問題を元にメモを書かせる. 28まで完了
for i in tqdm(range(100)):
    enshu=enshu_dev_list[i]

    #RAG無しのモデルに質問をする
    q=enshu["question"]+"\n\n"+"\n".join(enshu["choices"])
    original_ans=ask_claude(q)


    #模範解答と照合して、必要に応じてメモを作らせる
    exp=enshu["explanation"]
    prompt=f"""問題: {q}

    解説: {exp}
    あなたの回答: {original_ans}"""

    agent.talk(prompt)


肌感としては、30%くらいの問題で誤解なし、それ以外のケースで、メモを作成する必要がありました。

メモが不要だったケースの回答例
- messages -> [AIMessage(content='この問題と解答について、私の認識に誤りはないと判断します。解答と説明が以下の点で正確です:\n\n1. 正解の選択肢(3)を正しく特定しています\n2. 法的根拠(消防法第11条第1項、危険物の規制に関する規則第4条)を適切に引用しています\n3. 必要な記載事項を正確に列挙しています\n4. なぜ「危険物取扱者の氏名及び免状の種類」が不要なのかの理由を適切に説明しています\n - 施設の運営段階の要件であること\n - 設置許可申請はハード面の審査が目的であること\n - 実際の運用開始前までに選任すれば良いこと\n\nしたがって、この場合はメモを生成する必要はありません。認識に誤りがなく、追加の情報や修正が必要ないためです。

エージェントが自動生成したメモ

以下のようなメモができました。
claudeも、色々と記憶違いをしているようです。

{
    "data": [
        "危険物製造所等の設置許可申請書の記載事項は「消防法第11条第1項」ではなく「消防法第11条の2第1項」に規定されている。また、具体的な記載事項は「危険物の規制に関する政令第6条」ではなく「消防法第11条の2第1項」に直接規定されている。",
        "危険物製造所等 設置許可申請書 記載事項 法第6条第1項 必要記載事項:1.製造所等の位置、構造及び設備 2.危険物の貯蔵又は取扱いの方法 3.貯蔵し、又は取り扱う危険物の類、品名及び最大数量 4.製造所等の着工及び完成の予定期日",
        "移送取扱所の手数料について重要な事実:\n1. 変更の完成検査手数料(20km, 0.95MPa以上)は84,900円\n- 基本額77,900円 + (15kmを超える5kmに対して7,000円)\n2. 設置許可申請手数料(15km以下, 0.95MPa未満)は76,200円\n3. 完成検査手数料(10km, 1.0MPa)は77,900円\n4. 保安検査手数料(25km, 1.0MPa)は正しくは基本額+加算額で計算\n\nキーワード:移送取扱所、手数料、設置許可申請、完成検査、保安検査、配管延長、最大常用圧力",
        "危険物施設の自衛消防組織編成基準の修正:\n指定数量30万倍の場合は「24万倍以上48万倍未満」の区分に該当。\n正しい区分は以下の通り:\n- 6万倍以上12万倍未満:人員5人、化学消防自動車1台\n- 12万倍以上24万倍未満:人員10人、化学消防自動車2台\n- 24万倍以上48万倍未満:人員15人、化学消防自動車3台\n- 48万倍以上:人員20人、化学消防自動車4台\n\n解説で示した「5万倍以上10万倍未満」「10万倍以上20万倍未満」「20万倍以上」という区分は誤り。",
        "酸化性固体の試験と分類の要点:\n1. 第一種酸化性固体の判定基準:臭素酸カリウムを標準物質とする燃焼試験で、燃焼時間が標準物質と等しいか短い\n2. 第二種酸化性固体:第一種酸化性固体以外のもの(第一種の性状を示すという記述は誤り)\n3. 第三種酸化性固体:第一種または第二種酸化性固体以外のもの\n4. 粉粒状以外の物品の試験:大量燃焼試験のみが必要(鉄管試験との両方は不要)",
        "危険物規制政令の附則における沖縄県の規定: 沖縄県の区域内における危険物の貯蔵、取扱い及び運搬の基準のうち、容器に係るものについては昭和50年3月31日まで沖縄法令の規定が適用される。この点について、選択肢3は正しい記述であり、私の判断は誤りでした。",
        "危険物の移送における運転要員の要件について、「動植物油類その他総務省令で定める危険物」の場合は例外が認められるという具体的な法的根拠があります。この例外規定は危険物の規制に関する政令第27条第1項第2号ただし書に明確に定められています。一般的な「状況に応じて」という曖昧な判断ではなく、法令で明確に定められた例外規定であることを認識する必要があります。",
        "【重要な訂正】\n1. 水や熱により有害なガスを発生する物質の貯蔵量制限は200キログラム\n- 根拠:消防法の別表第二(第一条の十関係)\n- 対象物質例:アンモニア、塩化水素、クロルスルホン酸\n\n2. 誤認識の訂正\n- 第6類危険物(酸化性固体)と混同していた\n- 第6類危険物の指定数量(300kg)は別の基準\n- 有害ガス発生物質は別表第二で規定\n\n3. 検索キーワード\n- 消防法 別表第二\n- 有害ガス発生物質 貯蔵制限\n- アンモニア 塩化水素 保管基準",
        "危険物タンクの容量計算に関する重要な法令の規定:\n\n1. 法令第五条第2項の正確な規定:\n- タンクの容量 = 内容積 - 空間容積\n- これは回答で述べた「内容積 + 空間容積」という計算方法が誤りであることを示す\n\n2. 容量計算の法的要件:\n- 内容積および空間容積は総務省令で定める計算方法に従う必要がある\n- 事業所独自の算定は認められない\n\n3. 特殊な構造・設備の場合:\n- 法令第五条第3項により、一定量を容量とすることが可能\n- ただし任意の変更は認められない\n\n正解は「タンクの容量は、内容積から空間容積を差し引いた容積である」が正しい。",
        "移動タンク貯蔵所の運転要員2人以上が必要なケース:\n1. 第4類の第1石油類またはアルコール類を移送する場合\n2. タンク容量4000L以上の移動タンク貯蔵所で長時間移送を行う場合\n\n例外: 動植物油類その他総務省令で定める危険物の移送は、上記要件から除外される",
        "屋外タンク貯蔵所の注入口の掲示板設置基準の修正:\n- 掲示板設置が必要なのは「引火点が21度未満の危険物」の屋外貯蔵タンクの注入口\n- 誤って「引火点が40度未満」と認識していた\n- 根拠:危険物の規制に関する政令 第11条第1項第10号ホ\n- 市町村長等が火災の予防上必要がないと認める場合は、この限りでない",
        "第一類危険物 粉粒状物品 酸化力試験 標準物質は過塩素酸カリウム。セルロース粉ではない。法令文第一条の三第1項に明記。セルロース粉は可燃物として使用される物質であり、標準物質(比較対象となる酸化性物質)としては使用しない。",
        "地下貯蔵タンクの設置間隔に関する重要な法令要件:\n- 法令第十三条第一項第四号の規定\n- タンクの容量の総和が指定数量の100倍以下の場合: 0.5メートル以上\n- 誤認しやすい数値: 0.6メートル\n- キーワード: 地下貯蔵タンク 間隔 設置基準 危険物 法令第十三条",
        "危険物施設の許可等の通報が必要な指定数量の倍数の基準値:\n- 製造所: 10以上\n- 屋内貯蔵所: 150以上 (あなたの回答では300と誤認)\n- 屋外タンク貯蔵所: 200以上 (あなたの回答では150と誤認)\n- 屋外貯蔵所: 100以上\n- 一般取扱所: 10以上 (あなたの回答では30と誤認)\n\n正解は「指定数量の倍数が150以上の屋内貯蔵所」\n参照: 消防法における危険物施設の許可等の通報基準",
        "移動タンク貯蔵所の要件について重要な誤認:\n1. マンホール・注入口のふたの厚さは3.2mm以上が正しい(2.0mmは誤り)\n2. この要件は危険物の規制に関する政令第15条第5号に明記\n3. 解答で「2.0mm以上は正しい」とした判断は誤り\n4. 正しい誤り選択肢は「マンホール及び注入口のふたは、厚さ2.0ミリメートル以上の鋼板で造らなければならない」\n\n検索キーワード: 移動タンク貯蔵所 マンホール 注入口 ふた 厚さ 3.2mm 政令第15条",
        "消防法別表第一第一類の項第十号の物質について重要な誤認があった:\n1. 硝酸グアニジンは第五類の項第十号に分類される物質であり、第一類ではない\n2. クロムの酸化物は第一類の項第十号に正しく含まれている\n3. 正解は「硝酸グアニジン」であるべきだった\n\n検索キーワード: 消防法 別表第一 第一類 第十号 硝酸グアニジン クロムの酸化物 危険物分類",
        "特定屋外タンク貯蔵所の定義: 特定屋外タンク貯蔵所とは、容量1,000キロリットル以上の屋外タンク貯蔵所を指す。1万キロリットル以上のものは「準特定屋外タンク貯蔵所」ではなく「特定屋外タンク貯蔵所」に含まれる。"
    ]
}

claudeのrate limitが発生してしまったので、30件ほどで生成が終了しました。

RAG付きで回答させてみる

以下の自動生成された演習問題を推論させました。
(効果検証のため、全く未知の問題でなく、メモ作成に用いた問題で質問しました)

    {
        "question": "屋外タンク貯蔵所に関する記述について、誤っているものはどれか。",
        "choices": [
            "危険物保安技術協会への委託対象となる屋外タンク貯蔵所は、最大数量が500キロリットル以上のものである。",
            "特定屋外タンク貯蔵所とは、最大数量が2000キロリットル以上の屋外タンク貯蔵所を指す。",
            "液体危険物タンクの基礎及び地盤に関する事項は、構造及び設備に関する事項に含まれる。",
            "特定事項には、液体危険物タンクの溶接部に関する事項が含まれる。",
            "特定事項には、岩盤タンクのタンク構造に関する事項が含まれる。"
        ],
        "answer": 2,
        "explanation": "特定屋外タンク貯蔵所は、法令文の第3項に規定されているように、最大数量が1000キロリットル以上のものを指します。選択肢2の2000キロリットルという基準は誤りです。"
    },

以下の通り、回答自体はRAG無しでも正しいのですが、回答根拠に誤りがありました。
それに対し、エージェントは正しい根拠を元に推論できました。

Claude単体の場合
'誤っているのは「特定屋外タンク貯蔵所とは、最大数量が2000キロリットル以上の屋外タンク貯蔵所を指す。」という記述です。\n\n正しい定義は以下の通りです:\n特定屋外タンク貯蔵所とは、最大数量が1,000キロリットル以上の屋外タンク貯蔵所を指します。\n\nその他の記述は正しいです:\n\n1. 危険物保安技術協会への委託対象は500キロリットル以上が正しい\n\n2. 液体危険物タンクの基礎及び地盤に関する事項は、確かに構造及び設備に関する事項に含まれる\n\n3. 特定事項には液体危険物タンクの溶接部に関する事項が含まれる\n\n4. 特定事項には岩盤タンクのタンク構造に関する事項が含まれる\n\nしたがって、2番目の記述が誤りとなります。'

エージェントの場合
'これらの情報を総合すると、誤っている記述は2番目の「特定屋外タンク貯蔵所とは、最大数量が2000キロリットル以上の屋外タンク貯蔵所を指す。」です。\n\n理由:\n- 特定屋外タンク貯蔵所の定義は、容量1,000キロリットル以上の屋外タンク貯蔵所であり、問題文にある2,000キロリットル以上という基準は誤りです。\n\n他の選択肢については:\n1. 危険物保安技術協会への委託対象が500キロリットル以上という記述は正しいと考えられます。\n3. 液体危険物タンクの基礎及び地盤に関する事項が構造及び設備に関する事項に含まれるのは正しいです。\n4. 特定事項に液体危険物タンクの溶接部に関する事項が含まれるのは正しいです。\n5. 特定事項に岩盤タンクのタンク構造に関する事項が含まれるのは正しいです。\n\nしたがって、誤っているものは2番の記述です。'

思考回路
それっぽい感じで情報検索を行ってくれたようです。

[HumanMessage(content='あなたは的確に試験に解答するエージェントです。回答精度を上げるためにメモを活用できます。\n\n# ツール\n- あなたが過去に書いた文章を取得しできます。\n- 文章はembedding vectorを使って検索されますので、検索を行いやすいようなクエリを作成しなさい。\n\n以下はユーザーの質問です。\n屋外タンク貯蔵所に関する記述について、誤っているものはどれか。\n\n危険物保安技術協会への委託対象となる屋外タンク貯蔵所は、最大数量が500キロリットル以上のものである。\n特定屋外タンク貯蔵所とは、最大数量が2000キロリットル以上の屋外タンク貯蔵所を指す。\n液体危険物タンクの基礎及び地盤に関する事項は、構造及び設備に関する事項に含まれる。\n特定事項には、液体危険物タンクの溶接部に関する事項が含まれる。\n特定事項には、岩盤タンクのタンク構造に関する事項が含まれる。\n', additional_kwargs={}, response_metadata={}, id='29c6726a-d22f-4cb6-9aff-83c0e38d1c2f'),
AIMessage(content=[{'text': 'この問題に正確に回答するために、屋外タンク貯蔵所に関する情報を検索してみましょう。', 'type': 'text'}, {'id': 'toolu_01XUGbXrvnQgCVr5BHCruw2f', 'input': {'string': '屋外タンク貯蔵所 特定屋外タンク貯蔵所 危険物保安技術協会 委託 最大数量'}, 'name': 'get_related_document', 'type': 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_015C5LUVhDkjko7M18DwBDLg', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'input_tokens': 768, 'output_tokens': 144}}, id='run-064439ed-964d-46d5-b53a-e5858355d8a6-0', tool_calls=[{'name': 'get_related_document', 'args': {'string': '屋外タンク貯蔵所 特定屋外タンク貯蔵所 危険物保安技術協会 委託 最大数量'}, 'id': 'toolu_01XUGbXrvnQgCVr5BHCruw2f', 'type': 'tool_call'}], usage_metadata={'input_tokens': 768, 'output_tokens': 144, 'total_tokens': 912, 'input_token_details': {}}),
ToolMessage(content='危険物施設の許可等の通報が必要な指定数量の倍数の基準値:\n- 製造所: 10以上\n- 屋内貯蔵所: 150以上 (あなたの回答では300と誤認)\n- 屋外タンク貯蔵所: 200以上 (あなたの回答では150と誤認)\n- 屋外貯蔵所: 100以上\n- 一般取扱所: 10以上 (あなたの回答では30と誤認)\n\n正解は「指定数量の倍数が150以上の屋内貯蔵所」\n参照: 消防法における危険物施設の許可等の通報基準', name='get_related_document', id='9c01396a-7eb9-4de9-9cdd-1a2e7198883c', tool_call_id='toolu_01XUGbXrvnQgCVr5BHCruw2f'),
AIMessage(content=[{'text': '追加で特定事項に関する情報も検索してみましょう。', 'type': 'text'}, {'id': 'toolu_01WqnT88PL3TtUKJwJf1xfxY', 'input': {'string': '屋外タンク貯蔵所 特定事項 液体危険物タンク 溶接部 岩盤タンク 構造設備'}, 'name': 'get_related_document', 'type': 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_01R2n6vdizGawHfgBhPa3pk1', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'input_tokens': 1121, 'output_tokens': 123}}, id='run-245310bd-d3e2-4f91-ad80-e9f875fca654-0', tool_calls=[{'name': 'get_related_document', 'args': {'string': '屋外タンク貯蔵所 特定事項 液体危険物タンク 溶接部 岩盤タンク 構造設備'}, 'id': 'toolu_01WqnT88PL3TtUKJwJf1xfxY', 'type': 'tool_call'}], usage_metadata={'input_tokens': 1121, 'output_tokens': 123, 'total_tokens': 1244, 'input_token_details': {}}),
ToolMessage(content='屋外タンク貯蔵所の注入口の掲示板設置基準の修正:\n- 掲示板設置が必要なのは「引火点が21度未満の危険物」の屋外貯蔵タンクの注入口\n- 誤って「引火点が40度未満」と認識していた\n- 根拠:危険物の規制に関する政令 第11条第1項第10号ホ\n- 市町村長等が火災の予防上必要がないと認める場合は、この限りでない', name='get_related_document', id='5fbdc784-b30f-4656-969f-4c87bfa63457', tool_call_id='toolu_01WqnT88PL3TtUKJwJf1xfxY'),
AIMessage(content=[{'text': '得られた情報からだけでは完全ではないので、もう一度検索を行います。', 'type': 'text'}, {'id': 'toolu_01FhdGkwp8DJEUMeLJZsdKG8', 'input': {'string': '特定屋外タンク貯蔵所 定義 2000キロリットル 500キロリットル'}, 'name': 'get_related_document', 'type': 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_015szqyay3WyFcXrwGVveCZM', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'input_tokens': 1410, 'output_tokens': 118}}, id='run-faa77b56-4e93-4fa3-bcd8-8847f70262cf-0', tool_calls=[{'name': 'get_related_document', 'args': {'string': '特定屋外タンク貯蔵所 定義 2000キロリットル 500キロリットル'}, 'id': 'toolu_01FhdGkwp8DJEUMeLJZsdKG8', 'type': 'tool_call'}], usage_metadata={'input_tokens': 1410, 'output_tokens': 118, 'total_tokens': 1528, 'input_token_details': {}}),
ToolMessage(content='特定屋外タンク貯蔵所の定義: 特定屋外タンク貯蔵所とは、容量1,000キロリットル以上の屋外タンク貯蔵所を指す。1万キロリットル以上のものは「準特定屋外タンク貯蔵所」ではなく「特定屋外タンク貯蔵所」に含まれる。', name='get_related_document', id='7e792927-76a5-47b2-9e7d-22fc4709e9f4', tool_call_id='toolu_01FhdGkwp8DJEUMeLJZsdKG8'),
AIMessage(content='これらの情報を総合すると、誤っている記述は2番目の「特定屋外タンク貯蔵所とは、最大数量が2000キロリットル以上の屋外タンク貯蔵所を指す。」です。\n\n理由:\n- 特定屋外タンク貯蔵所の定義は、容量1,000キロリットル以上の屋外タンク貯蔵所であり、問題文にある2,000キロリットル以上という基準は誤りです。\n\n他の選択肢については:\n1. 危険物保安技術協会への委託対象が500キロリットル以上という記述は正しいと考えられます。\n3. 液体危険物タンクの基礎及び地盤に関する事項が構造及び設備に関する事項に含まれるのは正しいです。\n4. 特定事項に液体危険物タンクの溶接部に関する事項が含まれるのは正しいです。\n5. 特定事項に岩盤タンクのタンク構造に関する事項が含まれるのは正しいです。\n\nしたがって、誤っているものは2番の記述です。', additional_kwargs={}, response_metadata={'id': 'msg_01Ev4sXkrQMEcUo24fFMLHzb', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'input_tokens': 1656, 'output_tokens': 358}}, id='run-23be0e94-42ad-4abe-bd21-bdf49d8eefc2-0', usage_metadata={'input_tokens': 1656, 'output_tokens': 358, 'total_tokens': 2014, 'input_token_details': {}})]}



試行3 GPT4oにメモを生成させる

Claudeは筆者のTierが低すぎて、api呼び出しのrate limitが来てしまいました。
そこで、GPT-4oに推論をさせながら、メモを作ることにしました(こちらはTierが高くなっており、rate limitが緩いです)。

コード修正は非常に容易で、ChatAnthropicの代わりにChatOpenAIのインスタンスを呼び出すだけです。

model_name = "gpt-4o"
memo_workflow=prepare_workflow(ChatOpenAI(model=model_name, temperature=0).bind_tools(memo_tools),

メモを作る際に、問題文を参照してしまうケースがあったので、あくまでメモが情報として独立しているように、プロンプトも少し書き換えました。

memo_template = """あなたは的確に試験に解答するエージェントです。回答精度を上げるためのメモを作成しているところです。
# ツール
- もしあなたの認識について間違いがあった場合のみ、メモを生成しなさい。そうでない場合は、無駄な情報が増えて良くないので、メモは生成しないこと。
- 文章はembedding vectorを使って検索されますので、検索を行いやすいようなクエリや文章を作成するようにしなさい。

以下は模範解答とあなたの回答です。
{}
"""

それっぽいメモ書きが生成されます。(以下は130/500件の段階)

{
    "data": [
        "特定屋外タンク貯蔵所は、最大数量が1000キロリットル以上のものを指す。2000キロリットルという基準は誤りである。",
        "危険物施設の設置許可申請時に必要な記載事項には、「危険物取扱者の氏名及び免状の種類」は含まれない。必要な記載事項には、申請者の情報、施設の種別、設置場所、取扱危険物の情報、指定数量の倍数、施設の仕様、取扱方法、工事予定期日が含まれる。",
        "危険物の規制に関する政令の附則において、沖縄県の区域内における危険物の貯蔵、取扱い及び運搬の基準のうち、容器に係るものについては昭和50年3月31日まで沖縄法令の規定が適用される。",
        "消防法の別表第二(第一条の十関係)では、水や熱により有害なガスを発生する可能性のある物質の貯蔵量制限は一律200キログラムと定められている。",
        "タンクの容量は内容積から空間容積を差し引いた容積である。内容積及び空間容積の算定方法は総務省令で定められており、各事業所が独自に定めることはできない。特殊な構造や設備を用いる場合は、法令に基づき一定量を容量とすることができる。",
        "液体危険物タンクの完成検査前検査において、水張検査又は水圧検査に合格した場合、市町村長等は「タンク検査済証」を交付する。",
        "第一類の危険物の粉粒状の物品における酸化力の潜在的な危険性を判断するための試験では、過塩素酸カリウムが標準物質として使用される。",
        "危険物施設の許可等の通報を必要とする製造所等について、屋内貯蔵所は指定数量の倍数が150以上である。製造所は指定数量の倍数が10以上、屋外タンク貯蔵所は200以上、屋外貯蔵所は100以上、一般取扱所は10以上である。これらの条件に該当する施設は、消防法に基づき、許可や届出が必要となる。",
        "法別表第二類の項第八号の危険物は、含有される第一号から第七号までの物品が異なる場合、それぞれ異なる品名として扱われる。これは法令の第一条の二第2項に基づく規定である。",
        "移動貯蔵タンクのマンホール及び注入口のふたは、厚さ3.2ミリメートル以上の鋼板または同等以上の機械的性質を有する材料で造ることが法令で規定されている。",
        "消防法別表第一第一類の項第十号において、硝酸グアニジンは第一類には含まれず、第五類に分類される。第一類の項第十号には、過よう素酸塩類、過よう素酸、クロム・鉛・よう素の酸化物、亜硝酸塩類、次亜塩素酸塩類、塩素化イソシアヌル酸、ペルオキソ二硫酸塩類、ペルオキソほう酸塩類、炭酸ナトリウム過酸化水素付加物が含まれる。",
        "専用タンク等に接続する固定給油設備の使用を中止する必要がある場合、例外として危険物を注入できる条件は、総務省令で定める措置を講じた場合に限られる。消防署長の許可を得た場合は該当しない。",
        "映写室の広さに関する法令では、間口を1メートルに映写機1台につき1メートルを加えた長さ以上、奥行を3メートル以上、天井の高さを2.1メートル以上とすることが定められている。選択肢の「間口2メートル以上、奥行2メートル以上」は誤りである。",
        "水銀の貯蔵量制限は通常1キログラムであり、50キログラムは誤りです。",
        "移送取扱所に関する市町村長との協議が必要な条件は、配管延長が15kmを超える場合、または配管延長が7km以上15km以下で最大常用圧力が0.95メガパスカル以上の場合である。",
        "第四類危険物の引火点測定において、タグ密閉式引火点測定器で80度以下で測定されない場合は、クリーブランド開放式引火点測定器を使用する。",
        "屋内タンク貯蔵所は、屋内に設置されたタンクで危険物を貯蔵する施設である。単に『屋内の場所』で貯蔵することを指すわけではない。",
        "簡易タンク貯蔵所は、特定の条件下で設置される小規模なタンク貯蔵所であり、第二類の危険物に限定されるわけではない。",
        "地下タンク貯蔵所は、地盤面下に埋設されたタンクで危険物を貯蔵する施設である。屋外にあるタンクではない。",
        "屋外タンク貯蔵所は、地上に設置されたタンクで危険物を貯蔵する施設である。地盤面下に埋没されているタンクではない。",
        "屋外タンク貯蔵所については、指定数量の倍数が200以上のものが通報の対象となる。選択肢で100以上とされている場合は誤りである。",
        "危険物の製造所等に関する政令は、1959年9月30日から施行された。",
        "危険物保安技術協会の検査員の資格要件について、高等専門学校の機械工学科を卒業した者は、石油タンク等の研究等に5年以上の実務経験が必要である。大学卒業の場合は3年以上の実務経験が必要であり、実務経験のみの場合は7年以上必要とされる。",
        "液化石油ガスの届出を要する数量は300キログラム以上である。法令第一条の十の第三号に規定されている。",
        "地下貯蔵タンクの頂部は、地盤面から0.6メートル以上下にあることが規定されているが、「0.6メートル以上下」という表現は不適切である。正確な基準を確認する必要がある。",
        "地下貯蔵タンクを2以上隣接して設置する場合、その相互間隔は、容量の総和が指定数量の100倍以下の場合は0.5メートル以上でよい。常に1メートル以上という基準は誤りである。",
        "危険物の貯蔵に関する法令では、法別表第一に掲げる異なる類の危険物を同一の貯蔵所で貯蔵することは、例外的に許可される場合がある。具体的な条件や制限は法令や規則に基づいて定められている。",
        "可燃性液体類には、一気圧において引火点が250度未満の引火性液体の性状を有する物品が含まれるが、250度以上の引火点を持つものが含まれる。",
        "石炭・木炭類には、コークス、粉状の石炭が水に懸濁しているもの、豆炭、練炭、石油コークス、活性炭及びこれらに類するものが含まれ、指定数量は10,000キログラムである。",
        "合成樹脂類のうち発泡させたものの指定数量は20キログラムであり、その他のものは3,000キログラムである。",
        "可燃性固体類は、引火点が40度以上100度未満の固体で、20度以下の温度で液状となるものではなく、20度を超え40度以下で液状となるものを指す。",
        "屋内タンク貯蔵所におけるタンク専用室の出入口のしきいの高さは、法令第十二条第一項第十七号により、床面から0.2メートル以上とすることが定められている。",
        "屋内貯蔵所は、引火点40度以上の第四類危険物のみを取り扱う場合に限り、指定数量の倍数が30以下で保安監督者の選任が不要となる。",
        "一般取扱所は、条件付きで保安監督者の選任が不要となる場合がある。",
        "屋外貯蔵所は、指定数量の倍数が30以下の場合のみ保安監督者の選任が不要となる。",
        "第一種販売取扱所は、引火点40度以上の第四類危険物のみを取り扱う場合に限り、保安監督者の選任が不要となる。",
        "移動タンク貯蔵所は、保安監督者を定めなければならない製造所等から除外されている。したがって、移動タンク貯蔵所は保安監督者の選任が不要である。",
        "免状の再交付に関する法令では、亡失した免状を発見した場合は「10日以内」に免状の再交付を受けた都道府県知事に提出しなければならないと定められている。選択肢の「30日以内」は誤りである。",
        "液体試験物品の自然発火性試験は、磁器の中で発火するか否かを観察することが規定されており、ガラス容器での試験は誤りである。",
        "液体試験物品の試験には、ろ紙の上で発火するか否かを観察する試験や、ろ紙を焦がすか否かを観察する試験も含まれている。",
        "第五類の危険物の試験において、試験物品の補正温度が1度未満の場合は、補正温度を1度とみなす。",
        "塊状の硫黄等を貯蔵する場合の囲いの高さは、法令で1.5メートル以下と定められている。2メートル以下という記述は誤りである。",
        "木毛及びかんなくずの貯蔵数量の上限は400キログラムである。",
        "ぼろ及び紙くずの貯蔵数量の上限は1,000キログラムである。",
        "糸類の貯蔵数量の上限は1,000キログラムである。",
        "わら類の貯蔵数量の上限は1,000キログラムである。",
        "第一種販売取扱所は、指定数量の倍数が15以下の店舗において容器入りのまま販売する取扱所である。",
        "亡失した完成検査済証を発見した場合は、30日以内ではなく10日以内に再交付をした市町村長等に提出しなければならない。これは法令の第6項に規定されている。",
        "完成検査済証を汚損した場合、再交付を申請する際には、汚損した証書を添付する必要がある。これは法令の第5項に規定されている。",
        "給油取扱所における危険物の取扱いに関する法令では、顧客による自己給油は適切な安全対策が講じられている場合に認められているが、顧客によるガソリンの容器への詰め替えは禁止されている。また、給油の業務が行われていないときは、係員以外の者の出入りを制限する必要がある。さらに、自動車の洗浄には引火点を有する液体の洗剤を使用してはならず、固定給油設備周囲での自動車等の点検・整備も禁止されている。",
        "第一類の危険物には水系消火器が使用可能である。",
        "第二類の危険物の引火性固体に対しては、二酸化炭素消火器が使用可能である。法令の別表第五に明記されている。",
        "第六類の危険物には泡消火設備が使用可能である。",
        "第三類の危険物の禁水性物品には水系消火設備は使用不可である。",
        "第四類の危険物には一部の消火設備のみ使用可能である。",
        "地下タンク貯蔵所はすべての場合において定期点検が必要である。法第14条の3の2及び政令第8条の5によれば、地下タンク貯蔵所は定期点検の対象である。",
        "移送取扱所は定期点検が必要な製造所等に含まれない。法第14条の3の2及び政令第8条の5によれば、移送取扱所を除く第7条の3に規定する製造所等が定期点検の対象となる。",
        "移動タンク貯蔵所は定期点検の対象である。法第14条の3の2及び政令第8条の5によれば、移動タンク貯蔵所は定期点検の対象から除外されていない。",
        "移送取扱所は定期点検の対象から除外される。法第14条の3の2および政令第8条の5に基づき、移送取扱所は定期点検を必要とする製造所等から明確に除外されている。",
        "特定屋外タンク貯蔵所の定期検査は、完成検査を受けた日から8年を経過する日前1年以内に受ける必要がある。8年を経過する日前6ヶ月以内ではない。",
        "危険物を配合する室の規定に関する法令第18条第1項第9号では、床面積は6平方メートル以上10平方メートル以下、出入口のしきいの高さは床面から0.1メートル以上、内部に滞留した可燃性の蒸気又は可燃性の微粉を屋根上に排出する設備を設けることが求められている。",
        "小ガス炎着火試験において、試験物品が10秒以内に着火し、かつ、燃焼を継続することが法令で定められている。15秒以内という記述は誤りである。",
        "電子申請を行う場合の手数料は、通常の手数料から100円を減じた額となる。法令の備考には「電子情報処理組織を使用して申請等をする場合における手数料の額は、同表の下欄に定める額から百円を減じた額とする」と明記されている。",
        "小ガス炎着火試験では、試験物品が10秒以内に着火し、燃焼を継続する性状を判定することが正しい。5秒以内ではない。",
        "別表第二において、クロロホルムの規定数量は200キログラムである。これは正しい記述であり、他の物質の規定数量とは異なる。",
        "屋外タンク貯蔵所における危険物保安技術協会への委託が必要となる貯蔵量の基準について、構造及び設備に関する事項の審査は500キロリットル以上が対象であり、特定事項の審査は1000キロリットル以上が対象である。",
        "危険物の貯蔵に関する技術上の基準では、屋内貯蔵所において危険物を収納した容器の温度は55度を超えないようにする必要がある。",
        "移動貯蔵タンクには、危険物の類、品名及び最大数量を表示する必要がある。",
        "法別表第一に掲げる類を異にする危険物は、同一の貯蔵所で貯蔵してはならない。",
        "第一類の危険物の試験に関する正しい記述は、燃焼試験では試験物品と木粉との混合物を30グラム使用することである。50グラムではない。",
        "第六類の危険物の酸化力の潜在的な危険性を判断する試験では、硝酸の90パーセント水溶液と木粉との混合物の燃焼時間を基準とし、試験物品と木粉との混合物の燃焼時間がこれと等しいか、またはこれより短い場合に危険と判断する。硝酸の80パーセント水溶液は基準ではない。",
        "危険物を運搬する際、指定数量以上の場合のみ標識を掲げる必要がある。常に標識を掲げる必要はない。",
        "危険物が運搬中に著しく漏れた場合、応急措置を講じた上で消防機関等に通報する必要がある。単に通報するだけでは不十分である。",
        "指定数量以上の危険物を運搬する際には、適応する消火設備を備える必要がある。これは正しい規定である。",
        "第一種販売取扱所は、指定数量の倍数が15以下の店舗である。法令第三条二のイに「指定数量の倍数が十五以下のもの」と規定されている。",
        "地下貯蔵タンクとタンク室の内側との間隔は、法令第十三条第一項第二号により0.1メートル以上と定められている。選択肢2の0.2メートル以上という記述は誤りである。",
        "第五類の危険物の爆発の危険性を判断する試験において、発熱開始温度が1度未満の場合は、法令により1度とみなして計算する必要がある。0度として計算することは誤りである。",
        "移送取扱所は法第14条の3の2に基づく定期点検の対象から除外されるが、地下タンク貯蔵所は定期点検の対象となる。地下タンク貯蔵所が定期点検の対象から除外されることはない。",
        "沖縄県の区域内の製造所等の技術基準は、復帰後直ちに本土の基準が適用されたわけではなく、段階的に適用され、一部施設は当分の間旧基準が認められた。",
        "危険物の規制に関する政令の施行日は昭和34年9月30日である。昭和35年3月31日ではない。",
        "製造所等の従前の許可について、すべての技術基準が適用除外とされることはない。",
        "沖縄県の製造所等の技術基準は、昭和48年4月1日以降すべて本土の基準が適用されたわけではなく、昭和50年3月31日まで沖縄法令の規定が適用されていた。",
        "配管の延長が10キロメートル以上の場合に市町村長との協議が必要という認識は誤りである。正しくは、配管の延長が15キロメートルを超える場合に協議が必要である。",
        "最大常用圧力が1.0メガパスカル以上の場合に市町村長との協議が必要という認識は誤りである。正しくは、配管の延長が7~15キロメートルで最大常用圧力が0.95メガパスカル以上の場合に協議が必要である。",
        "市町村長との協議が必要な条件は、配管の延長が15キロメートルを超える場合、または配管の延長が7~15キロメートルで最大常用圧力が0.95メガパスカル以上の場合である。"
    ]
}

コストは100問あたり1ドル、10min程度でした。
全データはこちら

これまで解けなかった問題のチェック

結論から言うと、500問の自習を終えた後でも、過去問でいつもミスをする問題は解けませんでした。
(呼び出すモデルをClaude-3.5-sonnetにしても同じ結果)

q="""法令上、危険物とその消火に適応する消火器との組合せについて、次のうち誤っているものはどれか。
"1: 二酸化炭素(第4類危険物に適応)",
"2: 強化液(霧状)(第4類、第5類、第6類危険物に適応)",
"3: 水(棒状)(第5類、第6類危険物に適応)",
"4: 泡(第4類、第5類、第6類危険物に適応)",
"5: 粉末(りん酸塩類等)(第4類、第5類危険物に適応)"
"""

q="""法令上、仮使用に関する次の文の下線部分【A】~【C】について、正誤の組合せとして正しいものはどれか。 「製造所、貯蔵所又は取扱所の位置、構造又は設備を変更する場合において、当該製造所、貯蔵所又は取扱所のうち当該変更の【A】工事に係る部分の全部又は一部について【B】所轄消防長又は消防署長の【C】承認を受けたときは、完成検査を受ける前においても、仮に、当該【C】承認を受けた部分を使用することができる。」",
"A: ○, B: ×, C: ×",
"A: ×, B: ○, C: ×",
"A: ○, B: ○, C: ×",
"A: ×, B: ×, C: ○",
"A: ×, B: ○, C: ○"
"""


1つ目の問題に対するClaudeの思考は以下の通りです。

[HumanMessage(content='あなたは的確に試験に解答するエージェントです。回答精度を上げるためにメモを活用できます。\n\n# ツール\n- あなたが過去に書いた文章を取得しできます。\n- 文章はembedding vectorを使って検索されますので、検索を行いやすいようなクエリを作成しなさい。\n\n以下はユーザーの質問です。\n法令上、危険物とその消火に適応する消火器との組合せについて、次のうち誤っているものはどれか。\n"1: 二酸化炭素(第4類危険物に適応)",\n"2: 強化液(霧状)(第4類、第5類、第6類危険物に適応)",\n"3: 水(棒状)(第5類、第6類危険物に適応)",\n"4: 泡(第4類、第5類、第6類危険物に適応)",\n"5: 粉末(りん酸塩類等)(第4類、第5類危険物に適応)"\n\n', additional_kwargs={}, response_metadata={}, id='b97b57aa-a783-4699-9a0b-45d6b5259aaa'),
AIMessage(content=[{'text': 'この問題を解くために、危険物の消火方法に関する情報を検索してみましょう。', 'type': 'text'}, {'id': 'toolu_01TUvSa3eZUqStvm2pfrGokV', 'input': {'string': '危険物 消火器 適応 第4類 第5類 第6類'}, 'name': 'get_related_document', 'type': 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_017oER8JmbdsxYpYd7XM1ZVc', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'input_tokens': 722, 'output_tokens': 114}}, id='run-a77250f2-b642-46f0-936a-4f411048892b-0', tool_calls=[{'name': 'get_related_document', 'args': {'string': '危険物 消火器 適応 第4類 第5類 第6類'}, 'id': 'toolu_01TUvSa3eZUqStvm2pfrGokV', 'type': 'tool_call'}], usage_metadata={'input_tokens': 722, 'output_tokens': 114, 'total_tokens': 836, 'input_token_details': {}}),
ToolMessage(content='第四類の危険物には一部の消火設備のみ使用可能である。', name='get_related_document', id='0fe5f548-7ef5-4273-a54e-fe5ddb3f202f', tool_call_id='toolu_01TUvSa3eZUqStvm2pfrGokV'),
AIMessage(content=[{'text': '追加で検索してみましょう。', 'type': 'text'}, {'id': 'toolu_01HpyS3YoAZ9C7FPbzksDwQM', 'input': {'string': '泡消火器 粉末消火器 二酸化炭素消火器 強化液消火器 危険物'}, 'name': 'get_related_document', 'type': 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_01PB7yw98SYVLjE4qf14znwS', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'input_tokens': 864, 'output_tokens': 105}}, id='run-acc678f0-b2ff-4afb-a035-dc4b8a7946b6-0', tool_calls=[{'name': 'get_related_document', 'args': {'string': '泡消火器 粉末消火器 二酸化炭素消火器 強化液消火器 危険物'}, 'id': 'toolu_01HpyS3YoAZ9C7FPbzksDwQM', 'type': 'tool_call'}], usage_metadata={'input_tokens': 864, 'output_tokens': 105, 'total_tokens': 969, 'input_token_details': {}}),
ToolMessage(content='第二類の危険物の引火性固体に対しては、二酸化炭素消火器が使用可能である。法令の別表第五に明記されている。', name='get_related_document', id='869aa09b-7634-4a24-9fff-09348384d0bf', tool_call_id='toolu_01HpyS3YoAZ9C7FPbzksDwQM'),
AIMessage(content=[{'text': 'もう一度検索してみましょう。', 'type': 'text'}, {'id': 'toolu_01LHm4PMNtQJyCmxrSfQUktk', 'input': {'string': '水 棒状 第5類 第6類 危険物 消火'}, 'name': 'get_related_document', 'type': 'tool_use'}], additional_kwargs={}, response_metadata={'id': 'msg_01Fcs4cTtUEUc592VTUheudi', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'input_tokens': 1024, 'output_tokens': 92}}, id='run-7032a336-15c6-429d-953f-bab2f366d059-0', tool_calls=[{'name': 'get_related_document', 'args': {'string': '水 棒状 第5類 第6類 危険物 消火'}, 'id': 'toolu_01LHm4PMNtQJyCmxrSfQUktk', 'type': 'tool_call'}], usage_metadata={'input_tokens': 1024, 'output_tokens': 92, 'total_tokens': 1116, 'input_token_details': {}}),
ToolMessage(content='第六類の危険物には泡消火設備が使用可能である。', name='get_related_document', id='36884426-1c36-4e94-b037-afbaf69fe1d7', tool_call_id='toolu_01LHm4PMNtQJyCmxrSfQUktk'),
AIMessage(content='これらの情報と危険物消火に関する一般的な知識を組み合わせて分析すると:\n\n1. 二酸化炭素消火器は第4類危険物に適応するとされていますが、これは正しいです。\n\n2. 強化液(霧状)は第4類、第5類、第6類危険物に適応するとされており、これは正しいです。\n\n3. 水(棒状)は第5類、第6類危険物に適応するとされていますが、これは誤りです。水の棒状放射は危険物火災に対して不適切な場合が多く、特に第5類(自己反応性物質)に対しては危険です。\n\n4. 泡消火器は第4類、第5類、第6類危険物に適応するとされており、第6類への適応は確認できました。\n\n5. 粉末消火器(りん酸塩類等)は第4類、第5類危険物に適応するとされており、これは正しいです。\n\nしたがって、選択肢の中で誤っているものは「3: 水(棒状)(第5類、第6類危険物に適応)」です。\n\n水の棒状放射は、危険物火災に対して以下の理由で適していません:\n- 火災物質の飛散を引き起こす可能性がある\n- 特に第5類の自己反応性物質に対しては、水との反応で危険な状況を引き起こす可能性がある\n- 棒状の放射は火災物質を広げる可能性がある\n\n正解は 3 です。', additional_kwargs={}, response_metadata={'id': 'msg_012zhEbWqwJQ5s9aVkKrKtFH', 'model': 'claude-3-5-sonnet-20241022', 'stop_reason': 'end_turn', 'stop_sequence': None, 'usage': {'input_tokens': 1144, 'output_tokens': 462}}, id='run-440d1b5d-4472-478c-9c1f-29eb66a9afc2-0', usage_metadata={'input_tokens': 1144, 'output_tokens': 462, 'total_tokens': 1606, 'input_token_details': {}})]}

動作を見てみると、「危険物 消火器 適応 第4類 第5類 第6類」のようなキーワードで検索を行っています。ここまでは、アプローチとして正しそうです。

検索活動の結果
・第二類の危険物の引火性固体に対しては、二酸化炭素消火器が使用可能である。
・第六類の危険物には泡消火設備が使用可能である。
といった知識を得ることはできています。

一方、「粉末(りん酸塩類等)(第4類、第5類危険物に適応)」が間違っている、というデータを見つけることができなかったために、正しい回答にたどり着けなかったようです。
これは検索の問題ではなく、そもそも、500件の自作問題から生成したメモの中に、当該情報が含まれていなかったからの模様です。

すなわち、試験対策として、自分で問題を自作して勉強を行い、誤った知識の一部修正も行ってみたが、予測のヤマが外れた(試験と学習のドメインがズレていた)ために、正解にたどり着けなかった という状況に至ったようです。


まとめ

エージェントに演習問題を500件ほど自作させ、誤った理解についてはメモを生成し、参照する仕組みを作りました。
自らが「学んだ」問題については、回答精度を上げられそうな手応えが得られました。
一方、「自作した問題」のヤマが試験問題と外れてしまうケースも多いようで、今回構築したような「自習」のプロセスが、うまく結果に結びつかないこともありそうでした。

今後の課題感は以下のとおりです。

  • 過去問や参考書の活用

  • よりスマートな知識の取り出し方の検討

    • 方策1: 自動生成法を工夫する

    • 方策2: データベースを手作業で作り込んでスコアの限界を目指す

以上。


この記事が気に入ったらサポートをしてみませんか?