HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

UnsiloedとTypeSafe Jevによるドキュメントレビュー

Document Review with Unsiloed and TypeSafe Jev (unsiloed.ai)

11 pointsby ritzaco2 コメント

要約

このブログ記事では、UnsiloedとTypeSafeのJevを連携させることで、ドキュメントから抽出された情報の正確性を高める方法について説明しています。Unsiloedは構造化されたフィールドを抽出し、Jevは抽出された情報に対して定義された質問を行い、その妥当性を評価します。この組み合わせにより、OCRの失敗や一般的な間違いを含む、レビューが必要なフィールドを効率的に特定できます。記事では、具体的な薬剤リストの例を用いて、このワークフローの仕組みと、抽出スコアとJevの評価結果をどのように組み合わせてレビューが必要な箇所を判断するかを解説しています。

全文翻訳

← ブログに戻る 抽出パイプラインは値を正しく読み取っても、下流に誤ったデータを渡してしまう可能性があります。OCR(光学文字認識)の精度が高くても、はっきりと印刷された余分なゼロはそのまま残ります。UnsiloedとTypeSafeのJevを一緒に使用することで、OCRの失敗やドキュメントの一般的な間違いをチェックするのに役立ちます。Unsiloedは構造化されたフィールドを抽出し、ページ上のそれらの位置を特定します。Jevは抽出された情報を、焦点を絞った質問に対して評価します。これらの結果を組み合わせて、どのフィールドがレビューを必要とするかを決定できます。 Jevは焦点を絞った質問を型付きの回答に変換します。 Jevのリクエストでは、それが考慮する情報(状態)と、それが下す決定(質問)を分離します。私たちのワークフローでは、状態にはUnsiloedが抽出したレコードと、それらを解釈するために必要なコンテキストが含まれます。各質問はJevに何をチェックするか、そしてどの回答タイプを返すかを指示します。また、可能な回答の基準を定義することもできます。タイプは、私たちのコードが受け取るものを決定します。 Noulは、ステートメントが真である確率を返します。Choiceは、名前付きオプションから選択します。Scoreは、順序付けられたレベルのルーブリックを評価します。ChoiceとScoreは、確率分布と、その集中度を要約する信頼度値も返します。Noulには個別の信頼度フィールドはありません。3つのタイプは、図に示すように、単一のリクエストで状態を共有できます。後で、例ではNoulのみを使用します。Noul値が0.04であるということは、質問に対する「はい」の確率が4%であり、強い「いいえ」を意味します。「Jevは4%の信頼度を持っている」という意味ではありません。どちらかの端に近い値は明確な方向を示しますが、中央に近い値は注意が必要です。 Unsiloedの抽出フィールドをJevに送信し、結果をルーティングします。 Unsiloedは印刷されているものを保持し、曖昧な読み取りを特定するのに役立つ信頼度スコアを提供します。例では、6行の薬剤リストを使用します。コーヒーの染みが1つの投与量を不明瞭にし、別の行にははっきりと印刷されているがもっともらしい量が含まれています。これらを抽出とJevのチェックの両方を通過させます。抽出スキーマは、Unsiloedが各薬剤に対して返すフィールドを定義します。通常の処方慣行から驚くべき量や不明瞭なテキストを推測することなく、量と単位を含む完全な投与量セルを要求します。enable_citations=trueでソース引用を有効にし、Jevの状態を構築する前に抽出ジョブが完了するのを待ちます。各フィールドには2つのUnsiloed信頼度スコアがあります。extraction_scoreは抽出された値に対する信頼度を測定し、grounding_scoreは値がドキュメント内で特定されたことに対する信頼度を測定します。どちらも0から1の範囲です。引用は、そのページとバウンディングボックス、つまりソーステキストの周りの長方形を識別します。 ここに保存された応答からの、染みのついたセチリジン投与量のピクセル座標(元の1200 x 1500画像上)を示します。 ```json { "value": "1 tablet", "score": { "grounding_score": 0.76, "extraction_score": 0.74 }, "citation": { "page": 1, "bbox": [582, 975, 649, 994], "page_width": 1200, "page_height": 1500 } } ``` 各薬剤行に、抽出されたフィールドとその引用とともに、row-5のようなIDを割り当てておきます。これにより、コードは後でJevの回答を同じ行に一致させることができます。レビュー担当者が元のページで各抽出フィールドを見つけられるように、引用を保持します。 Jevに抽出された値とコンテキストを送信します。Jevは画像やUnsiloedスコアを見ずに、指示を抽出されたものとして評価します。各行にNoul質問を1つ尋ねます:この投与量と頻度は、この薬剤に対してもっともらしいか?6行すべてが1つのリクエストを共有し、各質問は独立して評価されます。 2つのAPIを接続するサーバーサイドモジュールでは、このリクエストを構築します(1行とその質問を示します)。 ```javascript const request = { model: "jev-1.13.0", state: { context: "Check for obvious quantity, unit or frequency errors. " + "Dose means amount taken each time, not supply quantity. " + "Do not assess patient-specific safety or propose corrections.", careContext: "Adult outpatient medication reconciliation, age 52", medications: [ { id: "row-5", medicine: "Cetirizine 10 mg tablet", dose: "1 tablet", frequency: "Once daily as needed", route: "Oral", instructions: "For allergy symptoms." } ] }, questions: { "row-5": { type: "noul", instructions: { question: "Is the extracted dose and frequency plausible on its " + "face for this medicine and strength in the stated adult " + "outpatient context, without an obvious quantity or " + "frequency transcription error?", row_id: "row-5" }, criteria: { true: "Plausible on its face; no obvious quantity, unit or frequency error.", false: "Clearly implausible; warrants review of the original prescription." } } } }; ``` ここではコンテキストと基準は短縮されています。記録されたリクエストには、正確なテキストと6行すべてが含まれています。行に回答を一致させるために、row-5を質問IDとして使用します。また、Jevがどのレコードを評価するかを知るために、それを指示内のrow_idとしても含めます。質問IDはモデルには送信されません。 リクエストをJSON形式で https://api.typesafe.ai/v1/systemone にPOSTします。Authorization: Bearer <API_KEY> ヘッダーでTypeSafe APIキーを使用して認証し、キーはサーバー上に保持します。 記録された回答 answers["row-5"] は次のようになります。 ```json { "type": "noul", "noul": 0.94 } ``` この回答を、共有IDを使用して保存されたrow-5抽出に一致させます。私たちのコードは、その行がレビューを必要とするかどうかを決定します。 読み取りチェックの場合、行のフィールド全体で最も低いUnsiloedスコアを採用します。したがって、いずれかのフィールドでスコアが低いと、行全体がフラグ付けされます。もっともらしさチェックの場合、Jevのnoul値を使用します。 同じモジュールで、これらの2つの値をreadingとplausibleとしてこの関数に渡します。この関数は、行をレビューに送信する理由、またはどちらのチェックもフラグ付けしない場合は空の配列を返します。 ```javascript const valid = n => Number.isFinite(n) && n >= 0 && n <= 1; function reviewReasons(reading, plausible) { return [ ...(!valid(reading) || reading < 0.90 ? ["Verify source reading"] : []), ...(!valid(plausible) || plausible < 0.50 ? ["Review instruction"] : []) ]; } ``` ここでは、読み取りスコアが0.90未満、またはもっともらしさの回答が0.50未満の場合にレビューがトリガーされます。これらは例のカットオフ値です。本番環境で使用する前に、手動でレビューされたドキュメントでテストしてください。Jevの回答が0.50に近い場合も、賛成も反対も明確に支持されていないため、レビューが必要になる場合があります。両方の理由が両方のチェックに失敗した場合に保持します。もっともらしい指示でも誤読されたテキストが含まれている可能性があるため、高いJevの回答が低いUnsiloedスコアをキャンセルしてはなりません。 元の抽出とJevのリクエストおよび応答を、レビュー担当者の決定とともに保存して、後で行がフラグ付けされた理由とどのように解決されたかを確認できるようにします。 フラグ付けされた行を抽出からレビューまで追跡します。 保存されたAPI結果をステップ実行して、Unsiloedが何を読み取り、Jevが何をチェックし、なぜ2つのフラグ付けされた行が異なる種類のレビューを必要とするかを確認します。 染みのついたセチリジンの投与量について、Unsiloedは「1 tablet」を抽出スコア0.74、グラウンディングスコア0.76で抽出します。Jevはもっともらしさに対して0.94を返しますが、染みを見ることはありません。その判断は、抽出されたテキストが正しいことに依存します。読み取りチェックは、不明瞭なマークを確認する必要があるため、依然として行をフラグ付けします。 イブプロフェン行はパターンを逆転させます。Unsiloedは「10 tablets, three times daily」を両方のスコア0.99で読み取ります。Jevは同じもっともらしさの質問に対して0.04を返します。レビュー担当者は、はっきりと印刷された指示を調査する必要があります。 どちらのモデルも、想定される意図された投与量を代用しません。各チェックは、もう一方が見逃すレビューの必要性をフラグ付けします。他の4行は両方のデモしきい値を超えます。記録された応答がそれを示しています。 説明とルーティングラベルは私たちのアプリケーションから来ています。Jevはこれらの説明ではなく、型付きの回答を返します。 ドキュメントあたりのJevの追加量 このデモの1つの薬剤リストは、6つの質問と1,812の入力トークンを持つJevリクエストを生成します。Jev 1.13.0の公開価格である10億入力トークンあたり42ドル(2026年9月30日時点)、出力は無料(確認済み)で、ドキュメントあたり約0.000076ドル追加されます。同様のドキュメントを100,000件処理すると、Jevの料金は約7.61ドルになります。これはJevのみの推定値です。Unsiloedの抽出