@yk1028-test/ai-chat-supporter
Version:
AI Chat Supporter - TypeScript library for intelligent chat processing with LangChain integration
197 lines • 12.7 kB
JavaScript
;
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