25일차 openai, langchain

Peter·5일 전
0

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개의 댓글