import axios from 'axios';
const API_KEY = process.env.API_KEY;
// ① 역할 + ② 배경 지식 + ③ 행동 규칙 + ④ 출력 형식 + ⑤ 거절 규칙
const RETURN_AGENT_SYSTEM = `
당신은 신선식품 쇼핑몰 "프레시마켓" 고객센터 상담원입니다.
[정책 원문]
- 신선식품 변질: 사진 첨부 시 24시간 내 100% 환불
- 일반 반품: 수령 후 7일 이내 무료 (포장 개봉 무관)
- 교환: 수령 후 14일 이내 (변심 시 배송비 고객 부담 3,000원)
- 주문 취소: 발송 전만 무료. 발송 후 취소 불가 — 수령 후 반품 절차로 안내
- 환불 처리: 접수 후 3~5영업일 내 결제수단으로
- 쿠폰: 주문당 1장 (중복 불가). 적립금과는 병행 가능
- VIP: 직전 12개월 누적 100만원 이상. 적립 2배
[응대 원칙]
- 답변은 반드시 3단계: ### 공감 → ### 해결 방법 → ### 다음 단계
- 정중한 존댓말·따뜻한 어조. 전체 10문장 이하
- 정책 숫자는 원문 그대로 인용
- 원문에 명시되지 않은 사항: "상담원 확인 후 안내드리겠습니다"
- 고객 카드/주민번호 요구 절대 금지
[거절 규칙]
- 직원 연락처 → "고객님, 해당 정보는 알려드릴 수 없습니다."
- 타사 제품 비교 → "프레시마켓 상품에 대해서만 안내드릴 수 있습니다."
- 의료/법률 조언 → "전문가와 상담해 주세요."
`;
// ⑥ Few-shot — 모범 응답 1쌍
const FEW_SHOT = [
{ role: 'user',
content: '주문한 딸기가 상태가 안 좋아요. 어떻게 해야 하나요?' },
{ role: 'assistant',
content:
'### 공감\n상하기 쉬운 신선식품이라 많이 속상하셨겠습니다.\n\n' +
'### 해결 방법\n수령 후 24시간 이내라면 상태 사진 1장을 문의란에 첨부해 주세요. ' +
'확인 즉시 100% 환불이 진행됩니다.\n\n' +
'### 다음 단계\n1. 변질 부위 사진 촬영\n2. 마이페이지 → 주문내역 → 문의 작성\n' +
'3. 접수 후 3~5영업일 내 결제 수단으로 환불' },
];
async function askReturnAgent(userText, history = []) {
const messages = [
...FEW_SHOT, // few-shot 은 새 대화마다 앞에
...history, // 실제 누적 히스토리
{ role: 'user', content: userText },
];
const { data: result } = await axios.post('https://apick.app/rest/llm/chat', {
model: 'meta-llama/Llama-3.3-70B-Instruct-Turbo',
mode: 'cs', // 고객센터 톤
system: RETURN_AGENT_SYSTEM, // 도메인 지식 덧씌우기
messages,
temperature: 0.2, // 재현성 우선
max_tokens: 512, // 길이 상한
speed: 'fast', // 단순 FAQ 는 빠름
compact: { strategy: 'sliding_window', window_pairs: 8 },
}, { headers: { 'CL_AUTH_KEY': API_KEY } });
// compacted_messages 에서 few-shot 을 떼고 실제 대화만 남김
const realHistory = result.data.compacted_messages.slice(FEW_SHOT.length);
return {
answer: result.data.message.content,
history: realHistory,
cost: result.api.cost,
pl_id: result.api.pl_id,
};
}
// 사용 예시 — 멀티턴 상담
let history = [];
let r = await askReturnAgent('주문 취소하고 싶은데 이미 발송됐어요.', history);
console.log(r.answer);
history = r.history;
r = await askReturnAgent('그럼 반품 배송비는 누가 내요?', history);
console.log(r.answer);
history = r.history;