Class: Chocomint::LLM::VerifierClient

Inherits:
Object
  • Object
show all
Defined in:
lib/chocomint/llm/verifier_client.rb

Overview

副 LLM による意味的検証 (DESIGN §4)。1 または 0 のみを返させる。

Constant Summary collapse

PROMPT_TEMPLATE =
<<~PROMPT
  あなたは厳格な監査器です。

  ユーザー要求:
  %<request>s

  期待条件:
  %<expectations>s

  実行結果:
  %<result>s

  要求が完全に満たされている場合のみ 1 を返してください。
  少しでも不明点・不足・失敗の可能性がある場合は 0 を返してください。
  exit_code が 0 で stdout が要求を満たしていれば、stderr に警告・ログめいた
  文字列が含まれていても、それだけを理由に不合格にしないでください。

  出力は 1 または 0 のみ。
PROMPT
OVERALL_TEMPLATE =

マルチステップ全体の達成判定プロンプト。 単一結果ではなく、これまで実行した全ステップを踏まえて要求全体を評価させる。

<<~PROMPT
  あなたは厳格な監査器です。

  ユーザー要求:
  %<request>s

  期待条件:
  %<expectations>s

  これまでに実行が完了したステップ (順番どおり):
  %<steps>s

  上記のステップ実行の結果として、ユーザー要求が「全体として完全に」満たされたかを判定してください。
  まだ実行すべき作業が残っている、または要求の一部しか満たされていない場合は 0 を返してください。
  要求が過不足なくすべて達成されている場合のみ 1 を返してください。

  出力は 1 または 0 のみ。
PROMPT

Instance Method Summary collapse

Constructor Details

#initialize(base_client:) ⇒ VerifierClient

Returns a new instance of VerifierClient.



50
51
52
# File 'lib/chocomint/llm/verifier_client.rb', line 50

def initialize(base_client:)
  @client = base_client
end

Instance Method Details

#verify(request:, result:, expectations: nil, trace_id: nil) ⇒ Object

戻り値: "1" / "0" / nil(不正出力 -> RETRY 扱い)



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/chocomint/llm/verifier_client.rb', line 73

def verify(request:, result:, expectations: nil, trace_id: nil)
  prompt = format(
    PROMPT_TEMPLATE,
    request: request.to_s,
    expectations: (expectations || "(なし)").to_s,
    result: serialize(result)
  )

  response = @client.create_message(
    messages: [{ "role" => "user", "content" => prompt }],
    trace_id: trace_id
  )

  normalize(extract_text(response))
end

#verify_overall(request:, done_steps:, expectations: nil, trace_id: nil) ⇒ Object

マルチステップ全体の達成判定。戻り値: "1" / "0" / nil(不正 -> 未達成扱い)。 done_steps: [{ tool:, arguments:, result: }, ...] 形式の完了済みステップ列。



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/chocomint/llm/verifier_client.rb', line 56

def verify_overall(request:, done_steps:, expectations: nil, trace_id: nil)
  prompt = format(
    OVERALL_TEMPLATE,
    request: request.to_s,
    expectations: (expectations || "(なし)").to_s,
    steps: serialize_steps(done_steps)
  )

  response = @client.create_message(
    messages: [{ "role" => "user", "content" => prompt }],
    trace_id: trace_id
  )

  normalize(extract_text(response))
end