OpenAI API로 사내 문서 자동 요약 시스템 구축
배경
ChatGPT가 작년 11월 출시된 이후 팀 내에서 활용도가 높아지면서, 사내 문서 자동 요약 시스템을 구축하기로 했다. 특히 주간 회의록과 기술 문서가 누적되면서 핵심 내용 파악에 시간이 많이 소요되는 문제가 있었다.
초기 구현
import { Configuration, OpenAIApi } from 'openai';
const configuration = new Configuration({
apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
async function summarizeDocument(text) {
const response = await openai.createChatCompletion({
model: 'gpt-3.5-turbo',
messages: [
{
role: 'system',
content: '당신은 기술 문서를 요약하는 전문가입니다. 핵심 내용을 3-5개 bullet point로 정리해주세요.'
},
{
role: 'user',
content: `다음 문서를 요약해주세요:\n\n${text}`
}
],
temperature: 0.3,
});
return response.data.choices[0].message.content;
}
토큰 제한 문제
gpt-3.5-turbo는 4096 토큰 제한이 있어서 긴 문서는 잘려나가는 문제가 발생했다. tiktoken 라이브러리로 토큰 수를 계산하고, 청크 단위로 나눠서 요약한 뒤 다시 종합 요약하는 방식으로 해결했다.
import { encoding_for_model } from '@dqbd/tiktoken';
function splitIntoChunks(text, maxTokens = 3000) {
const enc = encoding_for_model('gpt-3.5-turbo');
const tokens = enc.encode(text);
const chunks = [];
for (let i = 0; i < tokens.length; i += maxTokens) {
const chunk = tokens.slice(i, i + maxTokens);
chunks.push(new TextDecoder().decode(enc.decode(chunk)));
}
enc.free();
return chunks;
}
비용 최적화
API 호출 비용이 예상보다 높게 나와서 캐싱 레이어를 추가했다. Redis에 문서 해시값과 요약 결과를 저장해서 중복 요청을 방지했다. 또한 temperature를 0.3으로 낮춰서 결과의 일관성을 높였다.
결과
일주일 운영 결과 평균 문서 요약 시간이 10분에서 30초로 단축됐다. 다만 API 응답 속도가 간헐적으로 느려지는 문제가 있어서 타임아웃과 재시도 로직을 추가할 예정이다.