25일차 openai, langchain

Peter·2025년 5월 8일

python언어로 langchain라이브러리를 활용한 AI 실습을 진행했다.
어제 내용을 가볍게 복습한 후에 pip install로 langchain관련 패키지를 가상환경에 설치를 마쳤다.

라이브러리에 맞는 새로운 문법이 아직 헷갈리는데 여기서 안 좋은? 소식을 들었다.
파이썬 라이브러리 중 특히 AI관련 라이브러리는 업데이트가 빈번해 지금 쓰는 문법과 라이브러리가 언제 바뀔지 모른다는 것이다.
AI를 깊게 파려면 항상 주의를 기울이고 있어야 할 것 같다.
지금 작성한 코드가 1년 뒤에는 제대로 동작하지 않을 확률이 크다...

오늘 블로그는 파이썬 langchain보다는 어제 배운 node.js 환경에서 openai API를 활용하는 방법을 추가로 복습해보겠습니다.

API 파라미터

아래는 OpenAI의 chat/completions API에 사용되는 주요 파라미터 값들에 대한 상세 설명입니다. axios로 직접 요청할 때 사용되는 JSON 요청 본문을 기준으로 설명합니다.

요청 형식 예시

{
  "model": "gpt-3.5-turbo",
  "messages": [
    { "role": "system", "content": "You are a helpful assistant." },
    { "role": "user", "content": "Explain quantum physics in simple terms." }
  ],
  "temperature": 0.7,
  "top_p": 1,
  "n": 1,
  "stream": false,
  "stop": null,
  "max_tokens": 1000,
  "presence_penalty": 0,
  "frequency_penalty": 0
}

각 파라미터 설명

  1. model (필수)
  • 사용하고자 하는 모델 이름.
  • 예시: "gpt-3.5-turbo", "gpt-4", "gpt-4o"
  • 최신 모델일수록 더 똑똑하지만 비용도 높음.
  1. messages (필수)
  • 대화 맥락을 구성하는 배열.
  • 각 항목은 { role: "user" | "assistant" | "system", content: "..." } 형식.
  • 역할 설명:
    - system: 초기 지침 설정 (역할 정의 등)
    - user: 사용자 입력
    - assistant: 이전의 AI 응답 (컨텍스트 유지 시 필요)
  1. temperature
  • 값 범위: 0.0 ~ 2.0
  • 낮을수록 일관성 있고 예측 가능한 답변, 높을수록 창의적이고 다양한 응답.
  • 추천 값: 0.7 (일반적인 용도에 적합)
  1. top_p (nucleus sampling)
  • 값 범위: 0.0 ~ 1.0
  • 높은 확률의 토큰 누적 분포에서 일부만 고려하여 출력.
  • temperature와 함께 사용하지만 보통 하나만 조절함.
  • 추천: top_p = 1 (전체 후보 고려)
  1. n
  • 생성할 응답 개수.
  • 예: "n": 3 → 서로 다른 답변을 3개 생성.
  • 기본값: 1
  1. stream
  • true일 경우 응답을 실시간 스트리밍 형태로 받음.
  • SSE(Server-Sent Events) 방식 사용.
  • 일반적인 사용에는 false로 설정.
  1. stop
  • 출력 중단을 위한 문자열 또는 문자열 배열.
  • 예: "stop": ["\n\n"] → 두 줄바꿈이 나오면 응답 중지.
  • 기본값: null
  1. max_tokens
  • 출력할 최대 토큰 수 제한.
  • 예: max_tokens: 1000 → 최대 약 750~800단어 정도.
  • 너무 높게 설정하면 비용 증가.
  1. presence_penalty
  • 새롭고 다양한 주제를 유도하기 위한 옵션.
  • 값 범위: 2.0 ~ 2.0
  • 높을수록 이전에 사용되지 않은 토픽을 선호하게 됨.
  1. frequency_penalty
  • 동일 단어 반복을 줄이는 옵션.
  • 값 범위: 2.0 ~ 2.0
  • 높을수록 반복 억제 효과가 있음.

예제 요약: 실용적인 설정 조합

{
  "temperature": 0.7,
  "top_p": 1,
  "max_tokens": 500,
  "presence_penalty": 0.3,
  "frequency_penalty": 0.5
}
  • 창의성은 적당히 부여하면서도, 너무 중복되지 않도록 제어
  • 실용적인 대부분의 질문 응답 처리에 적합

참고

API 파라미터 테스트

아래는 다양한 OpenAI Chat API 파라미터 조합을 테스트하는 Node.js 예제 코드입니다. 각 파라미터별로 어떻게 응답 결과가 달라지는지를 직접 실험해볼 수 있게 구성했으며, 예상 결과에 대한 설명도 함께 주석으로 포함되어 있습니다.

1. 사전 준비

.env 파일

OPENAI_API_KEY=sk-...

설치

npm install axios dotenv

2. 예제 코드 (prompt_test.js)

const axios = require('axios');
require('dotenv').config();

async function testPrompt({ temperature, top_p, presence_penalty, frequency_penalty }) {
  try {
    const res = await axios.post(
      'https://api.openai.com/v1/chat/completions',
      {
        model: 'gpt-3.5-turbo',
        messages: [
          { role: 'system', content: 'You are a creative assistant who writes short stories.' },
          { role: 'user', content: 'Write a very short story about a robot and a cat.' }
        ],
        temperature,
        top_p,
        max_tokens: 200,
        presence_penalty,
        frequency_penalty
      },
      {
        headers: {
          Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
          'Content-Type': 'application/json'
        }
      }
    );

    console.log(`\n=== Test: temp=${temperature}, top_p=${top_p}, presence=${presence_penalty}, freq=${frequency_penalty} ===`);
    console.log(res.data.choices[0].message.content);
  } catch (err) {
    console.error('Error:', err.response?.data || err.message);
  }
}

// 테스트 시나리오 배열
const testCases = [
  {
    // 기본값, 가장 안정적인 결과
    temperature: 0.7,
    top_p: 1,
    presence_penalty: 0,
    frequency_penalty: 0
  },
  {
    // 더 창의적인 응답
    temperature: 1.2,
    top_p: 1,
    presence_penalty: 0.5,
    frequency_penalty: 0.3
  },
  {
    // 반복 억제, 중복 단어 줄이기
    temperature: 0.7,
    top_p: 1,
    presence_penalty: 0,
    frequency_penalty: 1.0
  },
  {
    // 새로운 아이디어 강제 유도
    temperature: 0.7,
    top_p: 1,
    presence_penalty: 1.5,
    frequency_penalty: 0
  },
  {
    // 가장 보수적이고 안정적인 응답
    temperature: 0.2,
    top_p: 0.8,
    presence_penalty: 0,
    frequency_penalty: 0
  }
];

// 실행
(async () => {
  for (const test of testCases) {
    await testPrompt(test);
  }
})();

3. 예상 결과 요약

테스트 케이스주요 설정예상 결과 설명
기본값temp=0.7, top_p=1, others=0균형 잡힌 일반적 응답
창의적 설정temp=1.2, presence=0.5더 독창적이고 자유로운 이야기
반복 억제frequency_penalty=1.0같은 단어 반복 줄임
새 아이디어 유도presence_penalty=1.5더 참신한 개념을 시도하려 함
안정적 응답temp=0.2, top_p=0.8보수적이고 짧은 문장, 무난한 흐름

이 코드를 통해 하나의 프롬프트에 대해 다양한 파라미터 조합을 실험하며 결과 차이를 직접 확인할 수 있습니다.

profile
개발자 지망생. 일단 하고보자

0개의 댓글