Claude로 구축하기 전에

지원 채팅에 Claude 사용 여부 결정

다음은 Claude와 같은 LLM을 사용하여 고객 지원 프로세스의 일부를 자동화해야 하는 주요 지표들입니다:
Claude는 많은 수의 유사한 질문을 효율적으로 처리하는 데 뛰어나며, 인간 에이전트가 더 복잡한 문제에 집중할 수 있도록 해줍니다.
Claude는 방대한 지식 베이스에서 정보를 빠르게 검색, 처리 및 결합할 수 있는 반면, 인간 에이전트는 연구하거나 여러 소스를 참조하는 데 시간이 필요할 수 있습니다.
Claude는 피로 없이 24시간 지원을 제공할 수 있는 반면, 지속적인 커버리지를 위해 인간 에이전트를 배치하는 것은 비용이 많이 들고 어려울 수 있습니다.
Claude는 추가 직원을 고용하고 교육할 필요 없이 쿼리 볼륨의 급격한 증가를 처리할 수 있습니다.
Claude에게 브랜드의 톤과 가치를 일관되게 대표하도록 지시할 수 있는 반면, 인간 에이전트는 커뮤니케이션 스타일이 다를 수 있습니다.
다른 LLM보다 Claude를 선택하는 몇 가지 고려사항:
  • 자연스럽고 미묘한 대화를 우선시하는 경우: Claude의 정교한 언어 이해는 다른 LLM과의 채팅보다 더 인간적으로 느껴지는 자연스럽고 맥락을 인식하는 대화를 가능하게 합니다.
  • 복잡하고 개방형 쿼리를 자주 받는 경우: Claude는 정형화된 응답을 생성하거나 사용자 발화의 순열에 대한 광범위한 프로그래밍을 요구하지 않고 광범위한 주제와 문의를 처리할 수 있습니다.
  • 확장 가능한 다국어 지원이 필요한 경우: Claude의 다국어 기능을 통해 각 지원 언어에 대해 별도의 챗봇이나 광범위한 번역 프로세스 없이 200개 이상의 언어로 대화할 수 있습니다.

이상적인 채팅 상호작용 정의

고객이 Claude와 언제 어떻게 상호작용할 것으로 예상하는지 정의하기 위해 이상적인 고객 상호작용을 개요로 작성하세요. 이 개요는 솔루션의 기술적 요구사항을 결정하는 데 도움이 됩니다. 다음은 자동차 보험 고객 지원을 위한 채팅 상호작용 예시입니다:
  • 고객: 지원 채팅 경험을 시작
    • Claude: 고객을 따뜻하게 맞이하고 대화를 시작
  • 고객: 새 전기차에 대한 보험에 대해 문의
    • Claude: 전기차 보장에 대한 관련 정보 제공
  • 고객: 전기차 보험의 고유한 요구사항과 관련된 질문
    • Claude: 정확하고 유익한 답변으로 응답하고 소스에 대한 링크 제공
  • 고객: 보험이나 자동차와 관련 없는 주제 외 질문
    • Claude: 관련 없는 주제는 논의하지 않는다고 명확히 하고 사용자를 자동차 보험으로 다시 안내
  • 고객: 보험 견적에 관심 표현
    • Claude: 적절한 견적을 결정하기 위해 일련의 질문을 하고, 그들의 응답에 적응
    • Claude: 사용자로부터 수집한 필요한 정보와 함께 견적 생성 API 도구 사용 요청 전송
    • Claude: API 도구 사용으로부터 응답 정보를 받고, 정보를 자연스러운 응답으로 종합하여 제공된 견적을 사용자에게 제시
  • 고객: 후속 질문
    • Claude: 필요에 따라 후속 질문에 답변
    • Claude: 고객을 보험 프로세스의 다음 단계로 안내하고 대화를 마무리
자신의 사용 사례에 대해 작성하는 실제 예시에서는 이 상호작용에서 실제 단어를 작성하는 것이 유용할 수 있습니다. 이를 통해 Claude가 가져야 할 이상적인 톤, 응답 길이 및 세부 수준에 대한 감각을 얻을 수 있습니다.

상호작용을 고유한 작업으로 분해

고객 지원 채팅은 질문 답변부터 정보 검색, 요청에 대한 조치 취하기까지 여러 다른 작업의 집합으로, 단일 고객 상호작용에 포함됩니다. 구축을 시작하기 전에 이상적인 고객 상호작용을 Claude가 수행할 수 있기를 원하는 모든 작업으로 분해하세요. 이를 통해 모든 작업에 대해 Claude를 프롬프트하고 평가할 수 있으며, 테스트 케이스를 작성할 때 고려해야 할 상호작용 범위에 대한 좋은 감각을 얻을 수 있습니다.
고객들은 때때로 사용자 요청에 따른 가능한 대화 변곡점의 상호작용 플로우차트로 이를 시각화하는 것이 도움이 된다고 생각합니다.
다음은 위의 보험 상호작용 예시와 관련된 주요 작업들입니다:
  1. 인사 및 일반 안내
    • 고객을 따뜻하게 맞이하고 대화 시작
    • 회사 및 상호작용에 대한 일반 정보 제공
  2. 제품 정보
    • 전기차 보장에 대한 정보 제공
      이는 Claude가 맥락에서 필요한 정보를 가지고 있어야 하며, RAG 통합이 필요할 수 있음을 의미합니다.
    • 전기차 보험의 고유한 요구사항과 관련된 질문에 답변
    • 견적이나 보험 세부사항에 대한 후속 질문에 답변
    • 적절한 경우 소스에 대한 링크 제공
  3. 대화 관리
    • 주제(자동차 보험)에 집중
    • 주제 외 질문을 관련 주제로 다시 안내
  4. 견적 생성
    • 견적 자격을 결정하기 위한 적절한 질문
    • 고객 응답에 따른 질문 조정
    • 수집된 정보를 견적 생성 API에 제출
    • 제공된 견적을 고객에게 제시

성공 기준 설정

지원 팀과 협력하여 명확한 성공 기준을 정의하고 측정 가능한 벤치마크와 목표가 있는 상세한 평가를 작성하세요. 다음은 Claude가 정의된 작업을 얼마나 성공적으로 수행하는지 평가하는 데 사용할 수 있는 기준과 벤치마크입니다:
이 지표는 Claude가 다양한 주제에 걸쳐 고객 문의를 얼마나 정확하게 이해하는지 평가합니다. 대화 샘플을 검토하고 Claude가 고객 의도, 중요한 다음 단계, 성공적인 해결책이 무엇인지 등을 올바르게 해석했는지 평가하여 측정하세요. 95% 이상의 이해 정확도를 목표로 하세요.
이는 Claude의 응답이 고객의 특정 질문이나 문제를 얼마나 잘 다루는지 평가합니다. 대화 세트를 평가하고 각 응답의 관련성을 평가하세요(규모를 위해 LLM 기반 채점 사용). 90% 이상의 관련성 점수를 목표로 하세요.
맥락에서 Claude에게 제공된 정보를 기반으로 사용자에게 제공되는 일반 회사 및 제품 정보의 정확성을 평가하세요. 이 소개 정보에서 100% 정확도를 목표로 하세요.
제공되는 링크나 소스의 빈도와 관련성을 추적하세요. 추가 정보가 도움이 될 수 있는 상호작용의 80%에서 관련 소스를 제공하는 것을 목표로 하세요.
Claude가 주제에 얼마나 잘 집중하는지 측정하세요. 예를 들어, 우리 예시 구현에서는 자동차 보험 주제입니다. 응답의 95%가 자동차 보험이나 고객의 특정 쿼리와 직접 관련되도록 목표로 하세요.
Claude가 정보 콘텐츠를 생성할 때를 결정하는 데 얼마나 성공적인지와 그 콘텐츠가 얼마나 관련성이 있는지 측정하세요. 예를 들어, 우리 구현에서는 Claude가 견적을 생성할 때를 얼마나 잘 이해하고 그 견적이 얼마나 정확한지를 결정할 것입니다. 이는 성공적인 고객 상호작용에 중요한 정보이므로 100% 정확도를 목표로 하세요.
이는 Claude가 쿼리에 인간 개입이 필요한 때를 인식하고 적절히 에스컬레이션하는 능력을 측정합니다. 올바르게 에스컬레이션된 대화의 비율 대 에스컬레이션되었어야 하지만 되지 않은 대화를 추적하세요. 95% 이상의 에스컬레이션 정확도를 목표로 하세요.
다음은 지원에 Claude를 사용하는 비즈니스 영향을 평가하는 데 사용할 수 있는 기준과 벤치마크입니다:
이는 Claude가 대화 전반에 걸쳐 고객 감정을 유지하거나 개선하는 능력을 평가합니다. 감정 분석 도구를 사용하여 각 대화의 시작과 끝에서 감정을 측정하세요. 상호작용의 90%에서 감정이 유지되거나 개선되는 것을 목표로 하세요.
인간 개입 없이 챗봇이 성공적으로 처리한 고객 문의의 비율입니다. 문의의 복잡성에 따라 일반적으로 70-80%의 편향 비율을 목표로 합니다.
고객이 챗봇 상호작용에 얼마나 만족하는지 측정합니다. 일반적으로 상호작용 후 설문조사를 통해 수행됩니다. 5점 만점에 4점 이상의 CSAT 점수를 목표로 하세요.
챗봇이 문의를 해결하는 데 걸리는 평균 시간입니다. 이는 문제의 복잡성에 따라 크게 다르지만, 일반적으로 인간 에이전트보다 낮은 AHT를 목표로 합니다.

Claude를 고객 서비스 에이전트로 구현하는 방법

적절한 Claude 모델 선택

모델 선택은 비용, 정확도 및 응답 시간 간의 트레이드오프에 따라 달라집니다. 고객 지원 채팅의 경우, claude-opus-4-1-20250805는 지능, 지연 시간 및 비용의 균형을 맞추는 데 적합합니다. 그러나 RAG, 도구 사용 및/또는 긴 맥락 프롬프트를 포함한 여러 프롬프트가 있는 대화 흐름이 있는 경우, 지연 시간을 최적화하기 위해 claude-3-haiku-20240307이 더 적합할 수 있습니다.

강력한 프롬프트 구축

고객 지원에 Claude를 사용하려면 Claude가 적절히 응답할 수 있는 충분한 방향과 맥락을 가지면서도 광범위한 고객 문의를 처리할 수 있는 충분한 유연성을 가져야 합니다. 시스템 프롬프트부터 시작하여 강력한 프롬프트의 요소를 작성해 보겠습니다:
IDENTITY = """당신은 Acme Insurance Company의 친근하고 지식이 풍부한 AI 어시스턴트 Eva입니다. 
당신의 역할은 고객을 따뜻하게 맞이하고 자동차 보험과 전기차 보험을 포함한 
Acme의 보험 상품에 대한 정보를 제공하는 것입니다. 또한 고객이 보험 요구사항에 
대한 견적을 받을 수 있도록 도울 수 있습니다."""
지시사항을 사용자 대화와 분리하는 방법으로 시스템 프롬프트 내에 모든 정보를 넣고 싶을 수 있지만, Claude는 실제로 첫 번째 User 턴 내에 작성된 프롬프트 콘텐츠의 대부분과 함께 가장 잘 작동합니다(역할 프롬프팅만 예외). 시스템 프롬프트로 Claude에게 역할 부여에서 자세히 읽어보세요.
복잡한 프롬프트를 하위 섹션으로 나누고 한 번에 한 부분씩 작성하는 것이 가장 좋습니다. 각 작업에 대해 Claude가 작업을 잘 수행하는 데 필요한 프롬프트 부분을 정의하는 단계별 프로세스를 따르면 더 큰 성공을 거둘 수 있습니다. 이 자동차 보험 고객 지원 예시에서는 “인사 및 일반 안내” 작업부터 시작하여 프롬프트의 모든 부분을 조각별로 작성할 것입니다. 이는 또한 전체 프롬프트의 개별 부분을 더 빠르게 조정할 수 있어 프롬프트 디버깅을 더 쉽게 만듭니다. 이 모든 조각들을 config.py라는 파일에 넣겠습니다.
STATIC_GREETINGS_AND_GENERAL = """
<static_context>
Acme Auto Insurance: 도로 위의 신뢰할 수 있는 동반자

소개:
Acme Insurance에서는 귀하의 차량이 단순한 교통수단 이상이라는 것을 이해합니다. 그것은 인생의 모험으로 가는 티켓입니다.
1985년부터 우리는 운전자들이 자신감을 가지고 탐험하고, 통근하고, 여행할 수 있도록 하는 자동차 보험 정책을 만들어왔습니다.
도시 거리를 탐색하든 전국을 횡단하는 여행을 떠나든, Acme이 귀하와 귀하의 차량을 보호합니다.
우리의 혁신적인 자동차 보험 정책은 작은 접촉사고부터 대형 충돌까지 모든 것을 보장하며 귀하의 고유한 요구사항에 맞게 설계되었습니다.
Acme의 수상 경력에 빛나는 고객 서비스와 신속한 클레임 해결로 귀하는 운전의 즐거움에 집중할 수 있고 나머지는 저희가 처리합니다.
우리는 단순한 보험 제공업체가 아닙니다. 우리는 인생 여정의  부조종사입니다.
Acme Auto Insurance를 선택하고 우수한 보장과 진정한 관심이 주는 확신을 경험하세요. Acme에서는 단순히 
귀하의 자동차를 보험에 가입시키는 것이 아니라 열린 도로에서의 모험에 연료를 공급합니다.

참고: 우리는 또한 전기차에 대한 전문 보장을 제공하여 모든 유형의 자동차 운전자가 우리의 보호 혜택을 받을 수 있도록 합니다.

Acme Insurance는 다음 제품을 제공합니다:
- 자동차 보험
- 전기차 보험
- 이륜차 보험

영업 시간: 월-금, 오전 9시 - 오후 5시 EST
고객 서비스 번호: 1-800-123-4567
</static_context>
"""
그런 다음 자동차 보험 및 전기차 보험 정보에 대해서도 동일하게 수행하겠습니다.
STATIC_CAR_INSURANCE="""
<static_context>
자동차 보험 보장:
Acme의 자동차 보험 정책은 일반적으로 다음을 보장합니다:
1. 책임 보장: 귀하가 타인에게 입힌 신체 상해 및 재산 피해에 대한 비용을 지불합니다.
2. 충돌 보장: 사고 시 귀하의 자동차 손상에 대한 비용을 지불합니다.
3. 종합 보장: 비충돌 사고로 인한 귀하의 자동차 손상에 대한 비용을 지불합니다.
4. 의료비 보장: 사고 후 의료비를 지불합니다.
5. 무보험/저보험 운전자 보장: 불충분한 보험을 가진 운전자에게 치인 경우 귀하를 보호합니다.

선택적 보장에는 다음이 포함됩니다:
- 렌터카 상환
- 도로변 지원
- 신차 교체
</static_context>
"""

STATIC_ELECTRIC_CAR_INSURANCE="""
<static_context>
전기차 보험:
우리의 전문 전기차 보험은 전통적인 자동차 보장을 넘어서 
귀하의 하이테크 투자에 맞춤형 보호를 제공합니다. 표준 보장 외에도 다음을 제공합니다:
- 비싼 배터리 시스템 보호
- 가정용 충전 장비 보장
- 빠르게 진화하는 전기차 세계에 적응

Rivian, Nissan Leaf, Chevrolet Bolt 또는 
기타 전기차를 운전하든, 우리의 지식이 풍부한 에이전트가 
모든 전자 동력 마일을 즐길 수 있는 자신감을 주는 정책을 만들 준비가 되어 있습니다.
</static_context>
"""
이제 정적 콘텐츠가 있으므로 Claude의 응답을 안내하기 위해 최소 4-5개의 “좋은” 상호작용 샘플을 추가해 보겠습니다. 이러한 예시는 이상적인 고객 상호작용을 대표해야 하며 가드레일, 도구 호출 등을 포함할 수 있습니다.
EXAMPLES="""
고객과 상호작용할 수 있는 몇 가지 예시입니다:

<example 1>
H: 안녕하세요, 소규모 비즈니스를 위한 상업 보험을 제공하나요?

A: 아! 안타깝게도 현재 상업 보험은 제공하지 않습니다. 
하지만 자동차 보험과 전기차 보험을 포함한 다양한 개인 보험 상품을 제공합니다. 
이러한 상품에 대해 더 알고 싶으시나요?
</example 1>

<example 2>
H: 안녕하세요, 영업 시간이 어떻게 되나요?

A: 저희 영업 시간은 월요일부터 금요일까지 오전 9시부터 오후 5시 EST입니다. 
질문이 있거나 도움이 필요하시면 해당 시간 동안 언제든지 연락해 주세요. 
오늘 또 어떻게 도와드릴까요?
</example 2>

<example 3>
H: 자동차 보험을 알아보고 있습니다. Acme에서는 무엇을 제공하나요?

A: 좋은 선택입니다! Acme의 자동차 보험 정책에는 일반적으로 다음이 포함됩니다:
- 책임 보장: 사고에서 귀하가 과실인 경우 보호
- 충돌 보장: 사고 시 귀하의 자동차 손상 비용 지불
- 종합 보장: 도난이나 기물 파손과 같은 비충돌 사고 보장
- 의료비 보장: 사고 후 의료비 지불
- 무보험/저보험 운전자 보장: 불충분한 보험을 가진 운전자로부터 보호

또한 렌터카 상환, 도로변 지원, 신차 교체와 같은 선택적 보장도 제공합니다. 
이러한 보장 중 어떤 것에 대해 더 자세한 정보를 원하시나요, 아니면 귀하의 차량 보험에 대한 구체적인 질문이 있으신가요?
</example 3>

<example 4>
H: 전기차 보험에 대해 듣고 싶습니다.

A: 물론입니다! 저희 전기차 보험은 전기차 소유자의 고유한 요구사항을 충족하도록 특별히 설계되었습니다. 
일반 자동차에 제공하는 모든 표준 보장 외에도 전기차 정책에는 다음이 포함됩니다:

- 배터리 보장: 차량의 비싼 배터리 시스템 손상이나 성능 저하에 대한 보호
- 기술 패키지: 고급 전자 장치 및 온보드 컴퓨터 시스템의 수리 또는 교체 보장
- 충전소 보장: 가정용 및 휴대용 충전 장비 보호
- 사이버 보안 보호: 해킹이나 디지털 위협에 대한 보장
- 전문 도로변 지원: 차량 하부를 보호하기 위한 플랫베드 견인 포함

Tesla, Rivian, Nissan, Chevrolet 등의 인기 모델을 포함한 광범위한 전기차를 보장합니다. 
보험에 가입하려는 특정 전기차가 있으신가요, 아니면 이러한 보장 중 어떤 것에 대해 더 자세한 정보를 원하시나요?
</example 4>

<example 5>
H: 자동차 보험 견적을 받고 싶습니다.

A: 물론입니다! 자동차 보험 견적을 받는 데 기꺼이 도와드리겠습니다. 
정확한 견적을 제공하기 위해 귀하의 차량과 주 운전자에 대한 정보를 수집해야 합니다. 
기본 사항부터 시작해 보겠습니다:

1. 귀하의 차량의 제조사와 모델은 무엇인가요?
2. 몇 년도에 제조되었나요?
3. 대략 몇 마일을 운전하셨나요?
4. 주 운전자의 나이는 어떻게 되나요?

이 정보를 제공해 주시면 견적 도구를 사용하여 개인 맞춤형 보험 견적을 생성해 드리겠습니다.
</example 5>
"""
또한 Claude가 고객과 상호작용하는 방법에 대한 해야 할 일과 하지 말아야 할 일을 설명하는 중요한 지침을 포함하고 싶을 것입니다. 이는 브랜드 가드레일이나 지원 정책에서 나올 수 있습니다.
ADDITIONAL_GUARDRAILS = """다음 가드레일을 준수해 주세요:
1. 저희 상품에 나열된 보험 유형에 대한 정보만 제공하세요.
2. 저희가 제공하지 않는 보험 유형에 대해 질문받으면 정중하게 
해당 서비스를 제공하지 않는다고 말하세요.
3. 미래 제품 제공이나 회사 계획에 대해 추측하지 마세요.
4. 권한이 없는 약속을 하거나 계약을 체결하지 마세요.
정보와 안내만 제공합니다.
5. 경쟁업체의 제품이나 서비스를 언급하지 마세요.
"""
이제 이 모든 섹션을 프롬프트로 사용할 단일 문자열로 결합해 보겠습니다.
TASK_SPECIFIC_INSTRUCTIONS = ' '.join([
   STATIC_GREETINGS_AND_GENERAL,
   STATIC_CAR_INSURANCE,
   STATIC_ELECTRIC_CAR_INSURANCE,
   EXAMPLES,
   ADDITIONAL_GUARDRAILS,
])

도구 사용으로 동적 및 에이전틱 기능 추가

Claude는 클라이언트 측 도구 사용 기능을 사용하여 동적으로 조치를 취하고 정보를 검색할 수 있습니다. 프롬프트가 활용해야 하는 외부 도구나 API를 나열하는 것부터 시작하세요. 이 예시에서는 견적 계산을 위한 하나의 도구부터 시작하겠습니다.
참고로, 이 도구는 실제 계산을 수행하지 않고, 지정된 인수와 함께 도구를 사용해야 한다는 신호를 애플리케이션에 보낼 뿐입니다.
보험 견적 계산기 예시:
TOOLS = [{
  "name": "get_quote",
  "description": "사용자 입력을 기반으로 보험 견적을 계산합니다. 반환 값은 월별 보험료입니다.",
  "input_schema": {
    "type": "object",
    "properties": {
      "make": {"type": "string", "description": "차량의 제조사."},
      "model": {"type": "string", "description": "차량의 모델."},
      "year": {"type": "integer", "description": "차량이 제조된 연도."},
      "mileage": {"type": "integer", "description": "차량의 주행거리."},
      "driver_age": {"type": "integer", "description": "주 운전자의 나이."}
    },
    "required": ["make", "model", "year", "mileage", "driver_age"]
  }
}]

def get_quote(make, model, year, mileage, driver_age):
    """월별 보험료를 USD로 반환합니다"""
    # http 엔드포인트나 데이터베이스를 호출하여 견적을 가져올 수 있습니다.
    # 여기서는 1초의 지연을 시뮬레이션하고 고정 견적 100을 반환합니다.
    time.sleep(1)
    return 100

프롬프트 배포

평가를 실행하고 테스트 프로덕션 설정에서 배포하지 않고는 프롬프트가 얼마나 잘 작동하는지 알기 어려우므로 프롬프트, Anthropic SDK 및 사용자 인터페이스용 streamlit을 사용하여 작은 애플리케이션을 구축해 보겠습니다. chatbot.py라는 파일에서 Anthropic SDK와의 상호작용을 캡슐화할 ChatBot 클래스를 설정하는 것부터 시작하세요. 클래스에는 두 가지 주요 메서드가 있어야 합니다: generate_messageprocess_user_input.
from anthropic import Anthropic
from config import IDENTITY, TOOLS, MODEL, get_quote
from dotenv import load_dotenv

load_dotenv()

class ChatBot:
   def __init__(self, session_state):
       self.anthropic = Anthropic()
       self.session_state = session_state

   def generate_message(
       self,
       messages,
       max_tokens,
   ):
       try:
           response = self.anthropic.messages.create(
               model=MODEL,
               system=IDENTITY,
               max_tokens=max_tokens,
               messages=messages,
               tools=TOOLS,
           )
           return response
       except Exception as e:
           return {"error": str(e)}

   def process_user_input(self, user_input):
       self.session_state.messages.append({"role": "user", "content": user_input})

       response_message = self.generate_message(
           messages=self.session_state.messages,
           max_tokens=2048,
       )

       if "error" in response_message:
           return f"오류가 발생했습니다: {response_message['error']}"

       if response_message.content[-1].type == "tool_use":
           tool_use = response_message.content[-1]
           func_name = tool_use.name
           func_params = tool_use.input
           tool_use_id = tool_use.id

           result = self.handle_tool_use(func_name, func_params)
           self.session_state.messages.append(
               {"role": "assistant", "content": response_message.content}
           )
           self.session_state.messages.append({
               "role": "user",
               "content": [{
                   "type": "tool_result",
                   "tool_use_id": tool_use_id,
                   "content": f"{result}",
               }],
           })

           follow_up_response = self.generate_message(
               messages=self.session_state.messages,
               max_tokens=2048,
           )

           if "error" in follow_up_response:
               return f"오류가 발생했습니다: {follow_up_response['error']}"

           response_text = follow_up_response.content[0].text
           self.session_state.messages.append(
               {"role": "assistant", "content": response_text}
           )
           return response_text
      
       elif response_message.content[0].type == "text":
           response_text = response_message.content[0].text
           self.session_state.messages.append(
               {"role": "assistant", "content": response_text}
           )
           return response_text
      
       else:
           raise Exception("오류가 발생했습니다: 예상치 못한 응답 유형")

   def handle_tool_use(self, func_name, func_params):
       if func_name == "get_quote":
           premium = get_quote(**func_params)
           return f"견적 생성됨: 월 ${premium:.2f}"
      
       raise Exception("예상치 못한 도구가 사용되었습니다")

사용자 인터페이스 구축

main 메서드와 함께 이 코드를 Streamlit으로 테스트 배포하세요. 이 main() 함수는 Streamlit 기반 채팅 인터페이스를 설정합니다. app.py라는 파일에서 이를 수행하겠습니다
import streamlit as st
from chatbot import ChatBot
from config import TASK_SPECIFIC_INSTRUCTIONS

def main():
   st.title("Acme Insurance Company의 어시스턴트 Eva와 채팅하기🤖")

   if "messages" not in st.session_state:
       st.session_state.messages = [
           {'role': "user", "content": TASK_SPECIFIC_INSTRUCTIONS},
           {'role': "assistant", "content": "이해했습니다"},
       ]

   chatbot = ChatBot(st.session_state)

   # 처음 두 개를 건너뛰고 사용자 및 어시스턴트 메시지 표시
   for message in st.session_state.messages[2:]:
       # 도구 사용 블록 무시
       if isinstance(message["content"], str):
           with st.chat_message(message["role"]):
               st.markdown(message["content"])

   if user_msg := st.chat_input("여기에 메시지를 입력하세요..."):
       st.chat_message("user").markdown(user_msg)

       with st.chat_message("assistant"):
           with st.spinner("Eva가 생각하고 있습니다..."):
               response_placeholder = st.empty()
               full_response = chatbot.process_user_input(user_msg)
               response_placeholder.markdown(full_response)

if __name__ == "__main__":
   main()
다음으로 프로그램을 실행하세요:
streamlit run app.py

프롬프트 평가

프롬프팅은 프로덕션 준비가 되기 위해 종종 테스트와 최적화가 필요합니다. 솔루션의 준비 상태를 결정하기 위해 정량적 및 정성적 방법을 결합한 체계적인 프로세스를 사용하여 챗봇 성능을 평가하세요. 정의된 성공 기준을 기반으로 강력한 경험적 평가를 만들면 프롬프트를 최적화할 수 있습니다.
Claude Console에는 이제 다양한 시나리오에서 프롬프트를 테스트할 수 있는 평가 도구가 있습니다.

성능 향상

복잡한 시나리오에서는 표준 프롬프트 엔지니어링 기법가드레일 구현 전략을 넘어 성능을 향상시키기 위한 추가 전략을 고려하는 것이 도움이 될 수 있습니다. 다음은 몇 가지 일반적인 시나리오입니다:

RAG로 긴 맥락 지연 시간 줄이기

대량의 정적 및 동적 맥락을 다룰 때 프롬프트에 모든 정보를 포함하면 높은 비용, 느린 응답 시간 및 맥락 창 한계에 도달할 수 있습니다. 이 시나리오에서 검색 증강 생성(RAG) 기법을 구현하면 성능과 효율성을 크게 향상시킬 수 있습니다. Voyage와 같은 임베딩 모델을 사용하여 정보를 벡터 표현으로 변환함으로써 더 확장 가능하고 반응성이 좋은 시스템을 만들 수 있습니다. 이 접근 방식은 모든 프롬프트에 가능한 모든 맥락을 포함하는 대신 현재 쿼리를 기반으로 관련 정보를 동적으로 검색할 수 있게 합니다. 지원 사용 사례를 위한 RAG 구현 RAG 레시피는 광범위한 맥락 요구사항이 있는 시스템에서 정확도를 높이고, 응답 시간을 줄이며, API 비용을 줄이는 것으로 나타났습니다.

도구 사용으로 실시간 데이터 통합

계정 잔액이나 정책 세부사항과 같은 실시간 정보가 필요한 쿼리를 다룰 때 임베딩 기반 RAG 접근 방식은 충분하지 않습니다. 대신 도구 사용을 활용하여 챗봇이 정확한 실시간 응답을 제공하는 능력을 크게 향상시킬 수 있습니다. 예를 들어, 도구 사용을 통해 고객 정보를 조회하고, 주문 세부사항을 검색하며, 고객을 대신하여 주문을 취소할 수 있습니다. 도구 사용: 고객 서비스 에이전트 레시피에 설명된 이 접근 방식을 통해 실시간 데이터를 Claude의 응답에 원활하게 통합하고 더 개인화되고 효율적인 고객 경험을 제공할 수 있습니다.

입력 및 출력 가드레일 강화

특히 고객 서비스 시나리오에서 챗봇을 배포할 때 오용, 범위 외 쿼리 및 부적절한 응답과 관련된 위험을 방지하는 것이 중요합니다. Claude는 본질적으로 이러한 시나리오에 탄력적이지만, 챗봇 가드레일을 강화하기 위한 추가 단계는 다음과 같습니다:
  • 환각 줄이기: 사실 확인 메커니즘과 인용을 구현하여 제공된 정보에 응답을 근거로 합니다.
  • 정보 교차 확인: 에이전트의 응답이 회사 정책 및 알려진 사실과 일치하는지 확인합니다.
  • 계약상 약속 피하기: 에이전트가 권한이 없는 약속을 하거나 계약을 체결하지 않도록 합니다.
  • 탈옥 완화: 무해성 스크린 및 입력 검증과 같은 방법을 사용하여 사용자가 모델 취약점을 악용하여 부적절한 콘텐츠를 생성하는 것을 방지합니다.
  • 경쟁업체 언급 피하기: 브랜드 집중을 유지하고 경쟁업체의 제품이나 서비스를 언급하지 않도록 경쟁업체 언급 필터를 구현합니다.
  • Claude를 캐릭터로 유지: 길고 복잡한 상호작용 중에도 Claude가 스타일이나 맥락을 바꾸지 않도록 방지합니다.
  • 개인 식별 정보(PII) 제거: 명시적으로 요구되고 승인되지 않는 한 응답에서 PII를 제거합니다.

스트리밍으로 인지된 응답 시간 줄이기

잠재적으로 긴 응답을 다룰 때 스트리밍을 구현하면 사용자 참여와 만족도를 크게 향상시킬 수 있습니다. 이 시나리오에서 사용자는 전체 응답이 생성될 때까지 기다리는 대신 점진적으로 답변을 받습니다. 스트리밍을 구현하는 방법은 다음과 같습니다:
  1. Anthropic Streaming API를 사용하여 스트리밍 응답을 지원합니다.
  2. 들어오는 텍스트 청크를 처리하도록 프론트엔드를 설정합니다.
  3. 실시간 타이핑을 시뮬레이션하여 각 청크가 도착하는 대로 표시합니다.
  4. 사용자가 이동했다가 돌아올 경우 전체 응답을 볼 수 있도록 전체 응답을 저장하는 메커니즘을 구현합니다.
경우에 따라 스트리밍은 점진적 표시가 더 긴 처리 시간의 영향을 완화하므로 더 높은 기본 지연 시간을 가진 더 고급 모델의 사용을 가능하게 합니다.

챗봇 확장

챗봇의 복잡성이 증가함에 따라 애플리케이션 아키텍처도 이에 맞게 발전할 수 있습니다. 아키텍처에 추가 레이어를 추가하기 전에 다음과 같은 덜 포괄적인 옵션을 고려하세요:
  • 프롬프트를 최대한 활용하고 프롬프트 엔지니어링을 통해 최적화하고 있는지 확인하세요. 프롬프트 엔지니어링 가이드를 사용하여 가장 효과적인 프롬프트를 작성하세요.
  • 프롬프트에 추가 도구(프롬프트 체인 포함 가능)를 추가하고 필요한 기능을 달성할 수 있는지 확인하세요.
챗봇이 매우 다양한 작업을 처리하는 경우 초기 고객 쿼리를 라우팅하기 위해 별도의 의도 분류기를 추가하는 것을 고려할 수 있습니다. 기존 애플리케이션의 경우 이는 분류기를 통해 고객 쿼리를 라우팅한 다음 전문화된 대화(자체 도구 세트 및 시스템 프롬프트 포함)로 라우팅하는 의사결정 트리를 만드는 것을 포함합니다. 이 방법은 지연 시간을 증가시킬 수 있는 Claude에 대한 추가 호출이 필요합니다.

Claude를 지원 워크플로에 통합

우리의 예시는 Streamlit 환경 내에서 호출 가능한 Python 함수에 초점을 맞췄지만, 실시간 지원 챗봇을 위해 Claude를 배포하려면 API 서비스가 필요합니다. 이에 접근하는 방법은 다음과 같습니다:
  1. API 래퍼 생성: 분류 함수 주위에 간단한 API 래퍼를 개발하세요. 예를 들어, Flask API 또는 Fast API를 사용하여 코드를 HTTP 서비스로 래핑할 수 있습니다. HTTP 서비스는 사용자 입력을 받아 어시스턴트 응답을 전체적으로 반환할 수 있습니다. 따라서 서비스는 다음과 같은 특성을 가질 수 있습니다:
    • 서버 전송 이벤트(SSE): SSE는 서버에서 클라이언트로 응답을 실시간으로 스트리밍할 수 있게 합니다. 이는 LLM과 작업할 때 부드럽고 상호작용적인 경험을 제공하는 데 중요합니다.
    • 캐싱: 캐싱을 구현하면 응답 시간을 크게 향상시키고 불필요한 API 호출을 줄일 수 있습니다.
    • 맥락 유지: 사용자가 이동했다가 돌아올 때 맥락을 유지하는 것은 대화의 연속성에 중요합니다.
  2. 웹 인터페이스 구축: Claude 기반 에이전트와 상호작용하기 위한 사용자 친화적인 웹 UI를 구현하세요.