Создайте надёжного разговорного ИИ с Parlant: пример страхового агента
Parlant — это фреймворк для создания production-ready ИИ-агентов с предсказуемым и согласованным поведением. Он смещает акцент с хрупкой настройки промптов на разработку, основанную на принципах: правилах, интеграции инструментов и управляемых сценариях диалога.
Зачем использовать Parlant?
Агенты на базе больших языковых моделей часто хорошо проходят тесты, но сталкиваются с проблемами в боевой эксплуатации: игнорируют системные инструкции, выдают неточные ответы в критические моменты или ведут себя непоследовательно между сессиями. Parlant решает эти проблемы, предоставляя механизмы для безопасного и предсказуемого доступа к данным и инструментам, а также для формализации диалоговых сценариев.
Установка и импорт зависимостей
Установите SDK Parlant и импортируйте необходимые модули:
pip install parlant
import asyncio
from datetime import datetime
import parlant.sdk as p
Определение инструментов
Инструменты дают агенту детерминированный доступ к возможностям домена и внешним данным. В примере ниже определены три инструмента для страхового ассистента: получение открытых заявлений, подача новой заявки и получение деталей полиса. Они объявлены как async-функции и помечены @p.tool.
@p.tool
async def get_open_claims(context: p.ToolContext) -> p.ToolResult:
return p.ToolResult(data=["Claim #123 - Pending", "Claim #456 - Approved"])
@p.tool
async def file_claim(context: p.ToolContext, claim_details: str) -> p.ToolResult:
return p.ToolResult(data=f"New claim filed: {claim_details}")
@p.tool
async def get_policy_details(context: p.ToolContext) -> p.ToolResult:
return p.ToolResult(data={
"policy_number": "POL-7788",
"coverage": "Covers accidental damage and theft up to $50,000"
})
Глоссарий и путешествия (Journeys)
Глоссарий хранит важные бизнес-термины и факты, которые агент может использовать (например, номер поддержки или часы работы). Путешествия описывают пошаговые сценарии для типичных задач, чтобы агент мог надежно сопровождать пользователя при подаче заявки или объяснении покрытий.
async def add_domain_glossary(agent: p.Agent):
await agent.create_term(
name="Customer Service Number",
description="You can reach us at +1-555-INSURE",
)
await agent.create_term(
name="Operating Hours",
description="We are available Mon-Fri, 9AM-6PM",
)
async def create_claim_journey(agent: p.Agent) -> p.Journey:
journey = await agent.create_journey(
title="File an Insurance Claim",
description="Helps customers report and submit a new claim.",
conditions=["The customer wants to file a claim"],
)
s0 = await journey.initial_state.transition_to(chat_state="Ask for accident details")
s1 = await s0.target.transition_to(tool_state=file_claim, condition="Customer provides details")
s2 = await s1.target.transition_to(chat_state="Confirm claim was submitted")
await s2.target.transition_to(state=p.END_JOURNEY)
return journey
async def create_policy_journey(agent: p.Agent) -> p.Journey:
journey = await agent.create_journey(
title="Explain Policy Coverage",
description="Retrieves and explains customer's insurance coverage.",
conditions=["The customer asks about their policy"],
)
s0 = await journey.initial_state.transition_to(tool_state=get_policy_details)
await s0.target.transition_to(
chat_state="Explain the policy coverage clearly",
condition="Policy info is available",
)
await agent.create_guideline(
condition="Customer presses for legal interpretation of coverage",
action="Politely explain that legal advice cannot be provided",
)
return journey
Главный запуск и деплой локально
Основной раннер объединяет компоненты: запускает сервер Parlant, создает агент, загружает глоссарий, путешествия и глобальные инструкции, а также добавляет логику разрешения неоднозначных намерений. После запуска UI доступен по адресу http://localhost:8800, где можно протестировать агента в реальном времени.
async def main():
async with p.Server() as server:
agent = await server.create_agent(
name="Insurance Support Agent",
description="Friendly and professional; helps with claims and policy queries.",
)
await add_domain_glossary(agent)
claim_journey = await create_claim_journey(agent)
policy_journey = await create_policy_journey(agent)
# Disambiguation: if intent is unclear
status_obs = await agent.create_observation(
"Customer mentions an issue but doesn't specify if it's a claim or policy"
)
await status_obs.disambiguate([claim_journey, policy_journey])
# Global guideline
await agent.create_guideline(
condition="Customer asks about unrelated topics",
action="Kindly redirect them to insurance-related support only",
)
print(" Insurance Agent is ready! Open the Parlant UI to chat.")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Дальше можно подключать реальные API в инструментах, расширять глоссарий доменными данными и добавлять дополнительные путешествия для других сценариев поддержки.