垂直市場エージェントの構築
特定の業界と都市において汎用モデルを凌駕するチャットエージェント。事前計算された実際のデータダイジェストを保持し、会話中にライブレコードを取得できます。完了 = URL上で稼働し、基盤データに基づいた数値を回答し、保持していない数値は生成せず、実際のプローブ(ローカルテストではない)で本番環境で検証された状態です。
ステップ0: オーナーが答える2つの質問
- どの都市か、そしてなぜその都市か? すでに現地調査や、そこで文字通り真実であるデータがある場所を選んでください。都市をマイニングし、その後 そこで広告を出します。
- 広告が行われ、リンクされるのか? これには4つのエンジニアリング上の判断がかかっています(ピクセル、キャッシュTTL、バニティURL、アトリビューション)。ステップ7を参照してください。
ステップ1: コードを書く前に堀を見つける
2つの種類: マイニングして所有するコーパス(例: 数万件のレビュー)、またはジョイン(販売中のライブフィードと郡の区画、評価、税務記録の結合: 誰も組み合わせようとしない2つの無料ソース)。有料の一括列挙はしばしば失敗します(クレジット切れ、所有者検索がない)。
一括列挙が壁に囲まれている場合、エントリーポイントはデータではなく制約です。 任意の住所には答えるが何もリストしない郡のアプリは、他の場所で住所を列挙できれば問題ありません(ステップ3)。
非開示州はチャンスです: 競合他社を含め誰も販売比較データを持っていないため、郡自身の算術をうまく整理したものが最良のアンカーになります。
ステップ2: 基盤を構築する
すべてのメッセージでサーバー側でシステムプロンプトに注入される、固定されたJSONダイジェスト。
- まずパネルサイズを確認(レビューコーパスエージェントの場合)。「あなたのような場所でのランキング」には、それぞれ50件以上のレビューを持つ約50以上のビジネスが必要です。それ以下の場合は、ランキングを出荷しないでください。
- モデルが書いたセクタープロファイルは基盤ではありません。 モデルが書いた散文をロードすることは、モデルがすでに知っていることを伝え、堀を一切作りません。基盤は測定されたものです。
- 欠落データはバックログであり、ブロッカーではありません: パネルをマイニングする手段を所有しているなら、マイニングしてください。
- マイニング前にライセンスを確認してください。 一部のソースのデータは再配布できず、マイニングされたパネルがダウンロード可能になるかどうかが決まります。
- すべてのブロックには
_interpretationが含まれます: それが何を意味し、専門家がどのように使用するかについての2〜4文。バイトあたりの価値が最も高く、暗唱と推論の違いです。 - バイト安定出力:
sort_keys=True、同点は一意のフィールドで解決される完全ソート、generated_onを除いてタイムスタンプなし。1バイトの変動があると、すべてのメッセージでキャッシュされたプレフィックスが再請求されます。 - レイヤー化し、より優れたレイヤーが古いものを置き換えることを許可します。2つのブロックが1つの質問に対して異なる数値を与えると、モデルは回答の途中で調停します。ブロックが混在している場合は、サブキーレベルで置き換えます。
- 完全版をアーカイブし、コンパクト版を出荷します(
.compact.jsonツイン)。ツインがない場合はアーカイブにフォールバックします。 - 個人のメールアドレスをマージされた調査からスクラブします: 広告規模では、モデルが一人の公務員の受信トレイをあなたのアウトバウンドチャネルに変えます。部署+電話で同じことを伝えられます。
ステップ3: 記録がカバーできないものを列挙する
薄いリスティングフィードはほとんど何も見えません。**小さな円のグリッドで「近くを検索」**し、各ヒットを郡の記録にジョインします(1回の実行: 307の複合施設 -> 208の一致した区画 -> 9,736ユニット)。
- 小さな円(約3.9kmグリッド上で約3.5km): APIは1回の呼び出しあたりの結果を制限するため、1つの都市全体のクエリは、最もよく知られた場所のみを静かに返します。
- 公開記録に何かを決定させる、列挙したソースではなく(ディレクトリで「アパート」とされていても郡の記録では介護施設となっているもの; 「多世帯」とタグ付けされた中古車販売店)。
- 何もリストされていない市場では、話す価値のある人々は売っていない人々です。
ステップ4: データの落とし穴(2回読むこと)
ここでのすべてのバグは、エラーではなく、もっともらしい誤った数値を生成しました。既知の正しいフィクスチャに対してQA時間を予算化してください。
- 説明に基づいて計画する前に、ソースに再クエリを実行してください。 ドキュメント内のレイヤー名は仮説です。サービスのメタデータ(ArcGISの場合は
?f=json、editingInfo.dataLastEditDate)と実際のフィールド値を読み、フィールド名を信頼する前に確認してください。 - 既知のものに対して検証してください。 36ユニットあることがわかっている建物が10ユニットとしてパースされた: 1つのフィクスチャが最悪のバグを発見しました。さらに良いのは、出力のサンプルを異なる座標フレームで発行元の独自APIに送り返し、比較することです。
- 外れ値だけでなく、逆転にも注意してください: 大規模な物件よりも1戸あたりの評価額が高い小規模物件は、市場ではなくパーサーが間違っていることを意味します。
- データ自体をチェックさせてください。 クロスチェックが存在する場合(ユニットあたりの平方フィート)、あいまいなフィールドの両方の読み取り値を計算し、もっともらしい範囲に選択させます。どちらも適合しない場合は、フラグを立てて除外します。
- 集約する前に重複排除してください。 1つの物件を、それが該当するすべての資産タイプでリストするフィード: 623行が206の物件でした。
- パース済みではなく、RAWをキャッシュしてください。そうしないと、パーサーの修正は小さな郡のサーバーの再クロールを意味します。
- 住所フォーマットはレコードインデックスと異なります。 方向を省略し、接尾辞を削除します。バリアントラダーで約半数のミスを回復しました。
- 小さなサンプルにはそのnをラベル付けしてください。薄さ自体が発見である場合があります。
- レビューコーパスでは、シェアではなくMATCHESを読んでください。 すべてのタクソノミ正規表現を実際の1〜3つ星のテキストに対して実行し、マッチしたものを読んでください。セクターのサービス動詞は、しばしば害の動詞です:
cut (me|my)に対する「傷害」パターンは、サロンの苦情の10.7%にマッチし、ほとんどは「自分の髪を切るために$40払った」というものでした。drill(歯科)、pull(レッカー)、strip( detailing)、break(ガラス)、shave/clip(理容、グルーミング)、stick(採血)を確認してください。そして、誰も提起しないテーマは残ります。 - 発行元の語彙は購入者の語彙ではありません。 郡の「幹線」クラスは、何も面していない高速道路ネットワークである可能性があり、ブローカーが意味する商業通りは「集散道路」である可能性があります。マッピングする前に各バケットの内容をリストし、それらが含むものに基づいてフィールドに名前を付けます。
- 共有スキーマは列名を共有しますが、規則は共有しません。 郡をまたがって、1つのフィールドが4つの分類システム、
-9999vs0、3つ目の固定資産税評価額を運ぶことができます。郡ごとに各フィールドを調査します。ある郡からのゼロは、証明されるまでクエリバグとして扱います。派生テストを優先します(空室の場合、建物価格=0かつ土地価格>0)。 - 1つの名前は複数のものを指します(高速道路とそのフロンテージロードが名前を共有しています)。代替案を返し、モデルにどれを使用したかを言わせます。
- 「一度」交わるべきものが何度も交わります(2つの道路が6か所で交差しています)。点を平均化するとフィールドに着地します。クラスタリングし、各場所を保持し、指定されたルールで選択します。
- 派生合計値は、計算しなかった行を静かにドロップします。 部分的な入力がある合計値とともにカバレッジカウントを出荷し、それを下限として読み取らせます。
ステップ5: 決定論的な計算はツールに、プロンプトには決して入れない
DSCR、IRR、キャッシュオンキャッシュ、投与量、税金: ツールで計算し、その前提と警告を返します。モデルの算術はもっともらしく間違っています(実際は1.09のDSCRが1.19と出て貸し手に送られます)。これにより、実際のエージェントループ(ストリーム -> ツール実行 -> フィードバック -> ストリーム)が強制され、pause_turnとmax_tokensの処理も含まれます。
ステップ6: プロンプトコストの測定
- APIでトークンをカウントしてください。 密なJSONは約4ではなく、約2.4バイト/トークンで動作します。
- テストでバイト/トークンの上限を強制してください: コンパクトツインの代わりにアーカイブを出荷しても、請求書以外に症状は現れません。
- キャッシュTTLはトラフィックに従います。 まばらで手動共有: 5分のデフォルト(1時間書き込みは、誰も再利用しない追加料金です)。継続的な有料トラフィック: 1時間。訪問者がプレフィックスを共有するためです。
ステップ7: 出荷
- 1つのジェネレーターからページを派生させてください。すべての置換は、そのアンカーが存在することをアサートし、ガードは両方向をチェックします(削除されたコンテンツはなくなったことと、機能が存続したこと)。
- 広告先の場合: バニティURLは一時的リダイレクトとして(恒久的なものは広告プラットフォームによってキャッシュされます)、クエリ文字列が存続することを確認します。キャンペーンごとのピクセルイベント名。キャッシュTTL 1時間。そしてアトリビューションはランディングヒットの
sessionStorageに固定され、すべてのターンで運ばれます(localStorageではありません。そうしないと、来週のオーガニック訪問が今日の広告のクレジットになります)。 - ビルドログではなく、デプロイ状態を確認してください。サーバーレス関数の制限やトレースされていないファイルが、緑色のログの背後で失敗する可能性があります。バンドラーが含めるように、データファイルを静的にインポートします。
プロンプトの厳格なルール
- 数値を決してでっち上げないこと。 基盤、実際に実行されたツール呼び出し、またはフラグ付きの推定値のみ。
- 公開記録の値を市場価値として提示しないこと。 どちらを提供しているかを述べてください。
- ツールの説明とプロンプトの両方にカバレッジ境界(どの郡か)を記載すること。 片方だけのルールは回避されます。
- 公開記録は1つずつ、一覧では提供しないこと。 質問された物件の所有者検索は問題ありませんが、一括の名前と住所の名簿は、営利目的での使用において州の公開記録法に違反する可能性があります。
- プロンプトが不可能と述べていることを再確認すること。 知り得ないことについての自信に満ちた虚偽は、ギャップよりも悪いです。
コンテキストレイヤーのためのリサーチエージェント
並行リサーチエージェントにトークン予算(および2.4バイト/トークンの比率)を与え、注意書きよりも数値を削るように指示し、以前の作業を修正することを期待します。
ステップ8: セクター外のエンディング
一部の訪問者はそのユーザーではありません(レストランエージェントでの古着屋)。デフォルトの「それはありません」は、次に構築するセクターを挙げる実際のオーナーという、得られる最高のシグナルを失います。
flag_out_of_scope(sector)ツール: クライアントは3つのタップ可能なオプションをレンダリングします。submit_feature_requestツールがタップをファイルします。- 最初の返信ですべてを: セッション深度の中央値は1ターンです。
- 代わりにエージェントが何を保持しているかを列挙しない(1つのカットで返信が1,275文字から124文字になりました)。
- オプションはクライアントレンダリングされ、散文の番号付きリストではありません(裸の「2」はスキル2をトリガーする可能性があります)。
- オプションがどこにレンダリングされるかをモデルに伝えてください。モデルはクライアントを見ることができません。
- オプションをユニバーサルな機能にマッピングして、ファイルされたリクエストがセクターのための機能に名前を付けるようにします。
ステップ9: 空間レイヤー(「これは何の隣か」)
- 郡のArcGIS Online組織を見つけてください、WAFでブロックされたGISホストではなく。ホストされたサービスはしばしば匿名で提供されます。レイヤーのネイティブ空間参照系でジオメトリをリクエストしてください。
- 2つのソースが出会うとき、最初のソースのフレームで2番目のソースをリクエストし(
outSR)、行を出力する前に範囲が重なっていることをアサートしてください。フレームの不一致は何も交差せず、「すべての区画が非ゾーニング」と報告します。DuckDBでは、ST_Transformはalways_xy := trueが必要です。そうしないと、静かにPOINT(inf inf)を返します。 - セントロイドによるゾーニング; 分割ゾーニングにはシェアしきい値が必要です(区画の5%以上)。地区ではなくポリゴンを比較します。単純な交差は区画の37%を分割と呼びました。しきい値は約4%を与えました。
- 都市のゾーニングコードはその都市のものです。 同じコードが隣接する異なる地区を意味します。すべてのコードとともに都市と公開名を出荷してください。
- オフラインで事前計算し、ジオメトリフリーのインデックスを出荷し、APIルートを追加しないでください: 郡GIS -> DuckDB空間ミラー -> 1つのコミットされたJSONインデックス。ランタイムはルックアップとhaversineのみを行います。失敗する空間依存関係は、空の隣接リスト、または自信に満ちた誤った回答に劣化します。ロード時にインデックスを検証し、エラーをスローしてください。
- 空間ジョイン内のどこかに不等式があると、空間述語がポストフィルターに格下げされます(
ON a.id < b.id AND ST_Intersects(...)は約290億ペアをテストしました)。述語を単独で立て、EXPLAINでSPATIAL_JOINを確認し、キーを出力してから重複排除します。7分で未完了が19秒になりました。 - 出荷するインデックスの範囲は、購入者が取引するものとその直接の隣接物に限定し、「コンテキスト」区画にはより少ないデータが含まれることをフラグ付けします。