챗GPT와 랭체인을 활용한 LLM기반 AI 앱 개발 -2/5
코랩 사용
실습 환경 ?
코랩 사용
Python 3.10
LangChain 0.1.14
1
https://platform.openai.com/docs/overview
오른쪽위 > 대시보드 클릭
2
왼편 아래 Usage
3
사용량 제한 기능도 있다.
Increase Limit 클릭
테스트이면 일단 제한해놓고 사용하자~
1
API 비용 계산 법 ?
비용 = 사용 모델의 단가(토큰) * (입력 문장의 토큰수 + 출력 문자의 토큰수)
* 참고: 입력 토근 가격과 출력 토큰 가격이 다르다.
2
코랩에서 실습하자.
코랩 > 새노트
https://colab.research.google.com/?hl=ko
코랩 실행
ALT + Enter로 실행함.
Shift + Enter로 실행함.
3
# 입력과 출력의 길이 제한 및 요금에 영향을 주는 '토큰'
토큰수 확인!
!pip install tiktoken==0.6.0
import tiktoken
text = "It’s easy to make something cool with LLMs, but very hard to make something production-ready with them."
encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")
tokens = encoding.encode(text)
print(len(tokens))
23
# 한국어 토큰수가 영어보다 많는것을 알수 있다.
text = "LLM을 사용해서 멋져 보이는 것을 만들기는 쉽지만, 프로덕션 수준으로 만들어 내기는 매우 어렵다."
encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")
tokens = encoding.encode(text)
print(len(tokens))
47
# 한국어 토큰수가 영어보다 많는것을 알수 있다.
4
https://github.com/ychoi-kr/langchain-book/blob/main/chapter3/notebook.ipynb
https://github.com/ychoi-kr/langchain-book
1
새 섹션 > 코드
2
print("hello world")
ALT + ENTER = 실행
SHIFT + ENTER = 실행
hello world
OPENAI 가입하기
https://platform.openai.com/docs/overview
# 나는 구글 계정으로 가입
2
Dashboard에서 API Key 발급
오늘날짜 12-08-1 로 입력
# 이름 없이 입력하면 계속 동일한 API Key가 만들어짐
3
OPENAI API 키를 소스에 포함 시켜 사용
import os
os.environ["OPENAI_API_KEY"] = "sk-proj-nshLnswfxxxxxxxxxxxxxxxxxxlnrO"
또는
# 코랩에 키를 미리 입력해 놓음
# 파일- 저장 하자.
from google.colab import userdata
userdata.get('OPENAI_API_KEY')
1
코랩
https://colab.research.google.com/
2
# Chat Completions API 사용
!pip install openai==1.14.3
// 아래 오류 해결을 위해 openai 버전과 httpx 버전 변경함.
//TypeError: Client.__init__() got an unexpected keyword argument 'proxies'
!pip install --upgrade openai==1.55.3
!pip install --upgrade httpx==0.27.2
!pip install langchain_community
3
# chat.completions API 호출
import os
os.environ["OPENAI_API_KEY"] = "sk-proj-Xnm2LHdZi1qXV8hy2sq-phZCuYz"
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello! I'm John."}
]
)
print(response)
응답
ChatCompletion(id='chatcmpl-AV9o5mxUr16UJ8MNiaJlVa8fS7FGn', choices=[Choice(finish_reason='stop', index=0, logprobs=None, m
4
# 대화 기록에 기반한 응답 얻기
https://github.com/ychoi-kr/langchain-book/blob/main/chapter3/notebook.ipynb
5
# 응답을 스트리밍으로 받기
# 코드
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello! I'm John."}
],
stream=True
)
for chunk in response:
choice = chunk.choices[0]
if choice.finish_reason is None:
print(choice.delta.content)
응답
Hello
John
!
How
can
I
assist
you
today
?
1
LLM을 이용한 애플리케이션 개발 프레임워크이며, LLM을 이용한 다양한 애플리케이션에 사용할 수 있다.
2
사용사례?
LLM을 이용한 애플리케이션 개발에 필요한 구성요소를 추상화된 모듈로 제공한다.
특정 사용 사례에 특화된 기능을 제공한다.
3
LLM을 이용한 응용 프로그램?
챗GPT처럼 대화할 수 있는 챗봇
문장 요약 도구
사내 문서 및 PDF파일에 대한 Q&A앱
AI 에이전트
4
LLM을 이용한 애플리케이션 개발 프레임워크 라이브러리 = 랭체인.
랭체인 이외 라이브러리들은 아래와 같은 종류가 있다.
라마인덱스
시맨틱 커널
가이던스
5
랭체인 모듈?
랭체인은 LLM을 이용한 얘플리케이션 개발에 있어 범용으로 사용할 수 있는 다양한 모듈과 특정 사례에 특화된 기능을 제공하는 두 가지 측면이 있다.
6
랭체인 주요 모듈 6가지
코랩
랭체인 기초
https://github.com/ychoi-kr/langchain-book/blob/main/chapter4/notebook.ipynb
7
모듈 1 - Model/IO - Language models
LLMs와 Chat models 두 가지로 분류한다.
1) LLMs?
하나의 텍스트 입력에 대해 하나의 텍스트 출력을 반환하는 모듈.
2) Chat Models?
단순히 하나의 텍스트를 입력하는 것이 아니라, 채팅 형식의 대화를 입력하면 응답을 받는다.
Callback을 이용한 스트리밍 응답?
Chat Completions API 응답을 스트리밍으로 받을 수 있다.
8
모듈 1 - Model/IO - Prompts
PromptTemplate? 프롬프트를 템플릿화 한다.
ChatPromptTemplate ? Chat Completions API의 형식에 맞게 만든 것이 ChatPromptTemplate
9
모듈 1 - Model/IO
# Output parsers
Prompts는 LLM의 입력에 관한 모듈.
LLM을 특정 형식으로 출력하고, 그 출력을 프로그래밍 방식으로 처리한다. Output parsers이다.
1
코랩
https://colab.research.google.com/
새 노트
2
4장
# 모듈 1 - Model/IO
# Language models 실습 ~~
import os
os.environ["OPENAI_API_KEY"] = "sk-proj-hLnswflnrO"
4
# 랭체인 설치
!pip install langchain==0.1.14 openai==1.14.3 langchain-openai==0.1.1
!pip install langchain openai langchain-openai
4
모듈 1 - Model/IO
# Language models > LLM 실습
from langchain_openai import OpenAI
llm = OpenAI(model_name="gpt-3.5-turbo-instruct", temperature=0)
result = llm.invoke("자기소개를 해주세요.")
print(result)
답변
안녕하세요. 저는 김지원입니다. 저는 대학교에서 경영학을 전공하고 현재는 기업에서 인사담당으로 일하고 있습니다. 저는 새로운 도전을 좋아하고 적극적으로 일에 임하는 성격을 가지고 있습니다. 또한 문제 해결능
from langchain_openai import OpenAI
llm = OpenAI(model_name="gpt-3.5-turbo-instruct", temperature=0)
result = llm.invoke("너는 지금 어디에 있어?")
print(result)
답변
저는 지금 여러분의 컴퓨터 안에 있습니다.
5
4장
# 모듈 1 - Model/IO
# Language models > Chat models 실습
from langchain_openai import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage, SystemMessage
chat = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
messages = [
SystemMessage(content="You are a helpful assistant."),
HumanMessage(content="안녕하세요! 저는 존이라고 합니다!"),
AIMessage(content="안녕하세요, 존 씨! 어떻게 도와드릴까요?"),
HumanMessage(content= "제 이름을 아세요?")
]
result = chat.invoke(messages)
print(result.content)
답변
네, 앞서 말씀하신대로 존 씨 맞으시죠?
6
모듈 6 - Callback을 이용한 스트리밍 실습
Chat Completions API의 응답을 스트리밍으로 받을수 있다.
UX개선을 위해 응답을 스트리밍으로 받고 싶은 경우가 많다.
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
chat = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0,
streaming=True,
callbacks=[StreamingStdOutCallbackHandler()],
)
messages = [HumanMessage(content="자기소개를 해주세요")]
result = chat.invoke(messages)
응답
안녕하세요! 저는 인공지능 언어모델을 담당하는 AI입니다. 자연어 처리 기술을 활용하여 다
7
# 모듈 1 - Model/IO > 프롬프트 실습
# 입력에 관한 부분
from langchain.prompts import PromptTemplate
template = """
다음 요리의 레시피를 생각해 주세요.
요리: {dish}
"""
prompt = PromptTemplate(
input_variables=["dish"],
template=template,
)
result = prompt.format(dish="카레")
print(result)
응답
다음 요리의 레시피를 생각해 주세요.
요리: 카레
from langchain.prompts import (
ChatPromptTemplate,
PromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.schema import HumanMessage, SystemMessage
chat_prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("당신은 {country} 요리 전문가입니다."),
HumanMessagePromptTemplate.from_template("다음 요리의 레시피를 생각해 주세요.\n\n요리: {dish}")
])
messages = chat_prompt.format_prompt(country="영국", dish="고기감자조림").to_messages()
print(messages)
[SystemMessage(content='당신은 영국 요리 전문가입니다.'), HumanMessage(content='다음 요리의 레시피를 생각해 주세요.\n\n요리: 고기감자조림')
from langchain_openai import ChatOpenAI
chat = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
result = chat.invoke(messages)
print(result.content)
고기감자조림은 영국에서는 스튜(Stew)로 불리는 요리입니다. 아래는 간단한 고기감자조림 레시피입니다.
재료:
- 소고기(차돌박이나 등심) 500g
- 감자 2개
- 양파 1개
- 당근 1개
- 올리브 오일 2큰술
- 소금, 후추
- 로즈마리 1작은 가지
- 소금 1작은술
- 후추 약간
- 물 500ml
- 토마토 페이스트 2큰술
1. 먼저 소고기를 깨끗이 씻은 후 3cm 크기로 잘라줍니다.
2. 감자, 양파, 당근을 껍질을 벗기고 2cm 크기로 잘라줍니다.
3. 팬에 올리브 오일을 두르고 소고기를 넣어 골고루 볶아줍니다.
4. 소고기가 색이 변하면 감자, 양파, 당근을 넣고 함께 볶아줍니다.
5. 물을 넣고 로즈마리, 소금, 후추를 넣어 끓여줍니다.
6. 토마토 페이스트를 넣고 중불로 줄여 약 1시간간 끓여줍니다.
7. 고기와 채소가 익으면 불을 끄고 그릇에 담아내어 완성합니다.
이렇게 간단하게 고기감자조림을 만들 수 있습니다. 맛있게 즐기세요!
8
모듈1 - Output parsers
출력형식을 지정해준다.
9
# 모듈 3 - Chains 실습
LLM을 사용하는 애플리케이션에서 단손 LLM에 입력해서 출력을 얻는 것이 아니라 , 처리를 연쇄적으로 연결하고 싶을 때 사용한다.
프롬프트 템플릿을 채우고 결과를 랭귀지 모델에 제공하고, 파이션 객체로 가져오도록 하고 싶을 때 사용한다.
10
# 모듈 5 - Memory 실습
대화 이력 저장과 관련된 편리한 기능을 제공하는 것이 바로 랭체인의 메모리이다.
실습
https://github.com/ychoi-kr/langchain-book/blob/main/chapter4/notebook.ipynb
1
# 모듈 2 - Data Connection
LLM과 외부 데이터를 연결하기 위한 기능.
RAG에서 사용하는 랭체인 모듈이다.
# 모듈 2 - Data Connection 의 5가지 기능.
2
# 문서 읽기
Document loaders : 데이터 소스로부터 문서를 불러온다.
깃허브에 저장된 문서를 불러온다.
3
# 문서 변환
Document transformers : 문서에 어떤 종류의 변화를 가한다.
불러온 데이터를 문서라고 부른다.
문서를 일정 길이의 청크로 분할한다. = CharacterTextSplitter 클래스 사용.
4
# 문서 벡터화
Text embedding models : 문서를 벡터화 한다.
문서 변환을 마치고 벡터화 한다.
오픈 ai의 임베딩 API를 사용해 텍스트를 벡터화 한다.
5
# 벡터화된 문서를 저장
Vector stores : 벡터화된 문서를 저장할수 있는 저장소.
6
# 문서 검색
Retrievers : 입력한 텍스트와 관련된 문서를 검색한다.
벡터 스토어에서는 사용자의 입력과 관련된 문서를 가져오는 작업을 수행한다.
랭체인에서 텍스트와 관련된 문서를 가져오는 인터페이스를 Retrievers라고 한다.
7
Data Connection 실습
https://github.com/ychoi-kr/langchain-book/blob/main/chapter5/5_1_Data_connection.ipynb
1
모듈 4 - Agents
체인에서는 벡터스토어를 검색하고 검색 결과를 바탕으로 LLM이 응답하도록 하였다.
이러한 체인은 고정된 처리 흐름을 구현한 것이다.
반면, 어떤 처리를 할것인지 LLM이 선택하여 움직여 주기를 윈하는 경우.
사용자가 입력한 내용을 바탕으로 필요에 따라 사내 문서를 벡터 스토어에서 검색하여 답하거나 웹상의 정보를 검색하여 답하게 해준다.
이런 작동하게 하는것이 에이전트 이다.
2
# 실습
https://github.com/ychoi-kr/langchain-book/blob/main/chapter5/5_2_Agents.ipynb
https://brunch.co.kr/@topasvga/3890