LangChain
LangChain은 LLM(Large Language Model)을 사용하여 애플리케이션 생성을 쉽게 할 수 있도록 도와주는 프레임워크이다.
우선 Model input output은 다음과 같다.
순서대로 살펴보자.
Format
이 단계에서는 마치 함수처럼 미리 입력 형식을 작성할 수 있다.
AI에게 미리 배경 context를 알려줄 수도 있고 (당신은 산술 연산을 하는 AI 입니다.)
template을 작성해서 형식을 미리 정할 수도 있다. ( {A}와 {B}를 더하시오 )
Predict
이 단계에서는 모델을 사용하는데 LangChain은 크게 두 종류, LLM과 Chat Model 인터페이스를 제공한다.
이 모델을 통해 예측값을 반환한다.
LLM은 String을 받아서 String을 반환한다면 Chat Model은 Message를 받아서 Message를 반환한다.
Chat Model이 LLM에 비해서 채팅 관련 유저 친화적인 메소드들을 가지고 있다.
Parse
모델이 반환해준 데이터 중 원하는 부분을 추출해서 사용할 수 있다.
간단하게 LLM과 Chat Model을 사용해보자.
LLM
LLM을 사용하기 전에 openai api key를 발급받아야 한다.
open ai 사이트에 회원 가입하면 일정 기간 동안 무료로 사용할 수 있는 openai api key를 발급 받을 수 있다.
LLM을 사용해보자. 먼저 openai와 langchain을 설치해준다.
터미널에 다음 명령어를 입력한다,
pip install openai
pip install langchain
다음과 같이 llm을 사용해보자.
from langchain.llms.openai import OpenAI
llm = OpenAI(openai_api_key="...")
print(llm("한국의 수도는 어디야?"))
print(llm.predict("한국의 수도는 어디야?"))
출력
한국의 수도는 서울입니다.
이번에는 generate 메소드를 사용해서 여러 개의 질문을 던져보자.
generate 메소드를 사용하면 예측 값 뿐만 아니라 meta data도 함께 받을 수 있다.
print(llm.generate(["한국의 수도는 어디야?", "미국의 수도는 어디야?"]))
출력
generations=
[
[Generation(text='\n\n한국의 수도는 서울입니다.', generation_info={'finish_reason': 'stop', 'logprobs': None})],
[Generation(text='\n\n미국의 수도는 워싱턴 D.C.입니다.', generation_info={'finish_reason': 'stop', 'logprobs': None})]
]
llm_output={
'token_usage':
{'prompt_tokens': 53, 'completion_tokens': 72, 'total_tokens': 125},
'model_name': 'text-davinci-003'}
run=[RunInfo(run_id=UUID('uuid')), RunInfo(run_id=UUID('uuid'))]
이 중 원하는 값을 사용하면 된다.
그런데 위에서 OpenAI를 생성할 때 인자로 openai_api_key를 넣어준 모습을 볼 수 있다.
그런데 open api key를 이렇게 하드 코딩하는 것은 키 노출의 위험이 있기 때문에 환경 변수로 등록해서 사용하는 것을 추천한다.
(Linux)
리눅스는 터미널에 아래와 같이 export 명령어를 사용하여 openai api key를 등록하자.
export OPENAI_API_KEY="키 값"
(window)
윈도우는 시스템 환경 변수에 등록하면 된다.
변수 이름을 잘 입력하자 OPENAI_API_KEY
이렇게 환경 변수로 api key를 등록했다면 모델을 생성할 때 직접 api key를 넣어줄 필요가 없다.
그냥 아래와 같이 사용해도 환경 변수의 OPENAI_API_KEY를 알아서 인식한다.
from langchain.llms.openai import OpenAI
llm = OpenAI()
result = llm.generate(["한국의 수도는 어디야?", "미국의 수도는 어디야?"])
print(result.generations)
print(result.llm_output)
Chat Model
LLM을 배웠으니 이번에는 Chat Model을 사용해보자.
사용법은 거의 유사하다.
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI()
chat.predict("hello")
ChatOpenAI도 OpenAI처럼 predict 메소드를 사용할 수 있다.
이제 이 모델을 사용하여 여러 메시지들을 보내보자.
langchain에서는 서로 다른 역할을 가진 4개의 메시지들을 정의할 수 있다.
HumanMessage : 유저가 보내는 메시지
AIMessage : ai가 보내는 메시지
SystemMessage : 시스템이 보내는 메시지
FunctionMessage : 함수 call에서 보내는 메시지
SystemMessage를 통해 번역기 역할을 부여하고 HumanMessage를 통해 번역을 원하는 문장을 보내보자.
from langchain.chat_models import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage, SystemMessage
chat = ChatOpenAI()
message = [
SystemMessage(content="you are a helpful assistant that translates english to korean"),
HumanMessage(content="i ate apple.")
]
print(chat.predict_messages(message))
출력
content='저는 사과를 먹었습니다.'
generate 메소드를 통해 여러 메시지들을 보낼 수도 있다.
from langchain.chat_models import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage, SystemMessage
chat = ChatOpenAI()
messages = [
[
SystemMessage(content="you are a helpful assistant that translates english to korean"),
HumanMessage(content="i ate apple.")
],
[
SystemMessage(content="you are a helpful assistant that translates korean to english"),
HumanMessage(content="좋은 아침이군요.")
],
]
print(chat.generate(messages))
출력
generations=[
[ChatGeneration(text='나는 사과를 먹었습니다.', generation_info={'finish_reason': 'stop'}, message=AIMessage(content='나는 사과를 먹었습니다.'))],
[ChatGeneration(text='Good morning.', generation_info={'finish_reason': 'stop'}, message=AIMessage(content='Good morning.'))]
]
llm_output={'token_usage': {'prompt_tokens': 60, 'completion_tokens': 14, 'total_tokens': 74}, 'model_name': 'gpt-3.5-turbo'} run=[RunInfo(run_id=UUID('b224f4e7-82d8-4faa-babe-c8757908a8af')),
RunInfo(run_id=UUID('uuid'))]
출력 부분을 보면 AIMessage를 확인할 수 있고 그 안에 AI의 응답을 확인할 수 있다.
lang chain의 간단 사용법을 알아보았다.
다음 포스팅에서는 Prompts를 사용해볼 예정이다.
Parser
Format, Predict에 대해서 알아보았으니 이제 Parser에 대해서 알아보자.
기본적으로 language model은 텍스트를 반환하는데 단순 텍스트가 아닌 구조화된 형식으로 반환받고 싶다면 output parser를 사용하면 된다.
parser에도 다양한 parser들이 존재한다.
list parser, datetime parser 등등... 여러가지가 존재하지만 그 중 Pydantic(JSON) parser를 사용해보자.
그 전에 output parser의 핵심적인 두 메소드를 알아보자.
- get_format_instructions : language model의 반환 형식을 지정하는 명령문을 가져온다.
- parse : language model의 반환 값을 파싱한다.
from langchain.chat_models import ChatOpenAI
from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import PromptTemplate
from langchain.pydantic_v1 import BaseModel, Field
chat = ChatOpenAI()
class Person(BaseModel):
name : str = Field(description="person's name")
hometown : str = Field(description="person's hometown")
birthday : str = Field(description="person's birthday")
parser = PydanticOutputParser(pydantic_object=Person)
prompt = PromptTemplate(
template = "{format_instructions}\nTell me about {name}",
input_variables=["name"],
partial_variables={"format_instructions" : parser.get_format_instructions()}
)
prompt_and_model = prompt | chat
output = prompt_and_model.invoke({"name" : "George Washington"})
res = parser.invoke(output)
print(type(res))
print(res)
출력
<class '__main__.Person'>
name='George Washington' hometown='Westmoreland County, Virginia' birthday='February 22, 1732'
참고
'공부 > AI' 카테고리의 다른 글
[LangChain] Few Shot Prompting, Dynamic Few Shot Prompting (1) | 2023.10.21 |
---|---|
[LangChain] Prompts, Caching, Streaming, Token Usage (0) | 2023.10.20 |
[PyTorch] 긍정 리뷰, 부정 리뷰 분류하기 (3) - 모델 변경 (GRU) (0) | 2023.09.19 |
[PyTorch] 긍정 리뷰, 부정 리뷰 분류하기 (2) - 구현 (임베딩, RNN) (0) | 2023.09.18 |
[PyTorch] 긍정 리뷰, 부정 리뷰 분류하기 (1) - 개념 (0) | 2023.09.15 |
댓글