제타 같은 AI 캐릭터 채팅 앱 만들기: Claude API와 pgvector 기억 검색
AI 캐릭터 채팅 앱의 설정·응답·기억 기능을 만드는 방법을 설명합니다. Claude API의 구조화 출력과 대화 생성, Supabase·pgvector의 기억 검색을 연결하고 자체 개발할 권한·갱신·삭제 로직을 짚습니다.
핵심 요약
1. 성격과 말투를 가진 캐릭터와 대화하고 이전 이야기를 이어가는 AI 캐릭터 채팅 앱을 설계합니다. 2. Claude API로 설정과 응답을 생성하고, 대화 요약·임베딩·Supabase·pgvector를 연결해 필요한 기억을 검색합니다. 3. 설정 검토, 대화 문맥 구성, 사용자별 접근권한과 기억 갱신·삭제는 자체 개발합니다.
제타에서 참고할 사용자 경험과 제작 범위
국내 기업 스캐터랩의 제타(zeta)는 캐릭터와 세계관에 참여해 이야기를 만드는 인터랙티브 엔터테인먼트 서비스입니다. 한국어 웹과 앱 소개에서 참고할 핵심 가치는 원하는 캐릭터를 만들고, 대화로 이야기를 전개하며, 이전 관계와 상황을 이어가는 경험입니다.
이를 제품으로 만들려면 캐릭터 설정, 상황별 응답, 대화 기억을 연결해야 합니다. 스캐터랩은 자체 AI 모델 Spotwrite를 공개하고 있습니다. 이 글의 Claude API·Supabase·pgvector 구성은 유사한 경험을 만들기 위한 구현 대안입니다.
구조화 출력으로 성격·배경·말투를 설정 데이터로 바꾸기
사용자는 캐릭터의 성격, 배경, 말투와 예시 대사를 입력합니다. Claude API의 구조화 출력은 이를 미리 정의한 항목과 형식에 맞춰 반환하는 역할을 맡습니다. 성격·배경·말투 항목을 가진 JSON으로 받으면 편집 화면과 대화 생성 단계에서 같은 설정을 사용할 수 있습니다. JSON은 항목 이름과 값을 묶어 전달하는 데이터 형식입니다.
앱은 필수값과 길이를 검사하고 사용자가 생성된 내용을 검토·수정하도록 합니다. 구조화 출력이 형식을 맞춰도 설정 내용의 일관성까지 보장하지는 않기 때문입니다. 생성 거절이나 출력 길이 제한으로 결과가 완성되지 않으면 입력 보완 또는 재생성을 안내합니다. 최종 출력은 사용자가 확인하고 저장한 캐릭터 설정입니다.

Claude Messages API로 캐릭터 말투 유지하기
응답 생성의 입력은 확정된 캐릭터 설정, 사용자 메시지, 최근 대화와 선별한 기억입니다. Claude Messages API는 전달받은 내용을 바탕으로 다음 대사를 생성합니다. 이전 대화가 다음 요청에 자동 반영되지는 않으므로 서버가 필요한 이력을 매번 구성해 전달합니다.
캐릭터 말투 유지를 위해 앱은 고정 설정과 현재 장면을 구분해 요청에 넣습니다. 자체 로직은 대화 순서를 관리하고, 입력 한도에 맞춰 포함할 기록의 양을 조절합니다. 생성된 대사는 해당 대화방에 저장한 뒤 화면에 표시합니다. AI 챗봇 대화 맥락 유지는 모델 선택과 함께 어떤 정보를 매번 전달할지 설계하는 문제입니다.
대화 요약과 벡터 검색으로 필요한 기억 찾기
캐릭터 챗봇 장기 기억 구현은 저장이 허용된 과거 대화에서 필요한 정보를 다시 꺼내는 작업입니다. Claude API는 사건·관계·선호를 요약합니다. 별도 임베딩 모델은 요약을 의미 비교용 숫자 배열로 변환합니다. 이 값을 이용해 뜻이 가까운 기록을 찾는 방식이 벡터 검색입니다.

요약, 원문 식별자와 임베딩을 Supabase의 데이터베이스에 저장합니다. 새 메시지도 같은 임베딩 모델로 변환하고, PostgreSQL의 오픈소스 확장인 pgvector로 관련 기록을 검색합니다. 자체 로직은 사용자·캐릭터·대화방별 검색 범위를 제한하고 관련성과 최신성을 기준으로 기억을 고릅니다. 출력된 기억 묶음은 다음 응답의 입력에 포함해 이전 사건을 참고하도록 합니다.
Supabase 연결과 기억 관리 로직의 역할 나누기
Supabase의 데이터 접근 API는 저장·조회 요청을 처리하는 창구입니다. supabase-js는 애플리케이션에서 이 API나 데이터베이스 함수를 호출할 때 사용하는 클라이언트 라이브러리입니다. pgvector는 벡터 저장·검색을 담당하며, 대화 요약과 임베딩 생성은 앞서 설명한 AI 처리 단계가 맡습니다. 저장할 대화 데이터는 사용자가 허용한 서비스 내 기록에서 가져옵니다.
접근권한과 기억의 갱신·삭제 규칙은 자체 로직으로 구현합니다. 사용자가 기록을 삭제하면 원문에서 파생된 요약과 벡터에도 삭제가 반영되도록 연결합니다. 캐릭터 설정이 바뀌었을 때 충돌하는 기억을 처리하는 규칙도 필요합니다. 관련 기록을 찾지 못한 경우에는 최근 대화와 확정 설정을 기준으로 응답하도록 설계합니다.

AI 캐릭터 챗봇 개발, 연결된 대화 흐름부터 완성하기
첫 제작 범위는 캐릭터 생성·수정, 한 대화방의 응답 생성, 허용된 기록의 기억 검색으로 잡을 수 있습니다. 말투가 흔들리는 대화, 설정을 바꾼 뒤의 대화, 기억을 삭제한 뒤의 대화를 검수 사례로 구성합니다. 모든 과거 대화를 정확히 기억한다는 목표보다 필요한 기록을 적절하게 선택하고 반영하는지 확인합니다.
연동할 모델의 구조화 출력 지원 여부와 입력 한도, 이용 조건에 맞춰 요청과 실패 처리 방식을 정합니다. 제타의 한국어 안내에서 참고한 기능을 다른 국가·플랫폼·버전에서도 동일하게 제공한다고 가정하지 않고, 만들 제품의 제공 범위를 별도로 확정합니다.
캐릭터 설정, 대화 생성, 기억 검색 중 필요한 기능과 입력 자료, 연결할 업무를 정리해 트램스 AI에 제작을 문의해 주세요. https://trams.co.kr/ai-si/contact/#inquiry
참고 자료
- https://play.google.com/store/apps/details?hl=en&id=com.scatterlab.messenger
- https://zeta-ai.io/ko
- https://play.google.com/store/apps/details?hl=ko&id=com.scatterlab.messenger
- https://scatterlab.com/ko
- https://platform.claude.com/docs/en/build-with-claude/structured-outputs
- https://platform.claude.com/docs/en/build-with-claude/working-with-messages
- https://supabase.com/docs/guides/ai/vector-columns
- https://supabase.com/docs
비슷한 AI 서비스를
사업에 적용하고 싶으신가요?
아이디어와 필요한 기능을 알려주시면 제작 범위와 방법을 검토합니다.