

# ソースに基づくXプロフィール調査をエージェントのメモリに保存する

ソースから得た事実とエージェントの推測を分けて保存すれば、プロフィールデータの変化に応じて判断を更新できます。Actorは、ホスティング環境で動作するデータ収集プログラムです。Taskは、保存済みの入力プリセットです。Actorがソースのデータ行を収集し、分析は利用者が行います。公開Taskは入力の出発点であり、分析が自動で実行されることの証明ではありません。

X Profile Actorの公開ビルド1.0.4で指定できるのは、既知の公開プロフィールURLまたはハンドルを格納した`profiles`配列だけです。プロフィールの探索、投稿、履歴、言語、`maxItems`に関するパラメーターはありません。

公開されている保存済みTaskのプリセットには、サンプルのプロフィール（`OpenAI`、`NASA`、`elonmusk`）が含まれています。確認を実行する前に、`profiles`のサンプル一覧全体を、実際に調査する1件のプロフィールに置き換えてください。サンプルとして`OpenAI`を実行しないでください。

Actorが返すデータ行には、`input`、`profileId`、`profileUrl`、`handle`、`displayName`、`biography`、`website`、`location`、`followersCount`、`profileMetricStatus`、`status`、`failureCategory`、`statusReason`、`observedAt`のフィールドが含まれます。

OpenAIのプロフィールIDを対象とする、1件のプロフィールだけの対照実行では、確認に成功しました。自己紹介とウェブサイトを取得でき、正確なフォロワー数も得られましたが、所在地は欠損していました。実行結果の要約には、次の値が報告されました。

- `inputCount`: 1
- `datasetRows`: 1
- `usefulRows`: 1
- `billableRows`: 1
- `failedRows`: 0
- `statusCounts`: `{"ok": 1}`
- `stopReason`: `inputs_exhausted`

Actorが返す`profileMetricStatus`フィールドは、個々の指標に、精度を示す`exact`または`unavailable`の値を対応付けたオブジェクトです。この対照実行で証明されたのは、ソースデータを取得できることだけです。メモリへの永続保存、アカウントの同一性の履歴管理、特定分野の専門性の検証、多数のプロフィールを対象とした処理能力の分析は行っていません。

## プロフィールのメモリを管理する手順

1. 既知の公開プロフィールURLまたはハンドルを1件選ぶ前に、具体的な調査上の問いと、そのプロフィールを調べる目的を明示します。プロフィール取得機能が受け付けるのは特定のハンドルまたはURLだけなので、探索、履歴、最大件数の指定は使わないでください。
2. 保存済みのサンプル一覧全体を、読者自身が実際に調査する1件のプロフィールに置き換えた入力でTaskを実行します。ダミーのサンプルを実行するのではなく、`{"profiles": ["https://x.com/YOUR_TARGET_PROFILE"]}`のように、置換箇所が明確なプレースホルダーを使います。
3. Actorが返したデータ行を、日付付きの事実の観測記録として保存します。ローカルの観測ID、Actorのビルド参照情報、収集結果を追加します。profileIdとobservedAtは元の値のまま保持します。
4. ローカルの判断ID、調査上の問い、ルールのバージョン、根拠への参照を含む判断記録を、別に作成します。各参照は、観測IDとbiographyなどのフィールドパスを指すようにします。
5. 解釈は、ソースに実際に書かれた内容だけに対応する、限定的なものにします。フォロワー数を専門性の証拠として扱わないでください。
6. 次のセッションでは、古いデータを上書きせず、Actorが返したデータを新しい観測記録として追加します。事実を比較する前に、同じアカウントであることを確認します。
7. 各判断が依存する根拠を確認します。必要なフィールドが変わった場合は、判断を要再確認にします。再取得に失敗した場合は、古い文章をコピーせず、最新の根拠を取得できない状態として記録します。
8. 現在の事実、根拠のある判断、未取得の情報を小さなパッケージにまとめ、次のエージェントセッションに渡します。すべての判断について、根拠となったソースのフィールドまでたどれるようにします。

## プロフィールを追跡する具体例

以下の例に登場する記録は、すべて本記事で作成した架空のものです。

profileIdがP100の観測記録O1には、自己紹介「Pythonのデータツールを作っています」、ウェブサイトhttps://cedar.example、ソースの状態okが記録されています。ルールR1に基づく判断J1は、自己紹介の記述がPythonのデータツール開発に適合するかどうかについて、適合するとしています。その根拠への参照は、O1のbiographyを指しています。不明点には、実際の投稿と専門性を確認していないことを記載しています。

2回目の確認で得た観測記録O2は、profileIdが同じで、自己紹介は「庭の動画を作っています」に変わり、ウェブサイトは同じままです。J1が依存するbiographyが変わったため、J1を要再確認にします。改訂した判断J2では、ルールR1の下で、現在の自己紹介の記述は適合しないと判断し、O2のbiographyに関連付けます。J1は、O1時点の過去の判断として保持します。ウェブサイトが変わっていなくても、以前の文章を根拠とした分野に関する判断を維持することはできません。

3回目の確認では、ソースからの再取得に失敗し、自己紹介を取得できません。O3に実際の失敗結果と時刻を保存し、最新の根拠を取得できない状態として記録します。O2の自己紹介を、今観測したかのようにO3へコピーしてはいけません。判断J2は、過去の根拠に支えられた解釈として残り、最新の知見にはなりません。

以下の変更不可の観測記録3件と、それらを根拠とする判断記録2件は、本記事で作成した架空のものです。

### 事実の観測記録（変更不可のソースログ）

| 観測ID | 対象の参照情報 | Actorが返した`profileId` | `observedAt` | Actorが返した自己紹介／フィールド | Actorが返した結果／状態 |
| --- | --- | --- | --- | --- | --- |
| `O1` | `https://x.com/user_p100` | `P100` | `2026-10-10T10:00:00Z` | `biography`: "Pythonのデータツールを作っています。"<br>`website`: "https://cedar.example" | `status`: "ok"<br>`failureCategory`: null |
| `O2` | `https://x.com/user_p100` | `P100` | `2026-10-11T10:00:00Z` | `biography`: "庭の動画を作っています。"<br>`website`: "https://cedar.example" | `status`: "ok"<br>`failureCategory`: null |
| `O3` | 対象の参照情報：`P100` | `unknown` | `2026-10-12T10:00:00Z` | `biography`: `unknown`<br>`website`: `unknown` | `status`: "failed"<br>`failureCategory`: "rate_limit" |

*注：`O3`では、過去にActorが返した`P100`の識別情報や自己紹介の値を、取得に失敗した観測記録へコピーすることはありません。対象のハンドルの参照情報は別に保持し、Actorが返すフィールドは`unknown`のままにします。*

### 観測記録を根拠とする判断（エージェントのメモリ記録）

#### 判断`J1`（最初のセッション）

- 判断ID：`J1`
- 問い：このプロフィールは、Pythonのデータツール開発を主な活動としていると述べているか。
- 判定：`stated_bio_fit = yes`
- ルールのバージョン：`R1`
- 根拠への参照：`O1.biography`
- 状態：`historical_at_O1`（当初は`supported`）
- 不明点：実際の投稿や、その分野の専門性を裏付ける事実は確認していません。
- レビュー時刻：`2026-10-10T10:05:00Z`
- 理由：`O1.biography`に基づく最初の評価。

#### 判断`J2`（後続のセッションと再取得の失敗）

- 判断ID：`J2`
- 問い：このプロフィールは、Pythonのデータツール開発を主な活動としていると述べているか。
- 判定：`current_stated_bio_fit = no`
- ルールのバージョン：`R1`
- 根拠への参照：`O2.biography`
- 状態：`fresh_support_unavailable`（`O2`時点の`supported`から、`O3`の失敗後に`fresh_support_unavailable`へ移行）
- 不明点：`O3`での再取得に失敗したため、現在のプロフィールの状態は不明です。投稿も引き続き未確認です。
- レビュー時刻：`2026-10-12T10:01:00Z`
- 理由：`O2.biography`の文章が庭の動画に関する内容に変わったため、`J1`を無効にし、`J2`を作成しました。`O3`が失敗すると、最新の根拠を取得できなくなりました。以前の根拠は、`historical_at_O2`として保持しました。`website`フィールドが変わっていなくても、変更された`biography`を根拠とする判断を、最新の根拠で裏付け直すことはできません。

## 次に行うこと

[Chronometrica X Profile Metrics Actor](https://apify.com/chronometrica/x-profile-metrics)と[X Profile Data API Dataset Task](https://apify.com/chronometrica/x-profile-metrics/examples/x-profile-data-api-dataset)を使って、現在のプロフィールの事実を収集します。日付付きの観測記録を、その記録を根拠とする判断とともに保存し、フィールドへの参照を明示します。そして、現在の根拠、過去の判断、未取得の情報を構造化したパッケージにまとめ、次のエージェントセッションに渡します。

## 出典と参考資料

- [X Profile Data API Dataset](https://apify.com/chronometrica/x-profile-metrics/examples/x-profile-data-api-dataset)