본 내용은 RAG 시스템 구축을 위한 랭체인 실전 가이드 교재 및 강의 자료, 실습 자료를 사용했음을 알립니다.
- 강의 : [모두의AI] Langchain 강의
- 실습 : Kane0002/Langchain-RAG
ChatGPT의 개념과 원리
a. LLM이란?
b. ChatGPT는 왜 가장 유명해졌을까?
c. ChatGPT말고 다른 LLM!
LangChain의 개념과 원리
a. ChatGPT의 한계를 보완하는 알고리즘
b. LangChain의 종류와 역할
c. LangChain으로 할 수 있는 것
LangChain으로 나만의 챗봇 만들기
a. PDF 챗봇 구축하기
b. Word 챗봇 구축하기
c. Youtube 내용 요약하기
정보 접근 제한
a. ChatGPT(GPT-3.5)는 2021년까지의 데이터를 학습한 LLM(초거대언어모델) ➡️ 2022년부터의 정보에 대해서는 거짓 답변 or 답변 불가
토큰 제한
a. GPT-3.5, GPT-4는 각각 4096, 8152 입력 토큰 제한 존재
환각현상(Hallucination)
a. Fact 질문 ➡️ 엉뚱한 대답, 거짓말
LangChain은 In-context Learning의 도구
- 정보 접근 제한 : Vectorstore 기반 정보 탐색 or Agent 활용 검색 결합
- 토큰 제한 : TextSplitter 활용 문서 분할
- 환각현상 : 주어진 문서에 대한 대답만 하도록 prompt 입력
LLM
Prompts
Index
Memory
Chain
Agents
Document Loader
Text Splitter
Embed to Vectorstore
VectorStore Retriever
QA Chain
Closed Source
Open Source
위 두가지 형식을 적절히 활용하면, LLM을 더욱 효과적으로 사용할 수 있음
import os
os.environ["OPENAI_API_KEY"] = '{발급받은 API 키}'
- text-davinci-003은 2024년 1월 4일부터 shutdown 될 예정
- 이미 사용이 불가한 상태
ChatOpenAI
임포트하여 사용from langchain_openai import ChatOpenAI
davinch3 = ChatOpenAI(model_name="gpt-3.5-turbo")
response = davinch3.predict("Why is Python the most popular programming language? Answer in Korean.")
print(response)
파이썬이 가장 인기 있는 프로그래밍 언어인 이유는 다양한 이유가 있습니다. 첫째, 파이썬은 배우기 쉽고 읽기 쉬운 문법을 가지고 있어 초보자들도 쉽게 프로그래밍을 시작할 수 있습니다. 둘째, 파이썬은 다양한 분야에서 사용되는 범용 프로그래밍 언어로서 데이터 분석, 인공지능, 웹 개발 등 다양한 분야에서 활용될 수 있습니다. 또한, 파이썬은 커뮤니티가 활발하고 다양한 라이브러리와 프레임워크를 제공하여 개발자들이 효율적으로 프로그램을 작성할 수 있도록 도와줍니다. 이러한 이유들로 파이썬은 가장 인기 있는 프로그래밍 언어 중 하나로 자리 잡았습니다.
from langchain_openai import OpenAI
llm = OpenAI()
result = llm.invoke('왜 파이썬이 가장 인기있는 프로그래밍 언어야?')
print(result)
1. 간결하고 쉬운 문법: 파이썬은 간결하고 직관적인 문법을 가지고 있어 학습하기 쉽고 읽기 쉽습니다. 이는 프로그래밍을 처음 배우는 사람들에게 매우 유용하며, 빠르게 개발할 수 있도록 도와줍니다.
2. 다양한 분야에서 활용 가능: 파이썬은 데이터 분석, 인공지능, 웹 개발, 과학 및 공학 분야 등 다양한 분야에서 활용이 가능합니다. 또한, 간결한 문법과 다양한 라이브러리를 제공하기 때문에 빠른 개발이 가능합니다.
3. 무료 오픈소스: 파이썬은 무료로 이용할 수 있는 오픈소스 프로그래밍...
max_tokens = -1
: 토큰 수 제한을 두지 않음from langchain_openai import OpenAI
llm = OpenAI()
llm = OpenAI(model_name = 'gpt-3.5-turbo-instruct', max_tokens = -1)
result = llm.invoke('왜 파이썬이 가장 인기있는 프로그래밍 언어야?')
print(result)
1. 쉽고 간결한 문법: 파이썬은 문법이 간결하고 읽기 쉬워서 쉽게 배울 수 있습니다. 또한 들여쓰기를 강제함으로써 코드의 가독성을 높여줍니다.
2. 다양한 용도로 사용 가능: 파이썬은 데이터 분석, 인공지능, 웹 개발, 게임 개발 등 다양한 분야에서 사용될 수 있기 때문에 범용적으로 사용할 수 있습니다.
3. 대중적인 인기: 파이썬은 대중적으로 인기 있는 언어이기 때문에 다양한 개발자들이 사용하고 있습니다. 따라서 온라인에서도 다양한 커뮤니티와 자료를 찾아볼 수 있어서 학습에 용이합니다.
4. 오픈 소스: 파이썬은 오픈 소스 언어이기 때문에 무료로 사용할 수 있습니다. 또한 개발자들 사이에서 지속적으로 발전하고 있기 때문에 항상 최신 기술을 적용할 수 있습니다.
5. 다양한 라이브러리와 프레임워크: 파이썬은 다양한 라이브러리와 프레임워크가 존재하기 때문에 개발 속도가 빠르고 효율적으로 작업할 수 있습니다.
6. 크로스 플랫폼 지원: 파이썬은 윈도우, 맥, 리눅스 등 다양한 운영체제에서 동일한 코드를 실행할 수 있어서 플랫폼에 구애받지 않고 개발할 수 있습니다.
7. 배우기 쉬운 언어: 파이썬은 객체 지향 언어이지만 다른 언어들에 비해 배우기 쉬운 언어입니다. 따라서 프로그래밍 입문자들에게도 적합한 언어입니다.
8. 빠른 개발 속도: 파이썬은 컴파일 언어가 아니기 때문에 코드를 작성하고 실행하는 시간이 짧습니다. 또한 간결한 문법으로 인해 개발 속도가 빠르고 생산성이 높아집니다.
9. 커뮤니티의 지속적인 지원: 파이썬은 개발자들 사이에서 지속적인 지원과 업데이트가 이루어지고 있기 때문에 문제 발생 시 해결하기 쉽습니다.
10. 쉽게 확장 가능: 파이썬은 C나 C++ 등의 언어와의 인터페이스가 쉽게 구축될 수 있기 때문에 다른 언어와 쉽게 협업하거나 기존 코드를 확장할 수 있습니다.
max_tokens =512
from langchain_openai import ChatOpenAI
chatgpt = ChatOpenAI(model_name="gpt-3.5-turbo", max_tokens = 512)
answer = chatgpt.invoke("왜 파이썬이 가장 인기있는 프로그래밍 언어야?")
print(answer.content)
파이썬이 가장 인기 있는 프로그래밍 언어가 되었을 이유는 여러 가지가 있습니다.
1. 쉬운 문법: 파이썬은 다른 프로그래밍 언어에 비해 문법이 간단하고 직관적이기 때문에 초보자도 쉽게 배울 수 있습니다.
2. 다양한 용도: 파이썬은 웹 개발, 데이터 분석, 인공지능, 기계 학습 등 다양한 분야에서 사용되기 때문에 많은 사람들이 파이썬을 배우고 있습니다.
3. 강력한 커뮤니티: 파이썬은 오픈 소스이며 전 세계적으로 활발한 커뮤니티가 형성되어 있어서 도움을 받기 쉽고 다양한 라이브러리와 프레임워크를 사용할 수 있습니다.
4. 크로스 플랫폼 지원: 파이썬은 윈도우, 맥, 리눅스 등 다양한 운영 체제에서 사용할 수 있으며 이식성이 뛰어나기 때문에 다양한 환경에서 사용할 수 있습니다.
이러한 이유들로 인해 파이썬은 많은 프로그래머들에게 인기 있는 프로그래밍 언어가 되었습니다.
AIMessage(content='파이썬이 가장 인기 있는 프로그래밍 언어가 되었을 이유는 여러 가지가 있습니다. \n\n1. 쉬운 문법: 파이썬은 다른 프로그래밍 언어에 비해 문법이 간단하고 직관적이기 때문에 초보자도 쉽게 배울 수 있습니다.\n\n2. 다양한 용도: 파이썬은 웹 개발, 데이터 분석, 인공지능, 기계 학습 등 다양한 분야에서 사용되기 때문에 많은 사람들이 파이썬을 배우고 있습니다.\n\n3. 강력한 커뮤니티: 파이썬은 오픈 소스이며 전 세계적으로 활발한 커뮤니티가 형성되어 있어서 도움을 받기 쉽고 다양한 라이브러리와 프레임워크를 사용할 수 있습니다.\n\n4. 크로스 플랫폼 지원: 파이썬은 윈도우, 맥, 리눅스 등 다양한 운영 체제에서 사용할 수 있으며 이식성이 뛰어나기 때문에 다양한 환경에서 사용할 수 있습니다.\n\n이러한 이유들로 인해 파이썬은 많은 프로그래머들에게 인기 있는 프로그래밍 언어가 되었습니다.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 403, 'prompt_tokens': 32, 'total_tokens': 435, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-b5b70212-b08c-42b1-aeee-4e26da40e4b3-0', usage_metadata={'input_tokens': 32, 'output_tokens': 403, 'total_tokens': 435, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})
Temperature
chatgpt_temp0_1 = ChatOpenAI(model_name="gpt-3.5-turbo", temperature = 0, max_tokens = 512)
chatgpt_temp0_2 = ChatOpenAI(model_name="gpt-3.5-turbo", temperature = 0, max_tokens = 512)
chatgpt_temp1_1 = ChatOpenAI(model_name="gpt-3.5-turbo", temperature = 1, max_tokens = 512)
chatgpt_temp1_2 = ChatOpenAI(model_name="gpt-3.5-turbo", temperature = 1, max_tokens = 512)
model_list = [chatgpt_temp0_1, chatgpt_temp0_2, chatgpt_temp1_1, chatgpt_temp1_2]
for i in model_list:
answer = i.invoke("왜 파이썬이 가장 인기있는 프로그래밍 언어야?", max_tokens = 128)
print("-"*100)
print(">>>",answer.content)
StreamingStdOutCallbackHandler
사용from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
chatgpt = ChatOpenAI(model_name="gpt-3.5-turbo", streaming=True, callbacks=[StreamingStdOutCallbackHandler()], temperature = 1)
answer = chatgpt.predict("왜 파이썬이 가장 인기있는 프로그래밍 언어야?")
from langchain.chat_models import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage, SystemMessage
chatgpt = ChatOpenAI(model_name="gpt-3.5-turbo", temperature = 1)
messages = [
SystemMessage(
content="너는 20년차 시니어 개발자야. 사용자의 질문에 매우 건방지게 대답해줘."
),
HumanMessage(
content="파이썬의 장점에 대해서 설명해줘."
),
]
response_langchain = chatgpt.invoke(messages)
response_langchain.content
!pip install -U langchain-community
from langchain.globals import set_llm_cache
from langchain_openai import OpenAI
# To make the caching really obvious, lets use a slower model.
llm = OpenAI(model_name="gpt-3.5-turbo-instruct", n=2, best_of=2)
%%time
from langchain.cache import InMemoryCache
set_llm_cache(InMemoryCache())
# The first time, it is not yet in cache, so it should take longer
llm.predict("Tell me a joke")
%%time
# The second time it is, so it goes faster
llm.predict("Tell me a joke")
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage, AIMessage
chat = ChatOpenAI(model_name = "gpt-4-0125-preview", temperature = 1,
streaming=True, callbacks=[StreamingStdOutCallbackHandler()])
answer = chat(
[
SystemMessage(content="""당신은 공부 계획을 세워주는 스터디 플래너 머신입니다.
사용자의 공부 주제를 입력 받으면, 이를 학습하기 위한 공부 계획을 작성합니다."""),
HumanMessage(content="Large Language Model에 대해서 공부하고 싶어요.")
]
)
answer
print(answer.content)
실습 코드 : textbook/LLM/Day01/PromptTemplate,LLM프롬프트입력을더편하게실습.ipynb
!pip install -q openai langchain langchain-openai
!pip install -U langchain-community
#API KEY 저장을 위한 os 라이브러리 호출
import os
#기본 LLM 로드를 위한 라이브러리 호출
from langchain.llms import OpenAI
#채팅 LLM 로드를 위한 라이브러리 호출
from langchain.chat_models import ChatOpenAI
from langchain_community.chat_models import ChatOpenAI
#OPENAI API키 저장
os.environ["OPENAI_API_KEY"] = '{발급 받은 키}'
gpt3 = ChatOpenAI(
model_name="gpt-3.5-turbo",
max_tokens=1000
)
from langchain.prompts import PromptTemplate, ChatPromptTemplate
#프롬프트 템플릿을 통해 매개변수 삽입 가능한 문자열로 변환
string_prompt = PromptTemplate.from_template("tell me a joke about {subject}")
#매개변수 삽입한 결과를 string_prompt_value에 할당
string_prompt_value = string_prompt.format_prompt(subject="soccer")
#채팅LLM이 아닌 LLM과 대화할 때 필요한 프롬프트 = string prompt
string_prompt_value
to_string()
print(string_prompt_value.to_string())
chat_prompt = ChatPromptTemplate.from_template("tell me a joke about {subject}")
chat_prompt_value = chat_prompt.format_prompt(subject="soccer")
chat_prompt_value
to_string()
chat_prompt_value.to_string()
프롬프트 반복 삽입
GPT-3와 프롬프트 템플릿을 활용하여 대화해보기
input_variables
에 리스트 형태로 담기prompt_template.format
으로 입력값 넣기from langchain.prompts.prompt import PromptTemplate
template = """
너는 요리사야. 내가 가진 재료들을 갖고 만들 수 있는 요리를 추천하고, 그 요리의 레시피를 제시해줘.
내가 가진 재료는 아래와 같아.
<재료>
{재료}
"""
prompt_template = PromptTemplate(
input_variables = ['재료'],
template = template
)
print(prompt_template.format(재료 = '양파, 계란, 사과, 빵'))
response = gpt3.predict(
prompt_template.format(재료="양파, 계란, 사과, 빵")
)
print(response)
from langchain.prompts import (
ChatPromptTemplate,
PromptTemplate,
SystemMessagePromptTemplate,
AIMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
# ChatGPT 모델 로드
chatgpt = ChatOpenAI(temperature=0)
# 역할 부여(위에서 정의한 Template 사용)
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
# 사용자가 입력할 매개변수 template 선언
human_template = "{재료}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
#ChatPromptTemplate에 system message와 human message 템플릿 삽입
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
answer = chatgpt(chat_prompt.format_prompt(재료="양파, 계란, 사과, 빵").to_messages())
print(answer.content)
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate
examples = [
{
"question": "아이유로 삼행시 만들어줘",
"answer":
"""
아: 아이유는
이: 이런 강의를 들을 이
유: 유가 없다.
"""
},
{
"question": "김민수로 삼행시 만들어줘",
"answer":
"""
김: 김치는 맛있다
민: 민달팽이도 좋아하는 김치!
수: 수억을 줘도 김치는 내꺼!
"""
}
]
example_prompt = PromptTemplate(input_variables=["question", "answer"], template="Question: {question}\n{answer}")
print(example_prompt.format(**examples[0]))
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="Question: {input}",
input_variables=["input"]
)
print(prompt.format(input="호날두로 삼행시 만들어줘"))
print(gpt3.predict("호날두로 삼행시 만들어줘"))
formatted_prompt = prompt.format(input="호날두로 삼행시 만들어줘")
response = gpt3([{"role": "user", "content": formatted_prompt}])
print(response.content)
Example Selector
활용
LLM이 여러 작업을 수행하면서도 원하는 범위의 대답을 출력하도록 하려면..
SemanticSimilarityExampleSelector
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="Input: {input}\nOutput: {output}",
)
# These are a lot of examples of a pretend task of creating antonyms.
examples = [
# 감정 비교
{"input": "행복", "output": "슬픔"},
{"input": "흥미", "output": "지루"},
{"input": "불안", "output": "안정"},
# 대소 단위 비교
{"input": "긴 기차", "output": "짧은 기차"},
{"input": "큰 공", "output": "작은 공"},
]
!pip install chromadb
!pip install tiktoken
example_selector
: 입력과 유사한 예시를 찾기 위해 OpenAI 임베딩과 Chroma를 사용하여 가장 비슷한 예시를 선택FewShotPromptTemplate
: 선택된 예시를 바탕으로, "반대 의미를 가진 단어"를 출력하는 프롬프트를 생성example_selector = SemanticSimilarityExampleSelector.from_examples(
examples,
OpenAIEmbeddings(),
Chroma,
k=1
)
similar_prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
prefix="주어진 입력에 대해 반대의 의미를 가진 단어를 출력해줘",
suffix="Input: {단어}\nOutput:",
input_variables=["단어"],
)
print(similar_prompt.format(단어="무서운"))
print(similar_prompt.format(단어="큰 비행기"))
query = "큰 비행기"
print(gpt3(
similar_prompt.format(단어=query)
))
OutputParser
CommaSeparatedListOutputParser
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
output_parser = CommaSeparatedListOutputParser()
get_format_instructions
: 기본 형태 파악format_instructions = output_parser.get_format_instructions()
format_instructions
prompt = PromptTemplate(
template="{주제} 5개를 추천해줘.\n{format_instructions}",
input_variables=["주제"],
partial_variables={"format_instructions": format_instructions}
)
model = OpenAI(temperature=0)
_input = prompt.format(주제="영화")
output = model(_input)
output
output_parser.parse(output)