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 를 저장.(프롬프트 개발팀 + 애플리케이션 개발팀 분업)
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 |