コンテンツにスキップ

エンリッチャー

文書・ページ・チャンクを要約しタグ付けするエンリッチャーを追加します。

エンリッチャーはテキストが何を述べているか何についてかを答えます。Enrichmentsummary(テキスト自身の言語で書かれた散文)と tags(語彙がタクソノミーではなくあなた自身のものである LabelScore の並び)を運びます。これは分類器エンティティ抽出器の隣に立つ 3 つ目の戻り値の形です。分類器はテキストが何であるかを、抽出器は何が名指しされているかを、エンリッチャーは何を述べているかを答えます。単位ごとに 3 つあります。DocumentEnricherPageEnricherChunkEnricher で、1 つのクラスが 3 つすべてを担えます。パッケージ化とインストールは概要の手順に従います。

from typing import Any
from indx_interfaces import (
CapabilityDescriptor,
CapabilityId,
Device,
DocumentEnricher,
EnricherId,
Enrichment,
LabelScore,
PageEnricher,
excerpt,
)
class HeadlineEnricher:
# What a request names in `enrichment.document_ids` or `enrichment.page_ids`.
# IDs are one namespace across all eight annotation ports.
id = EnricherId("acme-headline")
device = Device.CPU
def enrich(self, text: str) -> Enrichment:
# You are handed the whole unit; bound it yourself if your engine needs it.
head = excerpt(text, 200).strip()
if not head:
# Nothing to say is an answer: an empty enrichment lets the next
# enabled enricher speak.
return Enrichment()
# A part you cannot give is left out, not filled with a blank.
return Enrichment(
summary=head.splitlines()[0],
tags=(LabelScore(label="invoice", confidence=0.6),) if "Invoice" in head else (),
)
class Provider:
def descriptors(self) -> tuple[CapabilityDescriptor, ...]:
# This distribution annotates what other capabilities read; it reads nothing.
return ()
def create(self, capability_id: CapabilityId) -> Any:
raise ValueError(f"this provider declares no capabilities, so not {capability_id}")
def __init__(self) -> None:
# One object through two hooks: the registry advertises the ID once and
# would refuse a second instance as a duplicate.
self._enricher = HeadlineEnricher()
def document_enrichers(self) -> tuple[DocumentEnricher, ...]:
return (self._enricher,)
def page_enrichers(self) -> tuple[PageEnricher, ...]:
return (self._enricher,)

各部分は別々に勝ち取られます。 リクエストはエンリッチャーを順に有効化し、要約を持つ最初のものがその単位の要約を、タグを持つ最初のものがタグを取ります。弁護できる部分を出し、もう片方は省いてください。2 つ目のエンリッチャーはあなたのものを置き換えるのではなく、空いた部分を埋めます。空白の要約はモデルが拒否するので、代わりにフィールドを None のままにしてください。

呼び出し側は encode{"enrichment": {"document_ids": ["acme-headline"]}} であなたのものを有効にするか、page_ids で名指しします。インストール済みの ID は機能スナップショットのコンテンツハッシュの外に公表されるので、あなたのものをインストールしても計画は動きません。raise は「自分のもので、壊れている」を意味します。エグゼキューターはログに残し、その単位を飛ばし、実行がすでに対価を払ったエンコードを失敗させるのではなく次のエンリッチャーに尋ねます。devicecost_usd は分類器とまったく同じく既定値付きでクラスから読まれます。ホスト型モデルには Device.EXTERNAL を宣言してください。data_residency を運ぶリクエストは、黙ってテキストを箱の外へ送るのではなく、ソースの取得前に拒否されます。

chunk_enrichers() から宣言し、リクエストはあなたの ID を enrichment.chunk_ids で名指しします。他はすべて同一です。帰結が 2 つ。チャンク粒度が必要です。 CHUNK を求めていないリクエストでチャンクエンリッチャーを名指しすることは取得前の 422 です。そして文書ごとではなくチャンクごとに呼ばれるので、1 回の呼び出しに対価がかかるモデルは、はるかに多くの対価を要します。

エグゼキューターがあなたの回答をどうするか

Section titled “エグゼキューターがあなたの回答をどうするか”

文書エンリッチャーの答えは文書ブロックの metadataenrichment として、あなたが与えた部分だけを持つ Enrichment のシリアライズ形で書かれます。ページエンリッチャーの答えは同じキーで各ページブロックに書かれます。チャンクエンリッチャーの答えは、チャンクブロックがメタデータを持たないため、文書ブロックの chunk_enrichment にチャンクブロック ID をキーとして乗ります。トレースは、あなたが部分を勝ち取ったすべての単位であなたを名指しします。

enrichmentchunk_enrichment は予約されています。どちらかを EncodeRequest に渡した呼び出し側は、上書きされるのではなく拒否されます。

  • 要約はテキストの言語で、散文として書く。空白は決して返さない。
  • 空の部分を返すくらいなら省く。
  • タグに順位を付け、弁護できる信頼度を報告する。何もそれを較正しません。
  • 動けないときは何も公表しない。エクストラなし、モデルなしなら、raise するエンリッチャーではなくエンリッチャーなし。
  • モジュールスコープを安価に保つ。エンジンのインポートは enrich() の内側に、モデルは最初の呼び出しの背後に置く。