랭체인을 활용한 LLM기반의 AI서비스 개발하기-2/3
# OPENAI API 실행 = OPENAI 패키지 설치. OPENAI API 키 설정 , OPENAI 코드 생성 , 실행
# 랭체인 실행 = 랭체인과 OPENAI 패키지 설치. OPENAI API 키 설정 , 랭체인용 코드 생성 , 실행
# 버전 변경등으로 코드가 동작하지 않을 수 있습니다!!
AI 개발환경?
코랩 가입 - 코랩으로 실습
아나콘다 설치 - 아나콘다로 실습
OPENAI API 가입-유료
1
콘솔 - FM 모델의 데이터로 답변 준다. 채팅으로 질문하면 답을 준다.
OPENAI API - 좀 더 세부적으로 FM 모델을 제어할 수 있다.
2
OPENAI API를 사용하는 개발 환경을 구축해서, 실습해 보자.
OPENAI에서는 파이썬과 노드를 지원한다.
대부분 파이썬으로 작업한다.
3
파이썬이 되는 실습환경 구축 방법 4가지 중 하나를 선택해 사용하자.
구글에서 제공하는 코랩 사용.
개인 PC에 아나콘다(파이썬) 설치해 사용.
개인 PC에 VSCODE 설치해 사용.
AWS Cloud9 사용 (사용 불가- 신규 aws계정에서는 cloud9 지원하지 않음.)
4
랭체인 주요 모듈 5가지 알아보자.
1
# 구글 코랩 사용
코랩 = 협력자, 공동 작업
웹 브라우저에서 파이썬을 사용할 수 있다.
12시간 동안 작업을 하지 않으면 끊어진다. 업로드해서 사용한 데이터는 모두 삭제된다.
장점
오류 발생 시 AI인 제미나이가 오류내용과 조치법을 알려준다.
구글 코랩을 사용하면 따로 파이썬 프로그램을 설치하지 않아도 된다.
https://colab.research.google.com/?hl=ko
+새 노트
2
환경 설정 (선택)
도구 > 설정 > 편집기 > 행번호 체크~
런타임 > 런타임 유형 변경
3
코드 실행은
SHIFT + ENTER = 셀을 실행하고 커서를 다음 셀로 가게 함.
ALT + ENTER = 셀을 실행하고, 셀을 새로 생성함.
유료 가입하여 테스트하자.
무료 제공 API는 제약으로 사용이 힘들다.
OPENAI API key 발급받기
1
GPT(Generative pre-trained transformer) 란?
미리 훈련된 transformer 생성형 AI
transformer = 딥러닝 아키텍처 중 하나.
GPT는 transformer 계열의 모델.
2
ChatGPT는 웹으로 사용 = 별도 결재
OpenAI API는 CLI로 사용 = 별도 결재.
OPENAI API 사용
가입 필요, 월 10달러 = 1만 5천 원 결제 필요.
3
OPENAI 가입하기?
https://platform.openai.com/docs/overview
나는 구글 계정으로 가입
4
OPENAI API key 발급받기?
오른쪽 위 Dashboard > 왼쪽 아래 APIkeys 클릭해 발급
openai-api-2024-11-28
# 왼쪽 아래 API KEY발급
5
결재
10달러 결제 = 1달 , 1만 5천 원 정도 결재
왼쪽 Billing 메뉴
나는 매달 자동 결재는 OFF 하여 가입.
빌링 히스토리 확인하자 - 지출된 금액 확인하자! , 카톡으로 온 결재 내역이다.
6
https://platform.openai.com/account/billing/overview
7
# 코랩 왼쪽에 키 > 미리 등록해서 사용하자.
코랩 > 새 노트 사용
파일이름 변경 오늘 날자로 12-05
https://colab.research.google.com/?hl=ko
OPENAI_API_KEY
허깅 페이스?
다양한 모델과 학습 스크립트를 구현해 놓은 모듈.
챗GPT 모델과 응답에 대해 비교가 가능하다. 챗GPT가 더 좋다?
https://brunch.co.kr/@topasvga/4170
1
랭체인 주요 모듈 5가지
1
모델 I/O (Model I/O)
언어 모델과 상호 작용을 위한 모듈이다.
3가지가 있다.
LLM에 전달될 프롬프트 생성
답변을 받기 위해 랭귀지 모델 API 호출
답변 출력
2
소스
3
1) Model I/O - LLM에 전달될 프롬프트 생성
# 전달할 프롬프트만 표시하는 예제이다.
# 코랩 접속 실습 - alt + enter 실행이다.
// 아래 오류 해결을 위해 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
!pip install langchain
!pip install openai
!pip install huggingface-hub
!pip install langchain_community
from langchain import PromptTemplate
template = "{product}를 홍보하기 위한 좋은 문구를 추천해줘?"
prompt = PromptTemplate(
input_variables=["product"],
template=template,
)
prompt.format(product="카메라")
결과
카메라를 홍보하기 위한 좋은 문구를 추천해줘?
# 프롬프트 템플릿을 이용하는 방법을 배웠다.
문구를 바꿔보자. 카메라 대신 게임
prompt.format(product="게임")
2) Model I/O - 답변을 받기 위해 랭귀지 모델 API 호출
# LLM 호출 , 직접 api 입력하고 응답 받아보자.
# LLM을 호출해 물어보자.
# import os 해서 소스에 OPENAI_API_KEY를 넣고 실행하는 방법과 Colab에 넣어둔 OPENAI_API_KEY를 호출하는 방법이 있다. 여기서는 import os 해서 소스에 OPENAI_API_KEY를 넣고 실행 하자.
import os
os.environ["OPENAI_API_KEY"] = "sk-proj-febmAeqjO-fMLWHM_1ENA06iDl86IA" #openai 키 입력
from langchain.chat_models import ChatOpenAI
llm1 = ChatOpenAI(temperature=0, # 창의성 0으로 설정
model_name='gpt-4', # 모델명
)
prompt = "진희는 강아지를 키우고 있습니다. 진희가 키우고 있는 동물은?"
print(llm1.predict(prompt))
강아지입니다.
3) Model I/O - 출력 형식을 정하자.
# 답변 출력 , 콤마로 구분하는 출력을 내보자.
# 입력1-1
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0, # 창의성 0으로 설정
max_tokens=2048, # 최대 토큰수
model_name='gpt-4', # 모델명
)
output_parser = CommaSeparatedListOutputParser() #파서 초기화
format_instructions = output_parser.get_format_instructions() #출력 형식 지정
prompt = PromptTemplate(
template="7개의 팀을 보여줘 {subject}.\n{format_instructions}",
input_variables=["subject"],
partial_variables={"format_instructions": format_instructions}
)
#입력1-2
query = "한국의 야구팀은?"
# 출력 결과 생성
output = llm.predict(text=prompt.format(subject=query))
# 출력에 대한 포맷 변경
parsed_result = output_parser.parse(output)
print(parsed_result)
결과
['두산 베어스', '롯데 자이언츠', '삼성 라이온즈', 'SK 와이번스', 'KIA 타이거즈', 'LG 트윈스', 'NC 다이노스']
#
query = "한국의 축구팀은?"
['FC 서울', '전북 현대 모터스', '수원 삼성 블루윙즈', '울산 현대', '포항 스틸러스', '성남 FC', '인천 유나이티드']
query = "한국의 농구팀은?"
['서울 삼성 썬더스', '인천 전자랜드 엘리펀츠', '원주 DB 프로미', '부산 KT 소닉붐', '서울 SK 나이츠', '창원 LG 세이커스', '고양 오리온스']
1
데이터 연결!!!
사용자가 질문하고, PDF 등 데이터에서 정보를 가져오려면 데이터 연결이 필요하다.
2
데이터 연결 순서 ?
미리 벡터 데이터 베이스에 저장해 놓는다.
3
상세 ?
4
5
# 데이터 연결 실습 예제 , t.pdf 다운로드
6
# 실습
7
# 데이터 연결을 위해서는 필요 라이브러리 설치
랭체인 설치, 오픈 AI 설치, pdf 라이브러리 등 설치
# 문서 가져오기 - 다양한 곳에서 문서를 가져온다.
# 문서 변환(document transformers) - 입력 데이터를 청킹하여 분할 하거나 다시 결합 작업등 진행한다. 분할해야 응답을 잘한다.
# 문서 임베딩(embedding model) - 데이터를 벡터 형태로 변환한다.
# 벡터 데이터 베이스(벡터 저장소,vector stores) - 변환된 벡터를 저장/검색/관리한다.
# 검색기가 필요하다. (retrievers) - 정보검색 역할을 한다.
8
# 데이터 연결을 위해서는 필요 라이브러리 설치
!pip install langchain
!pip install openai
!pip install pypdf
!pip install tiktoken
!pip install faiss-cpu
!pip install sentence-transformers
!pip install langchain-community
9
# 문서 가져오기 - 다양한 곳에서 문서를 가져온다.
# pdf파일은 코랩에 올려놓는다
# 코랩 왼쪽 폴더 클릭 > 업로드 클릭 > 파일 올리기 > 파일이름은 t.pdf 로 하자.
10
# 문서 변환(document transformers)
입력 데이터를 청킹하여 분할 하거나 다시 결합 작업등 진행한다. 분할해야 응답을 잘한다.
아래 내용은 PDF 6 페이지중 5,000 글자를 읽어오라는 의미이다.
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("t.pdf")
document = loader.load()
document[5].page_content[:5000]
11
# 문서 임베딩(embedding model) - 데이터를 벡터 형태로 변환한다.
임베딩이란 자연어처리에서 사람이 쓰는 자연어를 기계가 이해할 수 있도록 숫자형태인 vector로 바꾸는 과정 혹은 일련의 전체 과정을 의미합니다.
단어나 문장 각각을 벡터로 변환해 벡터 공간(Vector space)으로 끼워넣는다는 의미에서 임베딩이라고 합니다.
# 벡터 데이터 베이스(벡터 저장소,vector stores) - 변환된 벡터를 저장/검색/관리한다.
# 임베딩을 오픈 AI에서 제공하는 임베딩 모델 사용
# 벡터 데이터베이스로 파이스 사용
import os
os.environ["OPENAI_API_KEY"] = "sk-proj-febmAeqQRjKvXZvNr8kWiYSgcTc-x29UrIEFtLRKL40qa2QijO-fMLWHM_1ENA06iDl86IA" #openai 키 입력
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings() #임베딩 처리
db = FAISS.from_documents(document, embeddings)
12
# 문장을 벡터로 바꿔보자~
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
text = "진희는 강아지를 키우고 있습니다. 진희가 키우고 있는 동물은?"
text_embedding = embeddings.embed_query(text)
print(text_embedding)
# 결과
[-0.0024335071671338295, -0.02026344598441443, -0.012884016077137517, -0.016665264
# 문장이 숫자의 나열인 벡터로 변경된다.
13
# 검색기가 필요하다. (retrievers) - 정보검색 역할을 한다.
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0, # 창의성 0으로 설정
model_name='gpt-3.5-turbo', # 모델명
)
from langchain.chains import RetrievalQA
retriever = db.as_retriever()
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever)
query = "마을 무덤에 있던 남자를 죽인 사람은 누구니?"
result = qa({"query": query})
print(result['result'])
답변
마을 무덤에서 남자를 죽인 사람은 Injun Joe입니다.
체인?
여러 구성 요소를 조합해서 하나의 파이프라인을 구성해주는 역할을 한다.
예를 들어 질문이 입력 되면 LLM 1과 LLM2를 거쳐 결과가 생생되는 과정을 하나의 파이프라인으로 수성하는것이 체인이다.
1
2
체인 실습 예1)
from langchain.chains import LLMChain
from langchain import PromptTemplate
from langchain.chat_models import ChatOpenAI
import os
os.environ["OPENAI_API_KEY"] = "sk-proj-wOtiq6TRyfjC7X_r_3ThhCJ-QewfqXIA" #openai 키 입력
llm = ChatOpenAI(temperature=0, # 창의성 0으로 설정
model_name='gpt-4', # 모델명
)
prompt = PromptTemplate(
input_variables=["country"],
template= "{country}의 수도는 어디야?",
)
chain = LLMChain(llm=llm, prompt=prompt) #프롬프트와 모델을 체인으로 연결
chain.run("대한민국")
# 체인 실습2
영어를 한글로 번역
번역한 부분을 요약하기
1
!pip install wikipedia
!pip install numexpr
2
import os
os.environ["OPENAI_API_KEY"] = "sk-proj-wOtiq6TRyfjCyEgJ-iQewfqXIA" #openai 키 입력
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0, # 창의성 0으로 설정
model_name='gpt-4', # 모델명
)
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
tools = load_tools(["wikipedia", "llm-math"], llm=llm) #llm-math의 경우 나이 계산을 위해 사용
agent = initialize_agent(tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
description='계산이 필요할 때 사용',
verbose=True)
agent.run("에드 시런이 태어난 해는? 2024년도 현재 에드 시런은 몇 살?")
3
실행 결과
참조한 문서를 보여주고 거기서 정보를 가져와서 질문에 답변을 한다.
위키 피디아에서 정보를 가져온다.
1
https://brunch.co.kr/@topasvga/4145
1
# Windows PC에 아나콘다 환경 설치법
ChatGPT API 사용 - 가입 필요, 월 10달러 = 1만 5천 원 정도 결재 필요.
1)
Email 하나 준비
2)
아나콘다 다운로드 - Email 필요
https://www.anaconda.com/download
3)
Add PATH 체크하여 설치
4)
# 가상환경 설정 = 파이썬 버전과 라이브러리 충돌을 방지 한다.
Anaconda Prompt
실행
(base) C:\Users\seo> conda env list
# conda environments:
#
base * C:\Users\seo\anaconda3
conda create -n llm python=3.8
y
Proceed ([y]/n)? y
# 가상환경 활성화
conda env list
conda activate llm
conda env list
(base) C:\Users\seo> conda env list
# conda environments:
#
base * C:\Users\seo\anaconda3
llm C:\Users\seo\anaconda3\envs\llm
(base) C:\Users\seo> conda activate llm
(llm) C:\Users\seo> conda env list
# conda environments:
#
base C:\Users\seo\anaconda3
llm * C:\Users\seo\anaconda3\envs\llm
5)
#삭제 시
conda env remove -n llm
// LLM 삭제
작업용 노트북 설치하는 것이다.
1
pip install ipykernel
# 가상환경에 커널 연결하기
python -m ipykernel install --user --name 11m --display-name "llm"
# 주피터 노트북에 연결
jupyter notebook
FILE > NEW > notebook > llm
2
# 라이브러리 설치 = 아나콘다에서! 를 붙여 설치한다.
# 10초 후 설치 시작함
!pip install langchain==0.0.350
# langchain version check
#
import langchain; print('the version of install langcahin is',langchain.__version__)
the version of install langcahin is 0.0.350
3
# 오픈 AI , 허깅페이스 , 스트림릿을 설치한다.
허깅페이스 = 학습된 모델을 공유하는 사이트
스트림릿= 데이터 분석과 시각화를 함께 간편하게 수행할 수 있는 파이썬 오픈 소스 라이브러리이다.
!pip install openai==1.4.0
!pip install huggingface-hub==0.19.4
!pip install streamlit==1.29.0
1
2
아나콘다 환경
Anaconda Prompt
jupyter notebook
File - New notebook
3
# 설치
!pip install langchain
!pip install openai
!pip install pypdf
!pip install tiktoken
!pip install faiss-cpu
!pip install sentence-transformers
!pip install langchain-community
실행은 SHIFT + ENTER 키
(5분 걸림)
4
샘플 pdf 다운로드
https://github.com/gilbutITbook/080413/blob/main/Data/The_Adventures_of_Tom_Sawyer.pdf
5
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("c:/3/The_Adventures_of_Tom_Sawyer.pdf")
document = loader.load()
document[5].page_content[:5000]
6
pip show langchain
1
메모리 = 데이터를 저장하는 공간
데이터 = 대화 과정에서 발생하는 데이터
2
메모리 실습
1. 코랩 가입? 사용법?
2. OPENAI API 생성?
https://brunch.co.kr/@topasvga/4148