아래는 GitHub API에서 가져온 큰 텍스트 데이터를 전처리하여 토큰 수를 계산하고, 지정한 토큰 제한 내에서 데이터를 청크로 나눈 후 각 청크별로 Claude API 호출(여기서는 모의 함수 사용) 및 결과 집계를 수행하는 간단한 예시입니다.

// 1. 토큰 수를 계산하는 간단한 함수
function countTokens(text) {
  // 여기서는 공백 단위로 단어 수를 세는 간단한 방식 사용
  return text.split(/\\s+/).length;
}

// 2. 지정한 최대 토큰 수(maxTokens)를 초과하지 않도록 데이터를 청크로 분할하는 함수
function splitIntoChunks(text, maxTokens) {
  const words = text.split(/\\s+/);
  const chunks = [];
  let currentChunk = [];

  words.forEach((word) => {
    currentChunk.push(word);
    if (currentChunk.length >= maxTokens) {
      // 청크가 최대 토큰 수에 도달하면 청크를 저장하고 초기화
      chunks.push(currentChunk.join(' '));
      currentChunk = [];
    }
  });

  // 남은 단어가 있다면 마지막 청크로 추가
  if (currentChunk.length > 0) {
    chunks.push(currentChunk.join(' '));
  }
  return chunks;
}

// 3. Claude API를 호출하는 모의 함수 (실제 API 호출 대신 1초 지연 후 간단한 요약 문자열 반환)
async function processChunkWithClaude(chunk) {
  return new Promise((resolve) => {
    setTimeout(() => {
      // 실제 구현에서는 Claude API 호출 후 응답을 처리하게 됩니다.
      resolve(`요약: ${chunk.substring(0, 30)}...`);
    }, 1000);
  });
}

// 4. 큰 데이터를 청크로 나누고 각 청크를 처리하는 메인 함수
async function processLargeData(data, maxTokensPerChunk = 100) {
  const totalTokens = countTokens(data);
  console.log(`전체 토큰 수: ${totalTokens}`);

  let finalResult = '';

  // 토큰 수가 제한보다 많으면 청크로 분할하여 처리
  if (totalTokens > maxTokensPerChunk) {
    console.log(`데이터를 최대 ${maxTokensPerChunk} 토큰 단위로 청크 분할합니다.`);
    const chunks = splitIntoChunks(data, maxTokensPerChunk);

    // 각 청크별로 Claude API 호출(여기서는 모의 처리)
    const results = [];
    for (const chunk of chunks) {
      const result = await processChunkWithClaude(chunk);
      results.push(result);
    }
    // 여러 청크의 결과를 집계 (여기서는 단순 개행으로 이어붙임)
    finalResult = results.join('\\n');
  } else {
    // 데이터가 충분히 작으면 바로 처리
    finalResult = await processChunkWithClaude(data);
  }

  return finalResult;
}

// 5. 예시 데이터 및 실행
const exampleText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "; // 간단한 예시 텍스트
// 예시 데이터를 여러 번 반복하여 큰 데이터를 생성
const largeData = Array(500).fill(exampleText).join(" ");

// 최대 토큰 제한을 50으로 설정하여 청크 분할 예시 실행
processLargeData(largeData, 50).then((summary) => {
  console.log("최종 요약 결과:\\n", summary);
});


예시 설명

  1. 토큰 계산 및 청크 분할:
  2. Claude API 호출 (모의 함수):
  3. 청크별 처리 및 집계:

이와 같이 전처리 단계에서 데이터를 청크로 나누어 처리하면, 한 번에 너무 많은 토큰을 Claude API에 전달하는 문제를 방지할 수 있습니다. 실제 프로젝트에서는 GitHub API로 데이터를 가져온 후 이 구조를 적용하여, 토큰 수를 미리 계산하고 청크 단위로 Claude API에 전달하는 로직을 구현하면 됩니다.