UNPKG

@yk1028-test/ai-chat-supporter

Version:

AI Chat Supporter - TypeScript library for intelligent chat processing with LangChain integration

197 lines 12.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ChatPromptBuilder = exports.personaPromptTemplates = exports.englishPersonaPromptTemplates = exports.koreanPersonaPromptTemplates = exports.ragContextTemplate = exports.chatSummarizationTemplate = exports.chatRetryTemplate = exports.chatSummarizationTemplates = exports.chatRetryTemplates = exports.outputTypeTemplates = exports.englishOutputTypeTemplates = exports.koreanOutputTypeTemplates = exports.multiChatInputPromptTemplate = exports.chatInputPromptTemplate = exports.systemPromptTemplate = exports.languageInstructions = void 0; exports.getChatRetryPrompt = getChatRetryPrompt; exports.getChatSummarizationPrompt = getChatSummarizationPrompt; const prompts_1 = require("@langchain/core/prompts"); // 언어 지시 (간소화) exports.languageInstructions = { korean: `한국어로만 응답`, english: `Respond in English only` }; // 시스템 프롬프트 (간소화) exports.systemPromptTemplate = prompts_1.PromptTemplate.fromTemplate(`{language_instruction} {persona_prompt} {input_specific_prompt} {output_format_prompt} {rag_context}`); // 입력 프롬프트 (간소화) exports.chatInputPromptTemplate = prompts_1.PromptTemplate.fromTemplate(`"{message}"`); exports.multiChatInputPromptTemplate = prompts_1.PromptTemplate.fromTemplate(`참여자: {participants} 대화: {messages} 주제: {context}`); // 출력 타입별 프롬프트 (간소화) exports.koreanOutputTypeTemplates = { chat: prompts_1.PromptTemplate.fromTemplate(`짧고 간결한 한 문장 응답`), analysis: prompts_1.PromptTemplate.fromTemplate(`상세한 분석을 구조화하여 제시`) }; exports.englishOutputTypeTemplates = { chat: prompts_1.PromptTemplate.fromTemplate(`Short and concise one-sentence response`), analysis: prompts_1.PromptTemplate.fromTemplate(`Detailed analysis presented in structured format`) }; // 하위 호환성을 위한 기본 템플릿 exports.outputTypeTemplates = exports.koreanOutputTypeTemplates; // 재시도 프롬프트 (간소화) exports.chatRetryTemplates = { korean: prompts_1.PromptTemplate.fromTemplate(`길이 초과. {maxLength}자 이내로 재작성`), english: prompts_1.PromptTemplate.fromTemplate(`Length exceeded. Rewrite within {maxLength} characters`) }; // 요약 프롬프트 (간소화) exports.chatSummarizationTemplates = { korean: prompts_1.PromptTemplate.fromTemplate(`다음을 {maxLength}자로 요약: "{originalResponse}"`), english: prompts_1.PromptTemplate.fromTemplate(`Summarize to {maxLength} chars: "{originalResponse}"`) }; // 하위 호환성을 위한 기본 템플릿들 exports.chatRetryTemplate = exports.chatRetryTemplates.korean; exports.chatSummarizationTemplate = exports.chatSummarizationTemplates.korean; // 재시도 횟수별 프롬프트 (길이 제한 강화) function getChatRetryPrompt(_retryCount, language = 'korean', maxLength) { if (maxLength) { // 길이 제한이 있는 경우 간소화된 템플릿 사용 if (language === 'english') { return prompts_1.PromptTemplate.fromTemplate(`Length exceeded. Rewrite within ${maxLength} characters.`); } else { return prompts_1.PromptTemplate.fromTemplate(`길이 초과. ${maxLength}자 이내로 재작성.`); } } // 기존 방식 (하위 호환성) const urgency = language === 'english' ? 'More concise' : '더 간결하게'; return prompts_1.PromptTemplate.fromTemplate(urgency); } // 요약 기반 재시도 프롬프트 (길이 제한 강화) function getChatSummarizationPrompt(originalResponse, language = 'korean', maxLength) { if (maxLength) { // 길이 제한이 있는 경우 간소화된 템플릿 사용 if (language === 'english') { return prompts_1.PromptTemplate.fromTemplate(`Summarize to ${maxLength} chars: "${originalResponse}"`); } else { return prompts_1.PromptTemplate.fromTemplate(`${maxLength}자로 요약: "${originalResponse}"`); } } // 기존 방식 (하위 호환성) const template = exports.chatSummarizationTemplates[language]; return template; } // RAG 컨텍스트 (간소화) exports.ragContextTemplate = prompts_1.PromptTemplate.fromTemplate(`참고: {rag_sources}`); // 페르소나 프롬프트 (간소화) exports.koreanPersonaPromptTemplates = { // 역할 기반 페르소나들 default: prompts_1.PromptTemplate.fromTemplate(`AI 어시스턴트로 명확하고 유용한 답변 제공`), tech: prompts_1.PromptTemplate.fromTemplate(`기술 전문가로 정확한 정보와 실용적 해결책 제공`), expert: prompts_1.PromptTemplate.fromTemplate(`해당 분야 전문가로 깊이 있는 분석과 전문적 답변 제공`), creative: prompts_1.PromptTemplate.fromTemplate(`창의적 작가로 독창적 아이디어와 스토리텔링 제공`), educator: prompts_1.PromptTemplate.fromTemplate(`교육자로 단계별 설명과 적절한 예시로 쉽게 설명`), counselor: prompts_1.PromptTemplate.fromTemplate(`상담사로 공감적이고 지지적인 태도로 경청`), business: prompts_1.PromptTemplate.fromTemplate(`비즈니스 컨설턴트로 전략적 분석과 실행 가능한 솔루션 제공`), // 성격 기반 페르소나들 energetic: prompts_1.PromptTemplate.fromTemplate(`활기차고 에너지 넘치는 성격으로 긍정적이고 열정적인 톤으로 동기부여`), humorous: prompts_1.PromptTemplate.fromTemplate(`유머 감각이 뛰어나고 재치있는 성격으로 적절한 농담과 재미있는 비유 사용`), calm: prompts_1.PromptTemplate.fromTemplate(`차분하고 안정적인 성격으로 평정심을 유지하며 여유로운 톤으로 안정감 제공`), passionate: prompts_1.PromptTemplate.fromTemplate(`열정적이고 신념이 강한 성격으로 확신을 가지고 적극적으로 표현`), gentle: prompts_1.PromptTemplate.fromTemplate(`온화하고 따뜻한 성격으로 부드러운 말투와 세심한 배려로 편안함 제공`), analytical: prompts_1.PromptTemplate.fromTemplate(`논리적이고 분석적인 성격으로 체계적 분석과 단계적 사고로 설명`), optimistic: prompts_1.PromptTemplate.fromTemplate(`낙관적이고 희망적인 성격으로 긍정적인 면을 찾아 가능성과 기회에 집중`), thoughtful: prompts_1.PromptTemplate.fromTemplate(`신중하고 세심한 성격으로 모든 측면을 충분히 검토하여 꼼꼼한 조언 제공`) }; exports.englishPersonaPromptTemplates = { // 역할 기반 페르소나들 default: prompts_1.PromptTemplate.fromTemplate(`AI assistant providing clear and useful answers`), tech: prompts_1.PromptTemplate.fromTemplate(`Tech expert providing accurate information and practical solutions`), expert: prompts_1.PromptTemplate.fromTemplate(`Field expert providing in-depth analysis and professional answers`), creative: prompts_1.PromptTemplate.fromTemplate(`Creative writer providing original ideas and storytelling`), educator: prompts_1.PromptTemplate.fromTemplate(`Educator providing step-by-step explanations with examples`), counselor: prompts_1.PromptTemplate.fromTemplate(`Counselor listening empathetically with supportive attitude`), business: prompts_1.PromptTemplate.fromTemplate(`Business consultant providing strategic analysis and actionable solutions`), // 성격 기반 페르소나들 energetic: prompts_1.PromptTemplate.fromTemplate(`Energetic and enthusiastic personality providing motivation with positive and passionate tone`), humorous: prompts_1.PromptTemplate.fromTemplate(`Humorous and witty personality using appropriate jokes and entertaining analogies`), calm: prompts_1.PromptTemplate.fromTemplate(`Calm and stable personality maintaining composure with relaxed tone providing peace`), passionate: prompts_1.PromptTemplate.fromTemplate(`Passionate and strong-willed personality expressing convictions actively and confidently`), gentle: prompts_1.PromptTemplate.fromTemplate(`Gentle and warm personality using soft speech and thoughtful care providing comfort`), analytical: prompts_1.PromptTemplate.fromTemplate(`Logical and analytical personality providing systematic analysis with step-by-step thinking`), optimistic: prompts_1.PromptTemplate.fromTemplate(`Optimistic and hopeful personality finding positive aspects focusing on possibilities and opportunities`), thoughtful: prompts_1.PromptTemplate.fromTemplate(`Thoughtful and meticulous personality thoroughly reviewing all aspects providing careful advice`) }; // 하위 호환성을 위한 기본 템플릿 exports.personaPromptTemplates = exports.koreanPersonaPromptTemplates; // 통합 프롬프트 빌더 클래스 class ChatPromptBuilder { static async buildPrompt(inputType, inputData, persona, outputType, ragSources, language = 'korean' // 언어 설정 ) { try { // 언어별 페르소나 템플릿 선택 const templates = language === 'english' ? exports.englishPersonaPromptTemplates : exports.koreanPersonaPromptTemplates; // 페르소나 프롬프트 생성 let personaPrompt = ''; if (persona && templates[persona]) { const template = templates[persona]; personaPrompt = await template.format({}); } // 입력 타입별 프롬프트 생성 let inputPrompt = ''; switch (inputType) { case 'chat': inputPrompt = await exports.chatInputPromptTemplate.format({ message: inputData.message }); break; case 'multichat': // 참여자 목록 자동 추출 const uniqueParticipants = [...new Set(inputData.messages.map((m) => m.participantName))]; const participantsList = uniqueParticipants .map((name) => `- ${name}`) .join('\n'); // 메시지 목록 포맷팅 (직접 사용) const messagesList = inputData.messages .map((m) => { const timestamp = m.timestamp ? ` [${new Date(m.timestamp).toLocaleTimeString()}]` : ''; return `${m.participantName}${timestamp}: ${m.message}`; }) .join('\n'); inputPrompt = await exports.multiChatInputPromptTemplate.format({ participants: participantsList, messages: messagesList, context: inputData.context ? `\n배경 정보: ${inputData.context}\n` : '' }); break; default: inputPrompt = language === 'english' ? 'Please provide an appropriate response to the user\'s request.' : '사용자의 요청에 대해 적절한 응답을 제공하세요.'; } // 언어별 출력 형식 템플릿 선택 const outputTemplates = language === 'english' ? exports.englishOutputTypeTemplates : exports.koreanOutputTypeTemplates; // 출력 형식 프롬프트 생성 let outputFormatPrompt = ''; if (outputType && outputTemplates[outputType]) { const template = outputTemplates[outputType]; outputFormatPrompt = await template.format({}); } // RAG 프롬프트 생성 let ragPrompt = ''; if (ragSources && exports.ragContextTemplate) { ragPrompt = await exports.ragContextTemplate.format({ rag_sources: ragSources.join('\n\n') }); } // 언어 지시 추가 const languageInstruction = exports.languageInstructions[language]; // 모든 프롬프트 조합 const fullPrompt = [ languageInstruction, personaPrompt, inputPrompt, outputFormatPrompt, ragPrompt ].filter(p => p.trim().length > 0).join('\n\n'); return fullPrompt; } catch (error) { console.error('프롬프트 생성 실패:', error); throw new Error(`프롬프트 생성 중 오류 발생: ${error instanceof Error ? error.message : 'Unknown error'}`); } } } exports.ChatPromptBuilder = ChatPromptBuilder; //# sourceMappingURL=templates.js.map