brunch

AI 4탄-2. 랭체인-Model I/O-2/7

랭체인 완벽 입문-2/7

by Master Seo

랭체인 모듈 6개중 모듈1 model I/O에 대해 알아보자~



<8> 랭체인 모듈1 - Model I/O를 구성하는 3개의 서브 모듈

<9> Model I/O로 GPT로 호출하기 (실습)

<10> VSCODE로 개발 하기 (실습)



<8> 랭체인 모듈1 - Model I/O를 구성하는 3개의 서브 모듈


슬라이드1.JPG
슬라이드1.JPG


<9> Model I/O로 GPT로 호출하기 (실습)




1

language_models.py


# 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





<10> VSCODE로 개발 하기 (실습)



3

vscode


open folder


1 lang-start

02_model_io



4


// 체크 필요

language_models.py


터미널

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


python3 prompt.py


아이폰는 어느 회사에서 개발한 제품인가요?

갤럭시는 어느 회사에서 개발한 제품인가요?





6

python3 model_io_llm.py


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


keyword
매거진의 이전글AI 4탄-1. 랭체인 완벽 입문-1/7