- AI
- RAG
- 엔지니어링
고객 지원을 위한 RAG: AI 응답을 실제로 정확하게 만드는 방법
일반 LLM은 그럴듯한 답을 지어냅니다. 검색 증강 생성(RAG)은 AI가 여러분의 콘텐츠에 근거해 답하게 합니다. AskAIs가 이를 어떻게 하는지 단계별로 살펴봅니다.
AskAIs 팀
읽는 데 7분
일반 LLM에 “비밀번호를 어떻게 재설정하나요?”라고 물으면 그럴듯하지만 아마 틀린 답이 돌아옵니다. 버튼도, 절차도, URL도 다릅니다. RAG(검색 증강 생성)는 모델이 답하기 전에 여러분의 콘텐츠에서 알맞은 청크를 프롬프트에 넣어 이 문제를 해결합니다.
파이프라인 한눈에 보기
세 단계: 수집, 검색, 생성.
1. 수집
- PDF, DOCX, TXT, Markdown, CSV, JSON 파일을 업로드하거나, 웹사이트를 크롤링하거나, Training에서 Q&A 쌍을 추가합니다.
- 워커가 텍스트를 추출해 약 2,000자(대략 500 토큰) 단위의 청크로 나누며, 청크끼리 200자씩 겹칩니다. Q&A 쌍은 각각 하나의 청크로 유지됩니다.
- 각 청크는
text-embedding-3-small(1,536차원)로 임베딩됩니다. - 청크는
pgvector확장과 코사인 거리용 HNSW 인덱스를 갖춘 PostgreSQL에 저장됩니다.
2. 검색
방문자의 메시지에 사실 정보가 필요하면, 최근 메시지를 임베딩하고 워크스페이스의 청크를 대상으로 코사인 거리 검색을 실행합니다. 인사와 잡담은 이 단계를 건너뜁니다. 쿼리를 단순화하면 다음과 같습니다:
-- Simplified. The real query also checks that the document is
-- ready, enabled, in date and visible on the visitor's platform.
SELECT c.id, c.content,
1 - (c.embedding <=> $1::vector) AS similarity
FROM knowledge_chunks c
WHERE c.tenant_id = $2
ORDER BY c.embedding <=> $1::vector
LIMIT $3; -- 3 × top-K candidates, re-ranked afterwards필요한 수의 세 배만큼 후보를 가져와 다시 순위를 매기고, 유사도 임계값(약 0.3) 미만은 버리고, 문서당 최대 두 개의 청크만 남긴 뒤, 상위 다섯 개(기본값)를 모델에 전달합니다.
3. 생성
청크는 구분된 참고 블록에 담겨 시스템 프롬프트 뒤에 추가됩니다. 모델은 이 블록을 지시가 아닌 데이터로 다루고, 질문에 답하는 참고 자료만 사용하며, 거기에 없는 제품 정보를 지어내지 말라는 지시를 받습니다.
방문자가 제품 정보를 물었는데 관련 내용을 찾지 못하면 모델을 아예 호출하지 않습니다. 방문자에게는 해당 정보가 없다고 안내하고, 자동 인계가 꺼져 있지 않다면 채팅은 사람에게 넘어갑니다.
비용 줄이기
큰 지식 베이스를 부담 없는 비용으로 운영하게 해 주는 세 가지:
- 임베딩 캐시: 같은 검색 텍스트는 같은 임베딩을 얻습니다. 키는 모델 이름과 텍스트의 SHA-1 해시를 합친 값이며, Redis에 24시간 동안 보관됩니다.
- 프롬프트 캐싱: Claude 모델의 경우 요청에서 Anthropic에 프롬프트 캐싱을 요청하고, OpenAI는 긴 프롬프트를 자동으로 캐시합니다. 참고 블록은 답변마다 바뀌므로 주로 프롬프트의 고정된 부분이 효과를 봅니다.
- 임계값 기반 건너뛰기: 임계값을 넘는 청크가 없으면 프롬프트에 아무것도 추가하지 않습니다.
RAG로 충분하지 않을 때
RAG는 “어떻게 하나요?” 유형의 질문을 잘 처리합니다. 하지만 “제 주문은 어디 있나요?”에는 답할 수 없습니다. 그 데이터는 문서에 없기 때문입니다.
이런 경우를 위해 AskAIs에는 Custom tools가 있습니다. 주문, 예약, 재고처럼 여러분 시스템의 HTTP 엔드포인트를 설명해 두면, AI가 답변을 작성하는 동안 이를 호출할 수 있습니다. 일반적인 질문은 지식으로, 개인적인 질문은 여러분의 시스템으로 답하고, 나머지는 팀에게 넘어갑니다.