@kangthink/q-engine
Version:
A question-answer generation engine that stimulates thinking
88 lines • 4.01 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AnswerTransform = void 0;
const BaseTransform_1 = require("./BaseTransform");
const types_1 = require("../types");
class AnswerTransform extends BaseTransform_1.BaseTransform {
constructor() {
super(...arguments);
this.mode = types_1.TransformMode.ANSWER;
this.defaultTargetType = types_1.NodeType.ANSWER;
}
async transform(context) {
const { sourceNode, options } = context;
const answerOptions = options?.answerOptions || {
length: types_1.AnswerLength.MEDIUM,
tone: 'formal'
};
// Get or create prompt template
const promptTemplate = this.promptManager.getPrompt(this.mode) ||
this.promptManager.getDefaultPrompt(this.mode);
// Build prompt with answer-specific variables
const lengthGuidance = this.getLengthGuidance(answerOptions.length);
const toneGuidance = this.getToneGuidance(answerOptions.tone || 'formal');
const exampleGuidance = answerOptions.includeExamples ? '구체적인 예시를 포함하여' : '';
const prompt = this.buildPrompt(promptTemplate.template, {
content: sourceNode.content,
lengthGuidance,
toneGuidance,
exampleGuidance,
targetType: '답변'
});
// Generate answer using LLM
const generatedContent = await this.generateContent(prompt);
// Validate answer length and adjust if necessary
const adjustedContent = this.adjustAnswerLength(generatedContent, answerOptions.length);
return this.createTransformResult(sourceNode, adjustedContent, types_1.NodeType.ANSWER);
}
getLengthGuidance(length) {
switch (length) {
case types_1.AnswerLength.SHORT:
return '1-2문장으로 간단하고 핵심적으로';
case types_1.AnswerLength.MEDIUM:
return '3-5문장으로 적절한 설명과 함께';
case types_1.AnswerLength.LONG:
return '6-10문장으로 충분한 설명과 배경 정보를 포함하여';
case types_1.AnswerLength.DETAILED:
return '10문장 이상으로 매우 상세하고 포괄적으로';
default:
return '3-5문장으로 적절한 설명과 함께';
}
}
getToneGuidance(tone) {
switch (tone) {
case 'formal':
return '정중하고 격식 있는 어조로';
case 'casual':
return '친근하고 편안한 어조로';
case 'academic':
return '학술적이고 전문적인 어조로';
case 'simple':
return '쉽고 이해하기 쉬운 어조로';
default:
return '정중하고 격식 있는 어조로';
}
}
adjustAnswerLength(content, targetLength) {
const sentences = content.split(/[.!?]+/).filter(s => s.trim().length > 0);
switch (targetLength) {
case types_1.AnswerLength.SHORT:
return sentences.slice(0, 2).join('. ') + '.';
case types_1.AnswerLength.MEDIUM:
return sentences.slice(0, 5).join('. ') + '.';
case types_1.AnswerLength.LONG:
return sentences.slice(0, 10).join('. ') + '.';
case types_1.AnswerLength.DETAILED:
return content; // 원본 그대로 반환
default:
return sentences.slice(0, 5).join('. ') + '.';
}
}
buildMultiplePrompt(template, variables) {
const count = variables.count || 3;
const modifiedTemplate = template.replace('{{lengthGuidance}}', `${variables.lengthGuidance} ${count}개의 서로 다른 관점에서`);
return this.buildPrompt(modifiedTemplate, variables);
}
}
exports.AnswerTransform = AnswerTransform;
//# sourceMappingURL=AnswerTransform.js.map