Практические рекомендации: создание системы обнаружения мошенничества с использованием агентов, готовой к эксплуатации
Пошаговое руководство по практическим рекомендациям: создание системы обнаружения мошенничества с использованием агентов, готовой к эксплуатации в производстве: контракты, проверки и готовые блоки кода для команд, разрабатывающих эту архитектуру.
В этом руководстве пошагово описывается путь от сырья до готовой к работе системы для создания системы обнаружения мошенничества с использованием агентов, готовой к промышленному использованию — Часть 1: Полная картина. Основное внимание уделяется практическим шагам, четким проверкам и коду, который можно просто добавить в репозиторий без необходимости догадываться о его назначении. На этапе обзора необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии системы. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия элементам, определите критерии успеха и не допускайте безответственного частичного выполнения задачи.
Форма проблемы
При работе над проектом «Форма сцены» сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Рядом с функциональными результатами записывайте время выполнения и стоимость токенов или запросов. Отображение затрат с самого начала предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Выполняйте контрольные точки после дорогостоящих шагов. Функция возобновления работы не должна снова взимать плату за один и тот же вызов большой языковой модели, когда оператор пытается выполнить следующий узел.
Обзор системы
При работе над этапом обзора системы сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Храните конфигурацию отдельно от кода приложения. Файлы с настройками окружения, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Создавайте контрольные точки после дорогостоящих операций. Функция возобновления работы не должна снова взимать плату за один и тот же вызов большой языковой модели, когда оператор пытается выполнить следующий шаг.
Агентская оркестрация — оценка мошенничества в реальном времени
При работе над этапом реального времени агентской оркестрации сначала запишите контракт: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Документируйте одновременно успешный сценарий и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки. Создавайте контрольные точки после дорогостоящих операций. Функция возобновления не должна снова взимать плату за один и тот же вызов LLM, когда оператор пытается выполнить последующий узел.
Агент A — оценка склонности (обученная модель)
При работе над этапом оценки склонности агента A сначала запишите условия контракта: необходимые входные данные, сигнал успеха и действия при частичной неудаче. Такой чек-лист поможет избежать непреднамеренных изменений в коде позже. Предпочитайте небольшие, тестируемые модули большим скриптам. Если какой-то шаг не сработает, причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. Храните в кэше стабильные инструкции системы и схемы инструментов. Повторная отправка одинаковых данных — частая причина избыточных расходов ресурсов.
Агент B — оценка по поведению (без использования моделей)
При работе над этапом оценки поведения Агента B сначала запишите контракт: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой чек-лист поможет избежать недобросовестных изменений в коде позже. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия элементам, определите критерии успеха и не допускайте молчаливого частичного выполнения задачи. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых данных является распространенной причиной избыточных ресурсов.
Агент C — получение политик через pgvector
При работе над этапом получения политик агента C сначала запишите условия контракта: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает избегать ошибок при последующих изменениях кода. Рядом с функциональными результатами занесите информацию о времени выполнения и стоимости токенов или запросов. Отслеживание затрат с самого начала предотвращает неожиданные расходы при переходе с демо-среды в общедоступные среды. Перед настройкой подсказок измерьте уровень воспроизводимости ответов на фиксированный набор вопросов. Частая смена подсказок редко помогает улучшить качество получения информации.
Инженерные аспекты: то, что не указано в карточке модели
При работе над этапом проектирования компонентов Harness сначала запишите условия работы: необходимые входные данные, сигнал успешного завершения и действия при частичной неисправности. Такой список помогает сохранять честность при последующих изменениях кода. Храните конфигурацию отдельно от кода приложения. Файлы с настройками окружения, хранилища конфиденциальных данных и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Храните в кэше стабильные инструкции системы и схемы инструментов. Повторная отправка одинакового преамбула — частая причина износа оборудования.
"""
SessionMemory — the public interface tying working memory (short-term) and
episodic memory (long-term, cross-session) together for context engineering.
mem = SessionMemory() # new session, fresh UUID
mem.remember("user", "...") # auto-persists to pgvector
mem.remember("assistant", "...")
context = mem.build_context(next_question) # summary + recent turns + relevant past episodes
mem.end_session() # finalize into episodic_memory
"""
"""
In-memory semantic cache in front of episodic recall.
Two layers:
- exact-string embedding cache: a literal repeat query skips the OpenAI
embeddings API call entirely.
- semantic result cache: a near-duplicate query (different wording, same
intent) still needs embedding to compare, but skips the Postgres/pgvector
round-trip if it's cosine-similar enough to something already cached.
Process-local only (not shared across workers/processes) — fine for a
single running service, not a substitute for a distributed cache if this
ever runs behind multiple instances.
Must be invalidated when a new episode is saved: a cached "no good match" or
partial result set can go stale the moment the underlying corpus changes.
"""
"""
Fraud-detection event chain, built on the generic pub-sub bus in
common/pubsub.py:
UserQueryEvent
-> InputGuardrailService -> InputGuardrailPassedEvent | InputGuardrailBlockedEvent
-> OrchestrationService -> OrchestrationCompletedEvent | OrchestrationPausedHITLEvent
-> OutputGuardrailService -> OutputGuardrailPassedEvent | OutputGuardrailBlockedEvent
-> ResultPublisher -> PipelineCompletedEvent
HumanDecisionEvent (resumes a run paused at OrchestrationPausedHITLEvent)
-> OrchestrationService -> ... (same chain onward)
Each service subscribes to exactly one (or two, for resume) event type and
publishes the next event in the chain — a new listener (audit logger,
LangSmith exporter) can subscribe to any event without touching the
publishers. The guardrail/graph calls underneath are synchronous
(psycopg2, HF/OpenAI SDKs); handlers run them via asyncio.to_thread so a
slow call doesn't block the event loop for other in-flight events.
"""
@mcp.tool()
@guarded(action="score_transaction")
def score_propensity(features: dict[str, float], role: str) -> float:
"""Score one transaction's V1-V28 features for ML fraud probability (0-1). Agent A.
Requires role: analyst or admin."""
return score_customer_propensity(features)
@mcp.tool()
@guarded(action="score_transaction")
def score_behavior(customer_id: int, amount: float, category: str, merchant: str, role: str) -> dict:
"""Score one transaction's behavior anomaly vs its category's peer-cohort stats. Agent B.
Requires role: analyst or admin."""
return score_customer_behavior(customer_id, amount, category, merchant)
@mcp.tool()
@guarded(action="chat_query", free_text_arg="query")
def consult_fraud_policy(query: str, role: str, k: int = 3) -> list[dict]:
"""Semantic search over the indexed credit-card policy/handbook documents. Agent C.
Requires role: viewer or higher. `query` is scanned for prompt injection/jailbreak and PII."""
return consult_policy(query, k=k)
if __name__ == "__main__":
mcp.run()
JWT_SECRET_KEY = os.environ["JWT_SECRET_KEY"]
JWT_ALGORITHM = os.environ.get("JWT_ALGORITHM", "HS256")
JWT_EXPIRE_MINUTES = int(os.environ.get("JWT_EXPIRE_MINUTES", "30"))
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
def verify_password(plain_password: str, hashed_password: str) -> bool:
return pwd_context.verify(plain_password, hashed_password)
def get_password_hash(password: str) -> str:
return pwd_context.hash(password)
def get_user(username: str) -> dict | None:
conn = get_connection()
try:
with conn.cursor() as cur:
cur.execute("SELECT * FROM users WHERE username = %s", (username,))
return cur.fetchone()
finally:
conn.close()
def authenticate_user(username: str, password: str) -> dict | None:
user = get_user(username)
if not user or user["disabled"]:
return None
if not verify_password(password, user["hashed_password"]):
return None
return user
Наблюдаемость
При работе над этапом наблюдаемости сначала запишите условия работы системы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность последующих изменений в коде. Документируйте как успешный, так и путь восстановления работы. Повторные попытки, проверки со стороны оператора и обработка некорректных сообщений являются частью продукта, а не элементами последующей доработки. Выполняйте контрольные точки после дорогостоящих операций. Механизм возобновления работы не должен повторно взимать плату за один и тот же вызов большой языковой модели, когда оператор пытается выполнить следующий этап. При работе над этапом наблюдаемости сначала запишите условия работы системы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность последующих изменений в коде. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия соответствующим элементам, определите критерии успеха и не допускайте безответственного частичного выполнения задач.
Развертывание в AWS и фронтенд
Развертывание в AWS и соответствующие этапы работают наилучшим образом, когда их рассматривают как измеримые показатели. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Записывайте временные показатели, а также стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счёты при переходе от демо-среды к общедоступным средам. Сохраняйте структуру графа простой и типизированной; вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, и могут нарушить возобновление работы после прерываний.
Что дальше
Этап «Что дальше» работает наилучшим образом, если рассматривать его как измеримую структуру. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ.
Чек-лист операционной деятельности
Этап чек-листа операционной деятельности работает наилучшим образом, если рассматривать его как измеримую структуру. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ.
Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Когда какой-то шаг терпит неудачу, причина сбоя должна указывать на конкретную ответственность, а не на запутанную цепочку операций.
Сохраняйте состояние графа в виде плоской структуры с явным типированием. Вложенные объекты скрывают информацию о том, какой узел заполнил тот или иной поле, и мешают возобновлению работы после прерываний.
При наличии бюджета добавляйте тесты для проверки критического пути в процессе интеграционного тестирования с использованием фикстур, а не реальных платных API.
Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия результатам обработки, определите критерии успеха и не соглашайтесь на молчаливое частичное выполнение задачи.
Сохраняйте состояние графа в виде плоской структуры с явным типированием. Вложенные объекты скрывают информацию о том, какой узел заполнил тот или иной поле, и мешают возобновлению работы после прерываний.
Перед переходом на новую версию стека заморозьте существующие версии, сохраните эталонный протокол работы критического пути и убедитесь в наличии шагов для отката. В совместных средах необходимы ограничения на частоту запросов, проверки принадлежности ресурсов и четко определенный ответственный за обновление секретов. Предпочитайте надежность любой сложной одноразовой демонстрации.
Примечание к пакету обработки 5d0d59733252: не включайте ключи поставщиков в репозиторий, установите лимит токенов на одну сессию и храните транскрипции рядом с фикстурами для оценки, чтобы последующие замены моделей оставались сопоставимыми.
При работе над этапом 0 записи по усилению безопасности сначала опишите контракт: необходимые входные данные, сигнал успешного выполнения и последствия частичной неудачи. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Если какой-то шаг проваливается, причина неудачи должна указывать на конкретную ответственность, а не на запутанную цепочку операций.
Деталь усиления безопасности 0/721: измерьте время выполнения, класс ошибки и расход токенов для этой записи, затем решите, следует ли сохранять изменение на основе фиксированного набора критериев, а не на основе устных замечаний.
Этап 1 процедуры укрепления безопасности работает наилучшим образом, когда его рассматривают как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Записывайте временные показатели, а также стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам.
Подробность укрепления безопасности 1/721: измерьте время выполнения, класс ошибки и расход токенов для данной записи, затем решите, следует ли сохранять изменения, опираясь на фиксированный набор вопросов, а не на устные описания.
Для этапа 2 процедуры укрепления безопасности определите входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Документируйте как успешный путь выполнения, так и путь восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
Подробности усиления безопасности 2/721: измерьте время выполнения, класс ошибки и расход токенов для этой записи, затем решите, следует ли сохранить изменение на основе фиксированного набора вопросов, а не на основе единичных примеров.
При работе над третьим этапом записи об усилении безопасности сначала запишите контракт: необходимые входные данные, сигнал успешного выполнения и что происходит при частичной неудаче. Такой чек-лист помогает сохранять честность последующих изменений в коде. Рассматривайте этот этап как контракт между входными данными и проверенными выходными данными. Дайте названия элементам, определите критерии успешности и не допускайте безответственного частичного выполнения задач.
Подробности усиления безопасности 3/721: измерьте время выполнения, класс ошибки и расход токенов для этой записи, затем решите, следует ли сохранить изменение на основе фиксированного набора вопросов, а не на основе единичных примеров.
Этап 4 инструкций по усилению безопасности работает наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код.
Подробности усиления безопасности 4/721: измеряйте время выполнения, класс ошибок и расход токенов для этой записи, затем принимайте решение о сохранении изменений на основе фиксированного набора критериев, а не на основе единичных примеров.