[langchain] LangChain에 대한 완벽한 가이드: 대규모 언어 모델로 강력한 애플리케이션 구축하기
[langchain] LangChain에 대한 완벽한 가이드: 대규모 언어 모델로 강력한 애플리케이션 구축하기
안녕하세요! 개발자가 대규모 언어 모델 (LLM) 및 기타 계산 리소스를 사용하여 강력한 애플리케이션을 구축할 수 있도록 지원하는 멋진 라이브러리인 LangChain을 소개해드리겠습니다. 이 가이드에서는 LangChain이 어떻게 작동하는지에 대해 간략하게 설명하고 질문 답변, 챗봇, 에이전트와 같은 몇 가지 멋진 사용 사례를 살펴보겠습니다. 또한 시작하는 데 도움이 되는 빠른 시작 가이드도 안내해드리겠습니다. 시작해보겠습니다!
2023.03.03 - [개발, 코딩해볼래?/AI, 그리고 ChatGPT, LangChain] - ChatGPT의 미래는? (왜 사용하고 활용을 해야할까?)
랭체인이란 무엇인가요?
LangChain은 개발자가 언어 모델을 사용하여 엔드투엔드 애플리케이션을 구축할 수 있도록 설계된 강력한 프레임워크입니다. 대규모 언어 모델(LLM)과 채팅 모델로 구동되는 애플리케이션을 만드는 과정을 간소화하는 도구, 구성 요소 및 인터페이스 제품군을 제공합니다. LangChain을 사용하면 언어 모델과의 상호 작용을 쉽게 관리하고, 여러 구성 요소를 연결하고, API 및 데이터베이스와 같은 추가 리소스를 통합할 수 있습니다.
랭체인에는 여러 가지 핵심 개념이 있습니다. 하나씩 살펴보도록 하겠습니다:
1. 구성 요소 및 체인
랭체인에서 구성 요소는 강력한 애플리케이션을 만들기 위해 결합할 수 있는 모듈식 빌딩 블록입니다. 체인은 특정 작업을 수행하기 위해 조합된 일련의 구성 요소(또는 다른 체인)입니다. 예를 들어, 체인에는 프롬프트 템플릿, 언어 모델, 출력 파서가 포함될 수 있으며, 모두 함께 작동하여 사용자 입력을 처리하고, 응답을 생성하고, 출력을 처리합니다.
2. 프롬프트 템플릿 및 값
프롬프트 템플릿은 언어 모델에 최종적으로 전달되는 프롬프트 값을 생성하는 역할을 합니다. 프롬프트 템플릿은 사용자 입력 및 기타 동적 정보를 언어 모델에 적합한 형식으로 변환하는 데 도움이 됩니다. PromptValues는 각 모델 유형이 기대하는 정확한 입력 유형(예: 텍스트 또는 채팅 메시지)으로 변환할 수 있는 메서드가 있는 클래스입니다.
3. 선택기 예시
예제 선택기는 프롬프트에 예제를 동적으로 포함하려는 경우에 유용합니다. 사용자 입력을 받아 프롬프트에서 사용할 예제 목록을 반환하므로 더욱 강력하고 상황에 맞게 사용할 수 있습니다.
4. 출력 파서
출력 파서는 언어 모델 응답을 보다 사용하기 쉬운 형식으로 구조화하는 작업을 담당합니다. 형식 지정 지침을 제공하는 방법과 언어 모델의 응답을 구조화된 형식으로 구문 분석하는 방법 등 두 가지 주요 방법을 구현합니다. 이를 통해 애플리케이션에서 출력 데이터로 더 쉽게 작업할 수 있습니다.
5. Indexes and Retrievers
색인은 언어 모델이 문서와 더 쉽게 상호 작용할 수 있도록 문서를 구성하는 방법입니다. 리트리버는 관련 문서를 가져와 언어 모델과 결합하기 위한 인터페이스입니다. LangChain은 벡터 데이터베이스 및 텍스트 스플리터와 같은 다양한 유형의 인덱스 및 검색기로 작업할 수 있는 도구와 기능을 제공합니다.
6. 채팅 기록 메시지
LangChain은 주로 채팅 인터페이스를 통해 언어 모델과 상호작용합니다. ChatMessageHistory 클래스는 이전의 모든 채팅 상호 작용을 기억하고, 이를 다시 모델에 전달하거나 요약하거나 다른 방식으로 결합할 수 있습니다. 이를 통해 컨텍스트를 유지하고 대화에 대한 모델의 이해도를 높일 수 있습니다.
7. 에이전트 및 툴킷
에이전트는 랭체인에서 의사 결정을 내리는 주체입니다. 에이전트는 일련의 도구에 액세스할 수 있으며 사용자 입력에 따라 어떤 도구를 호출할지 결정할 수 있습니다. 툴킷은 함께 사용할 때 특정 작업을 수행할 수 있는 도구 세트입니다. 에이전트 실행자는 적절한 도구로 에이전트를 실행할 책임이 있습니다.
이러한 핵심 개념을 이해하고 활용하면 LangChain의 강력한 기능을 활용하여 적응 가능하고 효율적이며 복잡한 사용 사례를 처리할 수 있는 고급 언어 모델 애플리케이션을 구축할 수 있습니다.
2023.05.17 - [개발, 코딩해볼래?/AI, 그리고 ChatGPT, LangChain] - [Langchain] 랭체인의 장점 살펴보기: 혁신적인 언어 학습 플랫폼
랭체인 에이전트란 무엇인가요?
랭체인 에이전트는 프레임워크에서 의사결정을 주도하는 엔티티입니다. 에이전트는 일련의 도구에 액세스할 수 있으며 사용자의 입력에 따라 어떤 도구를 호출할지 결정할 수 있습니다. 에이전트는 상황에 맞는 적응형 응답이 필요한 복잡한 애플리케이션을 구축하는 데 도움이 됩니다. 에이전트는 사용자의 입력 및 기타 요인에 따라 알 수 없는 일련의 상호 작용이 있을 때 특히 유용합니다.
랭체인을 어떻게 사용하나요?
LangChain을 사용하려면 개발자는 LLM, 채팅 모델, 에이전트, 체인, 메모리 기능 등 필요한 구성 요소와 도구를 가져오는 것부터 시작합니다. 이러한 구성 요소를 결합하여 사용자 입력을 이해하고, 처리하고, 응답할 수 있는 애플리케이션을 만듭니다.
LangChain은 개인 비서, 문서에 대한 질문 답변, 챗봇, 표 형식 데이터 쿼리, API와의 상호 작용, 추출, 평가 및 요약과 같은 특정 사용 사례를 위한 다양한 구성 요소를 제공합니다.
랭체인 모델이란 무엇인가요?
LangChain 모델은 프레임워크에서 사용되는 다양한 유형의 모델을 나타내는 추상화입니다. LangChain에는 세 가지 주요 모델 유형이 있습니다:
- LLM(대규모 언어 모델): 이러한 모델은 텍스트 문자열을 입력으로 받아 텍스트 문자열을 출력으로 반환합니다. 많은 언어 모델 애플리케이션의 근간을 이루는 모델입니다.
- 채팅 모델: 채팅 모델: 채팅 모델은 언어 모델에 의해 지원되지만 보다 구조화된 API를 가지고 있습니다. 채팅 메시지 목록을 입력으로 받아 채팅 메시지를 반환합니다. 따라서 대화 기록을 쉽게 관리하고 컨텍스트를 유지할 수 있습니다.
- 텍스트 임베딩 모델: 이 모델은 텍스트를 입력으로 받아 텍스트의 임베딩을 나타내는 플로트 목록을 반환합니다. 이러한 임베딩은 문서 검색, 클러스터링, 유사성 비교와 같은 작업에 사용할 수 있습니다.
개발자는 자신의 사용 사례에 적합한 랭체인 모델을 선택하고 제공된 구성 요소를 활용하여 애플리케이션을 구축할 수 있습니다.
LangChain의 주요 기능
LangChain은 6가지 주요 영역에서 개발자를 지원하도록 설계되었습니다:
- LLM 및 프롬프트: LangChain을 사용하면 프롬프트를 쉽게 관리하고, 최적화하고, 모든 LLM을 위한 범용 인터페이스를 만들 수 있습니다. 또한, LLM 작업을 위한 몇 가지 편리한 유틸리티도 포함되어 있습니다.
- 체인: LLM 또는 기타 유틸리티에 대한 호출 시퀀스입니다. LangChain은 체인을 위한 표준 인터페이스를 제공하고, 다양한 도구와 통합되며, 널리 사용되는 애플리케이션을 위한 엔드투엔드 체인을 제공합니다.
- 데이터 증강 생성: LangChain을 사용하면 체인이 외부 데이터 소스와 상호 작용하여 생성 단계에 필요한 데이터를 수집할 수 있습니다. 예를 들어, 긴 텍스트를 요약하거나 특정 데이터 소스를 사용하여 질문에 답하는 데 도움이 될 수 있습니다.
- 에이전트: 에이전트를 통해 LLM은 작업에 대한 결정을 내리고, 해당 작업을 수행하고, 결과를 확인하고, 작업이 완료될 때까지 계속 진행할 수 있습니다. LangChain은 에이전트를 위한 표준 인터페이스, 선택할 수 있는 다양한 에이전트, 엔드투엔드 에이전트의 예시를 제공합니다.
- 메모리: LangChain에는 메모리용 표준 인터페이스가 있어 체인 또는 에이전트 호출 사이의 상태를 유지하는 데 도움이 됩니다. 또한 다양한 메모리 구현과 메모리를 사용하는 체인 또는 에이전트의 예시를 제공합니다.
- 평가: 기존 메트릭으로는 제너레이티브 모델을 평가하기 어렵습니다. 그렇기 때문에 LangChain은 개발자가 직접 LLM을 사용하여 모델을 평가할 수 있도록 프롬프트와 체인을 제공합니다.
사용 사례
LangChain은 다음과 같은 다양한 사용 사례를 지원합니다:
- 특정 문서에 대한 질문 답변: 주어진 문서를 기반으로 질문에 답하고 해당 문서의 정보를 사용하여 답변을 작성합니다.
- 챗봇: LLM의 기능을 활용하여 텍스트를 생성할 수 있는 챗봇을 구축하세요.
- 에이전트: 조치를 결정하고, 해당 조치를 취하고, 결과를 관찰하고, 완료될 때까지 계속 진행할 수 있는 에이전트를 개발하세요.
빠른 시작 가이드: LangChain으로 엔드투엔드 언어 모델 애플리케이션 구축하기
설치
먼저 LangChain을 설치해 보겠습니다. 다음 명령을 실행하기만 하면 됩니다:
pip install langchain
환경 설정
이제 LangChain은 모델 공급자, 데이터 저장소, API 등과 통합해야 하는 경우가 많으므로 환경을 설정하겠습니다. 이 예제에서는 OpenAI의 API를 사용할 예정이므로 해당 SDK를 설치해야 합니다:
pip install openai
다음으로 터미널에서 환경 변수를 설정해 보겠습니다:
export OPENAI_API_KEY="..."
또는 Jupyter 노트북이나 Python 스크립트 내에서 작업하는 것을 선호하는 경우 다음과 같이 환경 변수를 설정할 수 있습니다:
import os.environ["OPENAI_API_KEY"] = "..."
언어 모델 애플리케이션 구축하기: LLM
LangChain이 설치되고 환경이 설정되었으므로 언어 모델 애플리케이션을 구축할 준비가 되었습니다. LangChain은 언어 모델 애플리케이션을 만드는 데 사용할 수 있는 다양한 모듈을 제공합니다. 이러한 모듈을 결합하여 더 복잡한 애플리케이션을 만들거나 개별적으로 사용하여 더 간단한 애플리케이션을 만들 수 있습니다.
언어 모델 애플리케이션 구축하기: 채팅 모델
LLM 외에도 채팅 모델로 작업할 수도 있습니다. 이는 내부적으로 언어 모델을 사용하지만 인터페이스가 다른 언어 모델의 변형입니다. 채팅 모델은 "텍스트 입력, 텍스트 출력" API 대신 채팅 메시지를 입력 및 출력으로 사용합니다. 채팅 모델 API는 매우 새롭기 때문에 모든 사람들이 여전히 최상의 추상화를 찾아내고 있습니다.
채팅 완료를 얻으려면 하나 이상의 메시지를 채팅 모델에 전달해야 합니다. LangChain은 현재 AIMessage, 휴먼메시지, 시스템메시지, 채팅메시지 유형을 지원합니다. 주로 휴먼메시지, AI메시지, 시스템메시지를 사용하게 될 것입니다.
다음은 채팅 모델 사용의 예입니다:
from langchain.chat_models import ChatOpenAI
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
chat = ChatOpenAI(temperature=0)
하나의 메시지를 전달하여 완료를 받을 수 있습니다:
chat([HumanMessage(content="Translate this sentence from English to Korea. I love programming.")])
또는 OpenAI의 gpt-3.5-turbo 및 gpt-4 모델에 대한 여러 메시지를 전달할 수도 있습니다:
messages = [
SystemMessage(content="You are a helpful assistant that translates English to Korea."),
HumanMessage(content="Translate this sentence from English to Korea. I love programming.")
]
chat(messages)
생성하기를 사용하여 여러 메시지 세트에 대한 완성을 생성할 수도 있습니다. 그러면 추가 메시지 매개변수가 포함된 LLMResult가 반환됩니다:
batch_messages = [
[
SystemMessage(content="You are a helpful assistant that translates English to Korea."),
HumanMessage(content="Translate this sentence from English to Korea. I love programming.")
],
[
SystemMessage(content="You are a helpful assistant that translates English to Korea."),
HumanMessage(content="Translate this sentence from English to Korea. I love artificial intelligence.")
],
]
result = chat.generate(batch_messages)
또한 LLMResult에서 토큰 사용량과 같은 정보를 추출할 수 있습니다:
result.llm_output['token_usage']
채팅 모델에서는 메시지 프롬프트 템플릿을 사용하여 템플릿을 사용할 수도 있습니다. 하나 이상의 메시지 프롬프트 템플릿에서 ChatPromptTemplate을 만들 수 있습니다. ChatPromptTemplate의 format_prompt 메서드는 형식이 지정된 값을 LLM 또는 채팅 모델에 입력으로 사용할지 여부에 따라 문자열이나 메시지 개체로 변환할 수 있는 PromptValue를 반환합니다.
예를 들면 다음과 같습니다:
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
chat = ChatOpenAI(temperature=0)
template="You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
# get a chat completion from the formatted messages
chat(chat_prompt.format_prompt(input_language="English", output_language="Korea", text="I love programming.").to_messages())
채팅 모델과 함께 LLMChain을 사용할 수도 있습니다:
from langchain.chat_models import ChatOpenAI
from langchain import LLMChain
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
chat = ChatOpenAI(temperature=0)
template="You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chain = LLMChain(llm=chat, prompt=chat_prompt)
chain.run(input_language="English", output_language="Korea", text="I love programming.")
채팅 모델과 함께 상담원을 사용할 수도 있습니다. 상담원 유형으로 AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION을 사용하여 상담원을 초기화합니다:
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.chat_models import ChatOpenAI
from langchain.llms import OpenAI
# First, let's load the language model we're going to use to control the agent.
chat = ChatOpenAI(temperature=0)
# Next, let's load some tools to use. Note that the `llm-math` tool uses an LLM, so we need to pass that in.
llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# Finally, let's initialize an agent with the tools, the language model, and the type of agent we want to use.
agent = initialize_agent(tools, chat, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# Now let's test it out!
agent.run("Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?")
이 예에서는 상담원이 대화형 검색 및 계산을 수행하여 최종 답변을 제공합니다.
마지막으로 채팅 모델로 초기화된 체인 및 상담원과 함께 메모리를 사용하는 방법을 살펴보겠습니다. 이것과 LLM용 메모리의 주요 차이점은 이전 메시지를 하나의 문자열로 압축하지 않고 고유한 메모리 개체로 유지할 수 있다는 점입니다.
다음은 컨버세이션체인 사용 예시입니다:
from langchain.prompts import (
ChatPromptTemplate,
MessagesPlaceholder,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate
)
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory
prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know."),
MessagesPlaceholder(variable_name="history"),
HumanMessagePromptTemplate.from_template("{input}")
])
llm = ChatOpenAI(temperature=0)
memory = ConversationBufferMemory(return_messages=True)
conversation = ConversationChain(memory=memory, prompt=prompt, llm=llm)
conversation.predict(input="Hi there!")
# -> 'Hello! How can I assist you today?'
conversation.predict(input="I'm doing well! Just having a conversation with an AI.")
# -> "That sounds like fun! I'm happy to chat with you. Is there anything specific you'd like to talk about?"
conversation.predict(input="Tell me about yourself.")
# -> "Sure! I am an AI language model created by OpenAI. I was trained on a large dataset of text from the internet, which allows me to understand and generate human-like language. I can answer questions, provide information, and even have conversations like this one. Is there anything else you'd like to know about me?"
이 예제에서는 AI와의 여러 상호작용에서 대화의 컨텍스트를 유지하기 위해 컨버세이션체인을 사용했습니다.
여기까지입니다! 이제 LangChain을 사용하여 엔드투엔드 언어 모델 애플리케이션을 구축하는 방법을 확실히 이해하셨을 것입니다. 이 예제를 따라 LLM, 채팅 모델, 에이전트, 체인 및 메모리 기능을 사용하여 강력한 언어 모델 애플리케이션을 개발할 수 있습니다.
'개발, 코딩해볼래? > AI, 그리고 ChatGPT, LangChain' 카테고리의 다른 글
[Langchain] 랭체인의 장점 살펴보기: 혁신적인 언어 학습 플랫폼 (0) | 2023.05.17 |
---|---|
[Langchain] Langchain hub ui - 랭체인 허브 프론트 (0) | 2023.05.02 |
[ChatGPT] 샘알트먼의 GPT-4, AIG(Artificial general intelligence) 의견 (0) | 2023.04.12 |
[AI] ChatGPT-4 출시는 우리 생활에 어떤 의미를 가지는가? (0) | 2023.03.14 |
[AI] ChatGPT가 가져올 세상의 변화, 우리는 무엇을 준비 해야하나? (0) | 2023.03.12 |
댓글