본문 바로가기

AI

LLM API 호출, Langchain

LLM (Large Language Model) = 대규모 언어 모델
API (Application Programming Interface) = 프로그램끼리 서로 연결해주는 통신창구, 단일 기능 호출

MCP는 여러 API, 파일, DB를 연결해 모델이 스스로 사용할 수 있게 하는 연결 시스템

 

 

 

LLM API의 작동 흐름

: 사람이 입력 → 서버가 생각 → AI가 텍스트로 응답

  1. 요청(Request) — 사용자의 질문을 AI 서버로 보냄
  2. 처리(Processing) — LLM이 질문을 이해하고 답변 생성
  3. 응답(Response) — 생성된 텍스트를 결과로 돌려줌
from openai import OpenAI
import os

# OpenAI 클라이언트 초기화
client = OpenAI(
    api_key=os.environ.get("OPENAI_API_KEY")
)

def call_openai():
    try:
        # API 호출
        # 참고: GPT-5 시리즈는 추론 모델로 temperature, top_p 등의 파라미터를 지원하지 않습니다
        # reasoning_effort를 "minimal"로 설정하여 빠른 응답을 받습니다
        response = client.chat.completions.create(
            model="gpt-5-mini",  # GPT-5 mini 모델
            messages=[
                {
                    "role": "system",
                    "content": "당신은 친절한 AI 어시스턴트입니다."
                },
                {
                    "role": "user",
                    "content": "인공지능이란 무엇인가요?"
                }
            ],
            reasoning_effort="minimal",  # 추론 토큰 사용 최소화
            max_completion_tokens=2000
        )

        # 응답 추출 및 출력
        ai_message = response.choices[0].message.content
        print("AI 응답:", ai_message)

        # 사용된 토큰 정보
        if response.usage:
            print(f"사용 토큰 - Prompt: {response.usage.prompt_tokens}, "
                  f"Completion: {response.usage.completion_tokens}, "
                  f"Total: {response.usage.total_tokens}")

    except Exception as error:
        print(f"API 호출 오류: {error}")

if __name__ == "__main__":
    call_openai()

 

주요 파라미터 설명

  • model: 사용할 LLM 모델 (gpt-5, gpt-5-mini 등)
  • messages: 대화 히스토리 배열
    • system: AI의 역할과 행동 방식 정의
    • user: 사용자의 질문이나 요청
    • assistant: AI의 이전 응답 (대화 컨텍스트 유지 시 사용)
  • reasoning_effort: 추론 깊이 조절 ("minimal", "low", "medium", "high")
    • GPT-5 전용 파라미터로, 내부 사고 과정의 깊이를 조절합니다
    • "minimal": 빠른 응답, 간단한 질문에 적합
    • "low": 일반적인 질의응답
    • "medium": 적당한 추론이 필요한 작업
    • "high": 복잡한 논리, 수학 문제, 코딩 등
  • max_completion_tokens: 생성할 최대 토큰 수
    • GPT-5 모델은 추론 토큰 + 응답 토큰을 모두 포함하므로 충분히 큰 값 권장
  •  GPT-5 시리즈는 추론 모델(reasoning model)이므로 temperature, top_p, presence_penalty, frequency_penalty 등의 샘플링 파라미터를 지원하지 않는다.
    대신 verbosity(응답 길이 조절)와 reasoning_effort(사고 깊이 조절) 같은 새로운 파라미터를 제공
    • reasoning_tokens: 내부적으로 문제를 분석하고 추론하는데 사용되는 토큰 (사용자에게 보이지 않음)
    • output_tokens: 실제로 사용자에게 전달되는 응답 텍스트
    • max_completion_tokens: 이 두 가지를 합친 전체 토큰 수의 상한선

      예를 들어, max_completion_tokens=500으로 설정하면:
      • reasoning에 500개를 모두 사용하면 → 응답이 비어있게 됨
      • reasoning에 100개, 응답에 400개 사용 → 정상적인 답변
      • 따라서 충분한 토큰을 할당하거나 reasoning_effort를 적절히 조절하는 것이 중요

 

LangChain

LLM 애플리케이션 개발을 쉽게 만들어주는 프레임워크

AI 모델이 할 일(입력 → 처리 → 출력)을 파이프라인처럼 연결해주는 시스템

 

LangChain 기본 구성요소

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
import os

def call_with_langchain():
    """LangChain으로 OpenAI 모델 호출 기본 예시"""
    # ChatOpenAI 모델 초기화
    # 참고: GPT-5 시리즈는 temperature 파라미터를 지원하지 않습니다
    model = ChatOpenAI(
        model="gpt-5",  # 모델명 지정
        max_completion_tokens=500,
        api_key=os.environ.get("OPENAI_API_KEY")
    )

    try:
        # 메시지 배열로 호출
        messages = [
            SystemMessage(content="당신은 친절한 AI 어시스턴트입니다."),
            HumanMessage(content="인공지능이란 무엇인가요?")
        ]

        response = model.invoke(messages)
        print("AI 응답:", response.content)

    except Exception as error:
        print(f"LangChain 호출 오류: {error}")

def use_prompt_template():
    """프롬프트 템플릿을 사용한 고급 예시"""
    # 모델 초기화
    model = ChatOpenAI(
        model="gpt-5"
    )

    # 프롬프트 템플릿 정의
    prompt_template = ChatPromptTemplate.from_messages([
        ("system", "당신은 {role}입니다."),
        ("human", "{topic}에 대해 {style} 스타일로 설명해주세요.")
    ])

    # 출력 파서 정의 (문자열로 변환)
    output_parser = StrOutputParser()

    # 체인 구성: 프롬프트 -> 모델 -> 파서
    chain = prompt_template | model | output_parser

    # 체인 실행
    response = chain.invoke({
        "role": "전문 강사",
        "topic": "머신러닝",
        "style": "초보자도 이해하기 쉬운"
    })

    print("AI 응답:", response)

if __name__ == "__main__":
    call_with_langchain()
    print("\n" + "="*50 + "\n")
    use_prompt_template()

'AI' 카테고리의 다른 글

AI 모델이 최신 정보를 모를 때 어떻게 할까?  (0) 2025.11.04
세부 파라미터 이해하기  (0) 2025.11.04
Workflow vs Agent, AI Agent 아키텍쳐  (0) 2025.11.03
Hooks와 Output Styles 설계  (0) 2025.10.30
Sub Agent 설계  (0) 2025.10.30