랭체인 완벽 입문
chat gpt에는 open ai가 개발한 언어 모델인 gpt 기술이 사용된다. 언어 모델이란 인간의 언어 즉 자연어를 컴퓨터가 이해할 수 있게 하고 이를 바탕으로 택스트를 생성하기 위한 알고리즘이나 프로그램을 말한다.
open ai는 이 gpt를 api로 공개하고 있으며, 직접 만든 애플리케이션에 사용할 수 있게 하고 있다.
chat 모델: 대화형 상호작용 생성에 특화된 모델
> 답변을 생성하고 그 답변을 바탕으로 대화를 나눌 수 있다.
complete 모델: 주어진 텍스트에 이어 텍스트를 생성한다.
> 정보나 이야기의 시작을 제공하면 이를 바탕으로 텍스트를 자동 보완할 수 있다.
gpt는 1, 2, 3, 3.5, 4 등 여러 버전으로 출시됐다.
gpt-4는 gpt-3.5에 비해 매우 많은 수의 매개변수로 학습되어 높은 정확도로 고도화된 처리를 할 수 있다. 이미지 입력 대응 등 멀티 모달을 지원한다.
단, gpt-4 계열의 api는 등록만으로는 사용할 수 없으며, open ai가 제공하는 gpt-4의 api는 책 집필 시점에는 일부 사용자에게만 공개돼 있다.
책 설명은 gpt-3.5로 전제한다.
gpt-tubo-16k는 16k(16000)의 컨텍스트 길이를 처리할 수 있음을 의미한다.
컨텍스트 길이는 모델이 한 번에 처리할 수 있는 텍스트의 길이 즉 토큰 수를 의미한다.
gpt-3.5 계열만 존재하며, gpt-4는 존재하지 않는다.
open ai의 api는 사용량에 따라 요금이 부과되는 종량제를 채택하고 있다. 여기서 사용량은 api 호출 횟수가 아닌 사용한 토큰 수를 기준으로 한다.
토큰은 언어 모델이 정보를 처리할 때 사용하는 최소단위읻. 이 단위는 언어에 따라 다른데 영어는 1단어당 1토큰이지만, 한국어는 영어보다 토큰 수가 많은 편이다.
수수료는 송신한 입력 토큰과 수신한 출력 토큰 모두에 대해 발생한다. 입력 토큰은 api에 보내는 문장 길이에 따라 계산되며, 출력 토큰 또한 마찬가지다.
open ai의 api를 처음 사용할 경우, 처음 3개월 동안 5달러의 무료 크레딧이 제공되지만, 신용카드를 등록하면 무료 크레딧이 사라진다.
gpt-3.5와 같은 고성능 언어 모델의 등장으로 기존 절차적 프로그래밍에서 어려웠던 기능 개발을 손쉽게 할 수 있게 됐다.
언어 모델로 불가능한 작업도 있다. 예를 들어 학습한 지식의 범위에서 벗어난 정보에 대해 대답할 수 없고 논리적으로 너무 복잡한 작업에는 대응할 수 없어 결국 텍스트 교환만 가능하다.
이러한 한계를 극복하기 위한 방법론은 다음과 같다.
RAG: 검색 증강 생성, 이는 언어 모델이 알지 못하는 정보에 대해 대답하게 하는 RAG이다. 추론과 행동을 언어 모델 스스로 판단해 인터넷 검색이나 파일 저장 등을 자율적으로 수행하게 하는 ReAct등이 있다.
랭체인은 언어모델을 활용한 애플리케이션 개발을 지원하는 오픈소스 라이브러리다. 랭체인은 언어모델이 아니라 개발을 돕는 라이브러리 이므로 외부 언어 모델과 함께 사용해야한다.
open ai의 언어모델은 api를 쉽게 이용할 수 있지만, api를 호출하는 것 만으로는 복잡한 애플리케이션을 개발하기는 어렵다. 따라서 랭체인을 활용하면 복잡한 애플리케이션을 쉽게 개발할 수 있다. 앞서 설명한 RAG나 ReAct 기법을 이용한 개발도 랭체인을 통해 쉽게 구현할 수 있다.
랭체인과 open ai와 같은 고급 언어 모델을 결합해, 간당한 텍스트를 생성하는 것 뿐만 아니라 자연어를 이해하고, 특정 문제에 대한 답을 생성하거나 특정 환경에서 작동하는 애플리켕이션을 개발하는 등 기존의 절차적 프로그래밍에서 어려웠던 작업을 효율적으로 수행할 수 있다.
랭체인의 6개의 모듈은 각각 할 수 있는 일이 다르다. 여러개를 조합해 복잡한 llm 애플리케이션을 효율적으로 만들 수 있다.
1. model I/O - 언어 모델을 쉽게 다룰 수 있다.
언어 모델을 이용한 개발을 위해서는 언어 모델을 호출해야한다. 언어모델을 호출하기 위해서는 입력인
"프롬프트 준비" "언어 모델 호출" "결과 수신"의 세 단계가 필요하다.model I/O에서 이 세 단계를 쉽게 구현할 수 있다.
2. Retrieval - 알 수 없는 데이터를 다룰 수 있다.
언어모델은 미지의 정보를 다룰 수 없다는 문제가 존재하는데, 해당 모듈은 RAG를 통해 문제를 해결한다.
이 모듈을 이용해 가지고 있는 pdf 파일에 대해 질문하거나, csv파일을 기반으로 챗봇을 만들 수 있다.
3. Memory - 과거의 대화를 장 단기적으로 기억한다.
이전 문맥을 고려한 대화 형식으로 언어 모델이 응답하게 하려면, 이전까지의 대화를 모두 api로 전송해야한다. 이러한 기능을 구현하기 위해서는 과거의 대화를 데이터 베이스 등에 저장해 언어 모델을 호출할 때 불러와야하는데 해당 모둘을 통해 대화 기록을 저장하고 쉽게 불러올 수 있는 기능을 제공한다.
4. Chains - 여러 프로세스 통합한다.
랭테인에서는 여러 모듈과 다른 기능을 조합해 하나의 애플리케이션을 만들 수 있는데, chains 모듈은 이러한 조합을 쉽게 할 수 있는 기능을 제공한다.
5. Agents - 자율적으로 외부와 상호작용해 언어 모델의 한계를 뛰어넘는다.
Agents 모듈은 주로 ReAct나 open ai function calling 기법을 사용해 언어 모델 호출로는 대응할 수 없는 작업을 실행할 수 있다.
6. Callbacks - 다양한 이벤트 발생 시 처리한다.
단독으로 사용할 수 없으며 다른 모듈과 결합하는 것을 전제로 한다.
렝체인은 원래 파이썬으로 개발됐다. 랭체인은 파이썬 버전과 타입스크립트 버전이 있다. 타입스크립트는 웹 개발에서 널리 사용하고 있으며, 프론트개발자에게 사용하기 쉬운 언어로 next.js 와 결합해서 사용하면 쉽게 gpt 와 연동되는 애플리케이션을 만들 수 있다.
pdf에 대해 질문할 수 있는 챗봇
Retrieval 모듈을 활용해 언어 모델이 모르는 정보가 적힌 pdf를 불러와 질문하거나 요약할 수 있는 챗봇을 만들 수 있다.
파일 상호작용 및 인터넷 검색이 가능한 챗봇
Agents 모듈을 사용해 인터넷 검색, 파일 저장 등을 할 수 있는 챗봇 애플리 케이션을 만들 수 있다.
[https://openai.com/index/openai-api/](openai api)
Mac OS 환경변수 등록 방법
echo $SHELL
→ 가장 먼저 Mac OS의 기본 셀을 확인해야하며, /bin/zsh가 나올 경우 Z shell, /bin/bash가 나올 경우 Bash shell이 기본 셀이다
vi ~/.zshrc 또는 vi ~/.bashrc
→ Z shell의 경우 .zshrc파일을, Bash shell의 경우 .bashrc 파일을 vi편집기로 생성하거나 오픈한다
i
→ vi 편집기에서 i를 눌러 insert 모드로 진입한다
export 환경변수명=환경변수값
→ 등록하고자 하는 환경변수명과 환경변수값을 입력한다
ESC 키
→ ESC 키를 눌러 insert모드를 종료한다
:wq
→ vi 편집기를 저장 후 종료한다
source ~/.zshrc 또는 source ~/.bashrc
→ Z shell의 경우 .zshrc파일을, Bash shell의 경우 .bashrc 파일을 source 명령어를 통해 환경 변수로 등록한다
printenv 또는 echo $환경변수명
→ 환경변수가 잘 등록되었는지 확인한다
→ printenv : 모든 환경 변수 확인
→ echo $환경변수명 : 특정 환경 변수값 확인
from https://velog.io/@yeonssu/%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95Mac-OS-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EB%93%B1%EB%A1%9D-%EB%B0%A9%EB%B2%95
echo $SHELL
->/bin/zsh 출력
-> Z shellvi ~/.zshrc
결과
입력 모드로 전환 후export OPENAI_API_KEY=""
wq로 저장 후 z 쉘 다시 로드
source ./zshrc
이후, api 설정키를 확인해보면 echo $환경변수명
인증키가 출력된다.
wget https://raw.githubusercontent.com/wikibook/langchain/master/requirements.txt
python3 -m pip install -r requirenents.txt
python3 -m pip install openai==0.28
준비 끝
###complete 모델 api 실행
chat 모델은 프롬프트의 전제는 대화와 요청이다. 대화 형식으로 채팅을 하도록 지시할 수 있다. 반면 complete 모델은 문장의 끝부분을 생성하는 것이다.
실행결과 "오늘 날씨가 너무 좋아서 기분이 좋아요" 처럼 프롬프트에 대한 모델의 응답이 포함돼 있다.
import json
import openai
response = openai.Completion.create( #←ChatCompletion 대신 Completion을 사용
engine="gpt-3.5-turbo-instruct", #←model 대신 engine을 지정하고 gpt-3.5-turbo-instruct를 지정
prompt="오늘 날씨가 매우 좋고 기분이", #←prompt를 지정
stop=".", #←문자가 나타나면 문장 종료 : stop 매개변수는 생성하는 문장이 .에 도달하면 멈춘다.
max_tokens=100, #← 최대 토큰 수
n=2, #← 생성할 문장 수
temperature=0.5 #←다양성을 나타내는 매개변수
)
#temperature는 0-2의 범위로, 값이 낮아질수록 출력의 확신도가 높아진다.
print(json.dumps(response, indent=2, ensure_ascii=False))
코드 실행 결과