brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jul 08. 2024

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

랭체인 완벽 입문-2/7

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



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

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

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



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



<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


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari