금융, 의료, 법률처럼 규제가 엄격한 업종에서 AI 챗봇을 들이려고 하면 늘 같은 걱정이 따라오죠. “AI가 규정을 어기면 어떡하지?”, “잘못 안내하면 책임은 누가 지지?”
LLM은 백과사전적 지식을 가진 낯선 사람과 비슷합니다. 아는 건 많은데 우리 회사 사정은 모르니, 선택지가 너무 많아 기대한 대로 움직이지 않습니다. 그렇다고 시스템 프롬프트만으로는 일관된 행동을 보장하기 어렵고, 전통적인 플로우 기반 챗봇은 너무 경직되어 있구요.
이 둘 사이 어딘가에 있는 방법은 없을까요?

이 글에서는 이 문제를 다루는 오픈소스 프레임워크 Parlant를 소개하고, 공식 예제를 바탕으로 보험 상담 에이전트의 뼈대를 만들어 봅니다.
Parlant를 소개합니다
Parlant는 Emcie가 만든 고객 대면용 AI 에이전트 프레임워크입니다. Apache 2.0 라이선스라 상업적으로도 무료로 쓸 수 있습니다.
Parlant는 자기 방식을 Alignment Modeling이라고 부릅니다. 에이전트가 따라야 할 규칙을 긴 프롬프트 하나에 몰아 쓰지 않고, “이런 상황에서는 이렇게 하라”는 작은 단위로 나눠 등록하는 방식입니다. 대화가 진행되면 Parlant가 지금 상황에 맞는 규칙만 골라 LLM에 넘기죠.
플로우 기반 챗봇과 비교하면 이해가 쉽습니다. 플로우 챗봇은 고객을 정해진 대본대로 끌고 가고, 프롬프트만 쓰는 챗봇은 대화는 자연스럽지만 규칙을 지키는지 장담하기 어렵습니다. Parlant는 대화는 자유롭게 두되, 지켜야 할 규칙은 따로 관리하는 쪽입니다.
에이전트를 구성하는 요소는 다음과 같습니다:
- 가이드라인(Guidelines): 상황별 행동 규칙
- 저니(Journeys): 단계가 있는 대화 흐름
- 도구(Tools): 외부 시스템 호출
- 용어집(Glossary): 업종 용어 정의
- 고정 응답(Canned Responses): 늘 같은 문구로 답해야 하는 안내
시작하기
Python 3.10 이상이 필요합니다. 패키지를 설치하고, 사용할 LLM 제공자의 라이브러리도 함께 설치합니다.
# Parlant 설치
pip install parlant
# LLM 제공자 선택 (하나 선택)
pip install anthropic # Claude 사용 시 (권장)
pip install openai # GPT 사용 시
# 추가 의존성
pip install pyyaml python-dotenv
API 키는 환경 변수로 넣어 둡니다.
# Claude 사용 시
export ANTHROPIC_API_KEY='your-api-key'
# OpenAI 사용 시
export OPENAI_API_KEY='your-openai-key'
가장 간단한 에이전트는 이렇습니다.
import asyncio
import parlant.sdk as p
async def main():
async with p.Server() as server:
agent = await server.create_agent(
name="상담원",
description="친절한 보험 상담원"
)
# 가이드라인 추가
await agent.create_guideline(
condition="고객이 인사할 때",
action="밝게 환영하세요"
)
print("에이전트 준비 완료: http://localhost:8800")
asyncio.run(main())
서버를 실행하면 Parlant가 먼저 등록된 가이드라인과 저니를 평가합니다. 대화 중에 빨리 찾아 쓸 수 있도록 미리 준비해 두는 단계죠.

준비가 끝나면 브라우저에서 http://localhost:8800으로 접속해 에이전트와 대화할 수 있습니다.
가이드라인: 상황별 규칙 정하기
가이드라인은 Parlant의 기본 단위입니다. 적용할 상황(condition)과 할 일(action)을 한 쌍으로 등록합니다.
await agent.create_guideline(
condition="제안한 솔루션이 고객에게 효과가 없었을 때",
action="사람 상담원과 대화하기를 원하는지 물어보거나, 계속 문제 해결을 시도할지 선택하게 하세요"
)
가이드라인이 수백 개가 되어도 매번 전부 프롬프트에 넣지 않습니다. Parlant가 지금 대화에 해당하는 것만 골라 쓰고, 이미 적용한 것은 기억해 두었다가 같은 말을 반복하지 않게 하죠.
보험 상담이라면 이런 규칙들을 넣어 볼 수 있습니다:
- 고객이 기왕증(기존 질병)이 있다고 말할 때 → 진단명과 치료 내역을 확인하고, 가입 가능 여부는 심사팀 확인이 필요하다고 안내한다. 즉석에서 가입 가능 여부를 판단하지 않는다.
- 고객이 청구 승인 여부를 물어볼 때 → 심사는 별도 부서에서 약관에 따라 진행된다고 안내하고, 승인 가능성을 예측하지 않는다.
- 보험 상품을 설명할 때 → “이 안내는 약관을 요약한 것이며, 정확한 내용은 약관을 확인하시기 바랍니다”라고 고지한다.
이런 규칙을 넣은 상담원 “김보험”에게 고혈압이 있는데 가입할 수 있는지 물어보았습니다. 아래 화면처럼 즉석에서 가입 가능 여부를 말하지 않고, 진단명과 치료 내역을 알려 주면 심사팀에서 확인한다고 답하네요. 약관 고지 문구도 빠뜨리지 않구요.

규제 업종에서 지켜야 할 것들이 대부분 이런 모양이라, 업무 담당자가 읽고 고치기에도 좋습니다. 에이전트가 기대와 다르게 답하면 그 상황에 맞는 가이드라인을 하나 더 넣어 바로잡는 식으로 다듬어 가면 됩니다.
저니와 도구: 단계가 있는 상담
가입 상담처럼 순서가 있는 대화는 저니로 만듭니다. 대화 단계(chat state)와 도구 호출 단계(tool state)를 이어 붙이고, 고객 응답에 따라 갈라지게 할 수 있습니다.
journey = await agent.create_journey(
title="암보험 가입 상담",
description="고객이 암보험 가입을 고려하는 전체 과정",
conditions=["고객이 보험 가입을 원할 때"]
)
# 첫 단계: 방문 목적 파악
t0 = await journey.initial_state.transition_to(
chat_state="방문 목적을 파악하세요"
)
# 두 번째 단계: 도구로 정보 조회
t1 = await t0.target.transition_to(tool_state=get_available_slots)
# 조건부 분기
await t1.target.transition_to(
chat_state="시간을 확인하고 예약하세요",
condition="고객이 시간을 선택할 때"
)
도구는 @p.tool 데코레이터를 붙인 Python 함수입니다. 예약 확정처럼 실제로 데이터를 바꾸는 도구에는 consequential=True를 붙여 구분해 둡니다.
@p.tool
async def check_insurance_eligibility(
context: p.ToolContext,
customer_age: int,
has_preexisting: bool
) -> p.ToolResult:
"""보험 가입 적격성 확인"""
result = insurance_system.check_eligibility(
age=customer_age,
preexisting_conditions=has_preexisting
)
return p.ToolResult(
success=True,
data={
"eligible": result.eligible,
"notes": result.notes
}
)
# consequential=True: 실제 변경을 일으키는 중요한 작업
@p.tool(consequential=True)
async def schedule_appointment(
context: p.ToolContext,
datetime: datetime
) -> p.ToolResult:
"""예약 확정 (실제 데이터 변경)"""
return p.ToolResult(
data=f"예약이 {datetime}에 확정되었습니다"
)
애매한 질문과 판단 근거
고객이 “지난 방문 후속 조치가 필요해요”라고만 말하면, 예약을 잡으려는 건지 검사 결과를 보려는 건지 알 수 없습니다. 이럴 때는 상황(observation)을 정의하고 후보 저니를 묶어 두면, 에이전트가 먼저 되묻습니다.
# 애매한 상황 정의
status_inquiry = await agent.create_observation(
"고객이 방문 후속 조치를 문의하지만, 어떤 방식인지 불명확함"
)
# 두 Journey 중 선택하도록 유도
await status_inquiry.disambiguate([
scheduling_journey,
lab_results_journey
])
규제 업종에서는 “AI가 왜 이렇게 답했는지”를 설명할 수 있어야 하죠. Parlant는 대화의 매 턴마다 어떤 가이드라인이 매칭되었고 어떤 도구를 불렀는지 로그로 남깁니다. 감사나 내부 품질 점검에 쓸 수 있는 부분입니다.
마무리
여기서는 Parlant의 개념과 가이드라인, 저니, 도구의 기본 사용법만 간단하게 소개했습니다. 용어집, 고정 응답, 운영 환경 배포는 공식 문서에 잘 나와 있으니 참고하세요. 헬스케어 상담 전체 예제도 GitHub에 있습니다.
규칙을 프롬프트 한 덩어리가 아니라 상황별 목록으로 관리한다는 발상이 이 프레임워크의 가장 큰 장점 같습니다. 보험, 금융, 의료처럼 “하지 말아야 할 말”이 분명한 업종이라면 한번 검토해 볼 만하구요. 반대로 단순한 FAQ 봇이라면 이 정도 구조까지는 필요 없을 겁니다.
규정 때문에 AI 상담 도입을 망설이고 있었다면, 작은 시나리오 하나로 먼저 시험해 보세요. 🙂