Adventure Time - Finn 3
본문 바로가기
AI/LLM

LangChain 시작

by hyun9_9 2026. 5. 15.

open AI API 사용할거임

OPENAI_API_KEY="sk-..."

.env 파일 만들어서 함

환경변수 불러오기

from dotenv import load_dotenv
import os
load_dotenv()
f'{os.environ['OPENAI_API_KEY'][:3]}...'
'sk-...'

 

 

1. LLM & Chat model

LangChain은 LLM 과 Chat model 두가지가 있다.

 

LLM (Large Language Model)

특징:

1. 텍스트를 입력 받고 텍스트 툴력을 생성한다.

2. 단순한 프롬프트 기반 입/출력을 처리하기 위한 모델

3. 사용자가 입력한 텍스트를 분석하고, 그에 대한 결과 출력

주요 사용 사례

  • 단일 질문-답변
  • 텍스트 생성
  • 간단한 프롬프트 처리를 위한 작업

Chat Model

특징:

1. 대화 형식을 설계된 모델로 다중 턴 대화를 처리할 수 있다.

2. 입력 형식이 메시지로 구성 되며 각 메시지는 사용자의 메시지와 시스템 메시지로 나뉨

3. 문맥을 이해하고 대화 흐름을 유지함

주요 사용 사례

  • 다중턴 대화
  • 문맥 추적 및 유지
  • 대화 기반 챗봇,FAQ 시스템 등

선택 방법

단일 작업이나 간단한 텍스트 생성: LLM을 사용

대화 기반 애플리게이션이나 문맥을 유지해야하는 작업 : Chat Model 사용

import langchain
from langchain_openai import OpenAI # LLM
from langchain_openai import ChattOpenAI # Chat Model

# LLM 생성
llm =OpenAI()
llm.model_name # 디폴트 모델
# 'gpt-3.5-turbo-instruct'

# Chat Model 생성
chat = ChatOpenAI()
chat.model_name
# 'gpt-3.5-turbo'

"""
chat = ChatOpenAI(
    model="gpt-4o",
    temperature=0,
        # 모델의 응답 다양성을 제어하는 역할을 합니다.
        # 이는 OpenAI의 GPT 모델에서 사용하는 매개변수로,
        #  생성되는 텍스트의 창의성과 확률적 다양성(랜덤성을 조정합니다)ㄴ
        #
    max_tokens=None,  # model이 리턴하는 결과의 최대 token 개수지정.
    timeout=None,
    max_retries=2,
    # api_key="...",  # if you prefer to pass api key in directly instaed of using env vars
    # base_url="...",
    # organization="...",
    # other params...
)
"""

LLM 호출

result = llm.invoke("태양계에는 어떤 행성들이 있죠?")
print(result)

#태양계에는 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성 등 8개의 행성이 있습니다. 또한 이외에도 소행성, 혜성, 외행성 등 다양한 천체들이 있습니다.

 

ChatModel 호출

result = chat.invoke("태양계의 행성들에 대해 알려줘") # 입력.. str도 가능.
print('ㅎ',result)
print('답변',result.content)
content='태양계에는 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성과 이어큐스가 포함됩니다. 각 행성은 다양한 특징을 가지고 있습니다. 예를 들어, 수성은 태양에 가장 가까운 행성으로 매우 뜨거운 온도를 가지고 있고, 목성은 태양계에서 가장 큰 행성으로 유난히 두껍고 구름이 많이 형성되어 있는 것이 특징입니다. 토성은 아름다운 반지를 가지고 있으며, 천왕성과 해왕성은 얼음으로 이루어진 행성으로 알려져 있습니다. 각 행성은 고유한 특징을 가지고 있고, 우리는 여전히 탐험과 연구를 통해 그들에 대해 더 많은 것을 발견하고 있습니다.' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 286, 'prompt_tokens': 26, 'total_tokens': 312, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_provider': 'openai', 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'id': 'chatcmpl-', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None} id='lc_run--019db9cd-ec6d-7e20-8f80-0' tool_calls=[] invalid_tool_calls=[] usage_metadata={'input_tokens': 26, 'output_tokens': 286, 'total_tokens': 312, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}
답변 태양계에는 수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성과 이어큐스가 포함됩니다. 각 행성은 다양한 특징을 가지고 있습니다. 예를 들어, 수성은 태양에 가장 가까운 행성으로 매우 뜨거운 온도를 가지고 있고, 목성은 태양계에서 가장 큰 행성으로 유난히 두껍고 구름이 많이 형성되어 있는 것이 특징입니다. 토성은 아름다운 반지를 가지고 있으며, 천왕성과 해왕성은 얼음으로 이루어진 행성으로 알려져 있습니다. 각 행성은 고유한 특징을 가지고 있고, 우리는 여전히 탐험과 연구를 통해 그들에 대해 더 많은 것을 발견하고 있습니다.

 

Human / System / AI Message

from lngchain.messages import HumanMessage, SystemMessage, AIMessage
# HumanMessage : 사람이 AI 에 보내는 Message
# SystemMessage : LLM 에 설정들을 제공하기 위한 Message
# AIMessage: AI 에 의해 리턴되는 Message

# message 들의 list
messages = [
    SystemMessage(
        content="You are a geography expert. And your only reply in Korean",
    ),
    AIMessage( #AI가 과거에 답변했던 내용들도 담아 보낼수 있다.
        content="안녕, 내 이름은 코난이야"
    ),
    HumanMessage(
        content="""
        What is the distance between Mexico and Thailand.
        Also, what is your name?
        """
    ),
]

result = chat.invoke(messages) # <- 입력 Messages

result.content
# 멕시코와 태국 사이의 거리는 대략 16,000km입니다. 제 이름은 코난입니다.
# tuple 들의 list로 호출 가능!
messages =[
    ('system',"You are a geography expert. And your only reply in Korean"),
    ('ai','안녕 내 이름은 코난 탐정이죠'),
    ('human',"""
        What is the distance between Mexico and Thailand.
        Also, what is your name?
        """),
]

result = chat.invoke(messages)
result.content
# 멕시코와 태국 사이의 거리는 대략 16,000km입니다. 제 이름은 코난 탐정이에요.

 

Prompt Templates

1.  모델에 대한 지시: 프롬프트느 모델에게 무엇을 해야할지 알려주는 역할

2. 컨텍스트 제공: 모델이 적절한 응답을 생성할수 있도록 필요한 배경 정보나 문맥 제공.

3. 모델의 출력 유도: 프롬프트가 모델의 출력을 유도하고 생성되는 텍스트의 스타일, 내용, 형식등을 결정하는데 중요한 영향을 미침

 

프롬프트 설계 팁

1. 명확하고 구체적인 지시: 무엇을 원하는지 정확하게 전달

2. 적절한 컨텍스트 제공 : 필요한 배경정보나 문맥을 제공하면 모델이 더 정확한 답변을 생성할 수 있다.

3. 다양한 실험: 프롬프트를 조금씩 바꿔가며 테스트 해보면서 최적의 응답을 유도

 

from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, ChatMessagePromptTemplate
# ChatPromptTemplate 는 message(s) 로부터 template 을 만듬.
# PromptTemplate 는 string 을 이용해서 template 을 만듬.
#  ↑ 둘다 유용하게 쓰임.

 

PrompTemplate

template = PromptTemplate.from_template(
    # placeholder {...} 사용 => input varizbles
    "What is the distance between {conuntry_a} and {country_b}"
)
template
# PromptTemplate(input_variables=['conuntry_a', 'country_b'], input_types={}, partial_variables={}, template='What is the distance between {conuntry_a} and {country_b}')

prompt =template.format(conuntry_a="Mexico", country_b="Thailand")
prompt

# What is the distance between Mexico and Thailand'

chat.invoke(prompt) # LLM 호출

"""
AIMessage(content='The distance between Mexico and Thailand is approximately 9,500 miles (15,300 kilometers) when measured in a straight line.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 26, 'prompt_tokens': 15, 'total_tokens': 41, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_provider': 'openai', 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'id': 'chatcmpl-DXlOHc2gK3kZ5VuVFvGK6mGbbdRWK', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019db9d6-ed4c-7870-8386-70233098c4ea-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 15, 'output_tokens': 26, 'total_tokens': 41, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})
"""

 

ChatPromptTemplate

template = ChatPromptTemplate.from_messages([
    ('system',"You are a geography expert. And your only reply in {language}"),
    ('ai','안녕 내 이름은  {name} 야'),
    ('human',"""
        What is the distance between {country_a} and {country_b}.
        Also, what is your name?
    """)
])
template

"""
ChatPromptTemplate(input_variables=['country_a', 'country_b', 'language', 'name'], input_types={}, partial_variables={}, messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=['language'], input_types={}, partial_variables={}, template='You are a geography expert. And your only reply in {language}'), additional_kwargs={}), AIMessagePromptTemplate(prompt=PromptTemplate(input_variables=['name'], input_types={}, partial_variables={}, template='안녕 내 이름은  {name} 야'), additional_kwargs={}), HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['country_a', 'country_b'], input_types={}, partial_variables={}, template='\n        What is the distance between {country_a} and {country_b}.\n        Also, what is your name?\n    '), additional_kwargs={})])

"""
prompt = template.format_messages(
    language='Korean',
    name ='뽀로로',
    country_a = 'Canada',
    country_b = 'Japan',
)
print(type(prompt)) # List[Message]
prompt
<class 'list'>
[SystemMessage(content='You are a geography expert. And your only reply in Korean', additional_kwargs={}, response_metadata={}),
 AIMessage(content='안녕 내 이름은  뽀로로 야', additional_kwargs={}, response_metadata={}, tool_calls=[], invalid_tool_calls=[]),
 HumanMessage(content='\n        What is the distance between Canada and Japan.\n        Also, what is your name?\n    ', additional_kwargs={}, response_metadata={})]
 
chat.invoke(prompt)
AIMessage(content='캐나다와 일본 사이의 거리는 약 7,000km입니다. 제 이름은 뽀로로입니다.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 35, 'prompt_tokens': 62, 'total_tokens': 97, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_provider': 'openai', 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'id': 'chatcmpl-DXlUmzm3ROSepKzHR8B0YqTajSM5S', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019db9dd-13f9-77d0-9021-9479de678def-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 62, 'output_tokens': 35, 'total_tokens': 97, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})
 PromptTemplate 의 이점
 1. 변수에 대란 점증 가능.
 2. Prompt 를 저장.(프롬프트 개발팀 + 애플리케이션 개발팀 분업)

'AI > LLM' 카테고리의 다른 글

LangChain - Template  (0) 2026.05.26
LangChain - streaming = 과 callbacks  (0) 2026.05.25
LangChain - Chaining Chains 사용해보기  (0) 2026.05.24
LangChain - LCEL  (0) 2026.05.23
LangChain OutputParser  (0) 2026.05.19