랭체인 완벽 입문-2/7
1
# langchain_community 설치 필요
!pip install langchain_community
from langchain.chat_models import ChatOpenAI #← 모듈 가져오기
from langchain.schema import HumanMessage #← 사용자의 메시지인 HumanMessage 가져오기
chat = ChatOpenAI( #← 클라이언트를 만들고 chat에 저장
model="gpt-3.5-turbo", #← 호출할 모델 지정
)
result = chat( #← 실행하기
[
HumanMessage(content="안녕하세요!"),
]
)
print(result.content)
답변
안녕하세요! 만나서 반가워요. 무엇을 도와드릴까요?
2
# Language models와 PromptTemplate의 결함.
# prompt_and_language_model.py
from langchain import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
chat = ChatOpenAI( #← 클라이언트 생성 및 chat에 저장
model="gpt-3.5-turbo", #← 호출할 모델 지정
)
prompt = PromptTemplate( #← PromptTemplate을 작성
template="{product}는 어느 회사에서 개발한 제품인가요?", #← {product}라는 변수를 포함하는 프롬프트 작성하기
input_variables=[
"product" #← product에 입력할 변수 지정
]
)
result = chat( #← 실행
[
HumanMessage(content=prompt.format(product="아이폰")),
]
)
print(result.content)
답변
아이폰은 미국의 애플사(Apple Inc.)에서 개발한 제품입니다.
3
# list_output_parser.py
from langchain.chat_models import ChatOpenAI
from langchain.output_parsers import \
CommaSeparatedListOutputParser #← Output Parser인 CommaSeparatedListOutputParser를 가져옵니다.
from langchain.schema import HumanMessage
output_parser = CommaSeparatedListOutputParser() #← CommaSeparatedListOutputParser 초기화
chat = ChatOpenAI(model="gpt-3.5-turbo", )
result = chat(
[
HumanMessage(content="애플이 개발한 대표적인 제품 3개를 알려주세요"),
HumanMessage(content=output_parser.get_format_instructions()), #← output_parser.get_format_instructions()를 실행하여 언어모델에 지시사항 추가하기
]
)
output = output_parser.parse(result.content) #← 출력 결과를 분석하여 목록 형식으로 변환한다.
for item in output: #← 목록을 하나씩 꺼내어 출력한다.
print("대표 상품 => " + item)
답변
대표 상품 => 아이폰
대표 상품 => 아이패드
대표 상품 => 맥북
# chat models 와 LLM의 차이점은 전제 되는 입력과 출력에 있다.
chat models는 일련의 대화를 입력받아 다응 응답을 예측하는 텍스트, 즉 챗봇에 적합.
chat models 는 이전의 메시지의 맥락을 고랴해 전체 대화 흐름을 쉽게 이해.
반면, LLM은 대화가 아닌 문장의 연속을 예측한다. 하나의 프롬프트만 고려한다.
예)
맛있는 라면을?
끓이자
or
먹고 싶어요
4
# model_io_llm.py
# LLM을 이용해 텍스트 예측하기
from langchain.llms import OpenAI
llm = OpenAI(model="gpt-3.5-turbo-instruct" #← 호출할 모델 지정
)
result = llm(
"맛있는 라면을", #← 언어모델에 입력되는 텍스트
stop="." #← "." 가 출력된 시점에서 계속을 생성하지 않도록
)
print(result)
결과
끓여요
# 랭귀지 모델에서 캐슁기능
API는 사용한 토큰수에 따라 요금이 부과된다.
같은 프롬프트를 두번 전송하면 2배 요금이 부과된다.
이런 문제를 해결하기 위해 캐슁기능을 제공한다.
# chat_model_chche.py
import time #← 실행 시간을 측정하기 위해 time 모듈 가져오기
import langchain
from langchain.cache import InMemoryCache #← InMemoryCache 가져오기
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
langchain.llm_cache = InMemoryCache() #← llm_cache에 InMemoryCache 설정
chat = ChatOpenAI()
start = time.time() #← 실행 시작 시간 기록
result = chat([ #← 첫 번째 실행을 수행
HumanMessage(content="안녕하세요!")
])
end = time.time() #← 실행 종료 시간 기록
print(result.content)
print(f"실행 시간: {end - start}초")
start = time.time() #← 실행 시작 시간 기록
result = chat([ #← 같은 내용으로 두 번째 실행을 함으로써 캐시가 활용되어 즉시 실행 완료됨
HumanMessage(content="안녕하세요!")
])
end = time.time() #← 실행 종료 시간 기록
print(result.content)
print(f"실행 시간: {end - start}초")
답변
안녕하세요! 만나서 반가워요. 무엇을 도와드릴까요?
실행 시간: 0.6579082012176514초
안녕하세요! 만나서 반가워요. 무엇을 도와드릴까요?
실행 시간: 0.0011165142059326172초
# 캐슁이 적용되어 빨리 실행 완료됨!!
3
# 결과를 순차적으로 표시해보자.
# 실행중인 프로세스를 순차적으로 표시하는 Streaming모듈이 있다.
# Streaming모듈 과 callbacks 모듈을 사용해 API를 실행하는 동안 순차적으로 결과를 표시하는 기능을 만들어보자.
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
chat = ChatOpenAI(
streaming=True, #← streaming을 True로 설정하여 스트리밍 모드로 실행
callbacks=[
StreamingStdOutCallbackHandler() #← StreamingStdOutCallbackHandler를 콜백으로 설정
]
)
resp = chat([ #← 요청 보내기
HumanMessage(content="맛있는 스테이크 굽는 법을 알려주세요")
])
답변
1. 스테이크를 냉장고에서 꺼내어 냉동 해동시킨다.
2. 팬이나 그릴에 식용유를 두르고 뜨거워질 때까지 예열한다.
3. 스테이크에 소금과 후추를 골고루 뿌려준다.
4. 예열된 팬이나 그릴에 스테이크를 올려 놓고 한쪽 면을 2~3분 정도씩 익힌다.
5. 스테이크를 뒤집어 다른 한쪽 면도 2~3분 정도씩 익힌다.
6. 원하는 익도에 맞춰 추가로 익히고, 그릴 사이즈에 따라 시간을 조절한다.
7. 익은 스테이크를 뜨거운 그릴에서 꺼내어 5분 정도 휴식시킨 후 손질하여 고기를 썰어내어 내부가 잘 익었는지 확인한다.
8. 고기를 접시에 담아 소스나 야채 등과 함께 내기 전에 잠시 쉬어 둔다.
9. 맛있는 스테이크가 완성되었습니다. 식사를 즐기세요!
4
# output parsers - 출력 구조화.
# 결과를 날짜와 시간 형식으로 받아보기
from langchain import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.output_parsers import DatetimeOutputParser
from langchain.schema import HumanMessage
output_parser = DatetimeOutputParser()
chat = ChatOpenAI(model="gpt-3.5-turbo")
prompt = PromptTemplate.from_template("{product}의 출시일을 알려주세요")
result = chat(
[
HumanMessage(content=prompt.format(product="iPhone8")),
HumanMessage(
content="""
출시일을 다음과 같은 형식으로 응답해주세요:
YYYY-MM-DD
예시: 2023-12-25"""
), # instruct the model to respond with the specified format
]
)
try:
output = output_parser.parse(result.content)
except ValueError:
print(
f"Could not parse the date from the response: {result.content}. Please ensure the date is in YYYY-MM-DD format."
)
else:
print(output)
답변
Could not parse the date from the response: 2017-09-22. Please ensure the date is in YYYY-MM-DD format.
5
# 출력 형식을 집접 정의하기
# 버전 변경으로 코드가 변경됨. 제미나이가 수정해줌.
# pydantic_output_parser.py
from langchain.chat_models import ChatOpenAI
from langchain.output_parsers import PydanticOutputParser
from langchain.schema import HumanMessage
from pydantic import BaseModel, Field, validator
chat = ChatOpenAI()
class Smartphone(BaseModel): # ← Pydantic의 모델을 정의한다.
release_date: str = Field(description="스마트폰 출시일") # ← Field를 사용해 설명을 추가
screen_inches: float = Field(description="스마트폰의 화면 크기(인치)")
os_installed: str = Field(description="스마트폰에 설치된 OS")
model_name: str = Field(description="스마트폰 모델명")
@validator("screen_inches") # ← validator를 사용해 값을 검증
def validate_screen_inches(cls, v): # ← 검증할 필드와 값을 validator의 인수로 전달
# Updated validator to accept 'v' instead of 'field'
if v <= 0: # ← screen_inches가 0 이하인 경우 에러를 반환
raise ValueError("Screen inches must be a positive number")
return v
parser = PydanticOutputParser(pydantic_object=Smartphone) # ← PydanticOutputParser를 SmartPhone 모델로 초기화
result = chat([ # ← Chat models에 HumanMessage를 전달해 문장을 생성
HumanMessage(content="안드로이드 스마트폰 1개를 꼽아주세요"),
HumanMessage(content=parser.get_format_instructions())
])
parsed_result = parser.parse(result.content) # ← PydanticOutputParser를 사용해 문장을 파싱
print(f"모델명: {parsed_result.model_name}")
print(f"화면 크기: {parsed_result.screen_inches}인치")
print(f"OS: {parsed_result.os_installed}")
print(f"스마트폰 출시일: {parsed_result.release_date}")
답변
모델명: Samsung Galaxy S21
화면 크기: 6.5인치
OS: Android 11
스마트폰 출시일: 2021-10-15
6
https://github.com/wikibook/langchain/tree/master/02_model_io
3
vscode
open folder
1 lang-start
02_model_io
4
// 체크 필요
터미널
powershell
python3 language_models.py
python3 -m pip install langchain
python3 -m pip install langchain
//
ModuleNotFoundError: No module named 'langchain_community'
pip install langchain-community==0.0.19
pip show langchain
5
02_MODEL_IO
아이폰는 어느 회사에서 개발한 제품인가요?
갤럭시는 어느 회사에서 개발한 제품인가요?
6
No module named 'langchain_community'
https://github.com/wikibook/langchain/blob/master/02_model_io/model_io_few_shot.py
https://brunch.co.kr/@topasvga/3903