지피터스가 기업 교육을 운영하지만, 교육생 문의(CS)는 보통 기업 내부 교육 담당자가 처리해 부담이 큽니다. 그래서 교육마다 전용 챗봇을 만들어 교육생 질문을 먼저 해결하게 하고, 교육 담당자에게 “1교육 1챗봇”을 제공해 담당자 리소스를 줄이고 관계를 강화하는 것이 목표입니다. DB는 에어테이블을 사용했습니다.
Airtable DB 체계 구축
Airtable 데이터 (강의목록, 챗봇) ↓ System Prompt에 주입 ↓ Claude가 읽고 이해 ↓ 사용자 질문에 맞게 답변
에어테이블에서 데이터 가져오기
tsx// ai.service.ts 356-469 라인 async loadChatbotContext(chatbotId: string) { // ① 챗봇 정보 조회 const chatbot = await this.airtableService.getChatbotById(airtableRecordId); // ② 연결된 프로그램 정보 조회 const program = await this.airtableService.getProgramByRecordId(programRecordId); // ③ 강의 일정 조회 const lectures = await this.airtableService.getLecturesByProgram(program.fields.프로그램명); // ④ 모든 데이터를 하나의 객체로 구성 return { programName: "AI 교육 과정", startDate: "2025-01-15", faq: "Q: 준비물은?\nA: 노트북", lectures: [...], contactInfo: "한가경님 / abc@email.com" }; }

데이터를 System Prompt로 변환
tsx// ai.service.ts 169-332 라인 private buildSystemPrompt(context?: ChatbotContext): string { let prompt = `당신은 B2B 교육 프로그램 전문 상담 챗봇입니다. 현재 교육 프로그램 정보: - 프로그램명: ${context.programName} - 교육 기간: ${context.startDate} ~ ${context.endDate} - 강사: ${context.instructor} - 담당자: ${context.contactInfo} 자주 묻는 질문 (FAQ): ${context.faq} 강의 일정 (총 ${context.lectures.length}개): 1. 2025-01-15 10:00-12:00 제목: AI 기초 강사: 김강사님 / 코치: 이코치님, 박코치님 2. 2025-01-16 14:00-16:00 ... 위 정보를 바탕으로 질문에 답변해주세요.`; return prompt; }
Claude에게 전달
tsx// ai.service.ts 89-97 라인 const completion = await this.anthropic.messages.create({ model: 'claude-3-5-haiku-20241022', system: systemPrompt, // ← 여기에 에어테이블 정보 전부 들어감! messages: [ { role: 'user', content: "강사가 누구야?" } ] });
장점:
Airtable 데이터 ↓ 임베딩 모델로 벡터화 (OpenAI Embeddings) ↓ 벡터 DB에 저장 (Pinecone, Weaviate 등) ↓ 사용자 질문을 벡터화 ↓ 유사한 문서 검색 (Similarity Search) ↓ 검색된 문서만 Claude에게 전달
RAG의 장점
결과




댓글을 작성하려면 로그인이 필요합니다.
지피터스가 기업 교육을 운영하지만, 교육생 문의(CS)는 보통 기업 내부 교육 담당자가 처리해 부담이 큽니다. 그래서 교육마다 전용 챗봇을 만들어 교육생 질문을 먼저 해결하게 하고, 교육 담당자에게 “1교육 1챗봇”을 제공해 담당자 리소스를 줄이고 관계를 강화하는 것이 목표입니다. DB는 에어테이블을 사용했습니다.
Airtable DB 체계 구축
Airtable 데이터 (강의목록, 챗봇) ↓ System Prompt에 주입 ↓ Claude가 읽고 이해 ↓ 사용자 질문에 맞게 답변
에어테이블에서 데이터 가져오기
tsx// ai.service.ts 356-469 라인 async loadChatbotContext(chatbotId: string) { // ① 챗봇 정보 조회 const chatbot = await this.airtableService.getChatbotById(airtableRecordId); // ② 연결된 프로그램 정보 조회 const program = await this.airtableService.getProgramByRecordId(programRecordId); // ③ 강의 일정 조회 const lectures = await this.airtableService.getLecturesByProgram(program.fields.프로그램명); // ④ 모든 데이터를 하나의 객체로 구성 return { programName: "AI 교육 과정", startDate: "2025-01-15", faq: "Q: 준비물은?\nA: 노트북", lectures: [...], contactInfo: "한가경님 / abc@email.com" }; }

데이터를 System Prompt로 변환
tsx// ai.service.ts 169-332 라인 private buildSystemPrompt(context?: ChatbotContext): string { let prompt = `당신은 B2B 교육 프로그램 전문 상담 챗봇입니다. 현재 교육 프로그램 정보: - 프로그램명: ${context.programName} - 교육 기간: ${context.startDate} ~ ${context.endDate} - 강사: ${context.instructor} - 담당자: ${context.contactInfo} 자주 묻는 질문 (FAQ): ${context.faq} 강의 일정 (총 ${context.lectures.length}개): 1. 2025-01-15 10:00-12:00 제목: AI 기초 강사: 김강사님 / 코치: 이코치님, 박코치님 2. 2025-01-16 14:00-16:00 ... 위 정보를 바탕으로 질문에 답변해주세요.`; return prompt; }
Claude에게 전달
tsx// ai.service.ts 89-97 라인 const completion = await this.anthropic.messages.create({ model: 'claude-3-5-haiku-20241022', system: systemPrompt, // ← 여기에 에어테이블 정보 전부 들어감! messages: [ { role: 'user', content: "강사가 누구야?" } ] });
장점:
Airtable 데이터 ↓ 임베딩 모델로 벡터화 (OpenAI Embeddings) ↓ 벡터 DB에 저장 (Pinecone, Weaviate 등) ↓ 사용자 질문을 벡터화 ↓ 유사한 문서 검색 (Similarity Search) ↓ 검색된 문서만 Claude에게 전달
RAG의 장점
결과




댓글을 작성하려면 로그인이 필요합니다.