최근 나타나는 새로운 기술 'Prompt Engineering'을 따라 'LMOps'도 주목받기 시작했습니다. 'LangChain'이란 무엇일까요? 그리고 LangChain을 사용하면 어떤 기능을 할 수 있을까요? 이러한 궁금증을 해결해 줄 글들을 시리즈로 준비했습니다.
- 지시(Instruction)
- 모델에게 특정 작업이나 지시를 제공합니다.
- 예시: "다음 문장을 번역해주세요."- 문맥(Context)
- 응답을 더 효과적이게 만들기 위해 제공되는 배경 정보나 추가적인 문맥을 의미합니다.
- 예시: "이 문장은 18세기 중반의 영국에서 쓰여진 것입니다."- 입력 데이터(Input Data)
- 모델에게 응답을 요청하는 실제 질문이나 데이터입니다.
- 예시: "The sun never sets on the British Empire."- 출력 지시자(Output Indicator)
- 원하는 출력의 형식이나 특징에 대한 지시를 제공합니다.
- 예시: "영-한 번역으로 제공해주세요."
LangChain은 큰 언어 모델(LLM)을 바탕으로 어플리케이션을 개발하기 위한 프레임워크입니다. 이것을 'LLM Orchestration'이라고도 합니다. LLM은 다양한 텍스트를 이해하는 능력이 뛰어나고, 'Chain'은 여러 서드파티 애플리케이션을 연결하는 인터페이스를 의미합니다. 이 글은 LangChain 공식 문서의 내용을 한글로 정리한 것입니다.
ArxivLoader, AzureBlobStorageContainerLoader, DataFrameLoader, DatadogLogsLoader, DirectoryLoader, DiscordChatLoader, FigmaFileLoader, GitLoader, GoogleApiYoutubeLoader, YoutubeAudioLoader, PsychicLoader, SeleniumURLLoader, WikipediaLoader, PythonLoader, HuggingFaceDatasetLoader, ChatGPTLoader, BigQueryLoader, GMailLoader, SlackChatLoader, UnstructuredImageLoader, NotionDirectoryLoader, WeatherDataLoader, ...
1. 로딩: 먼저 데이터를 로드해야 합니다. 비구조화 데이터는 다양한 소스에서 로드할 수 있습니다.
2. 분할: 텍스트 분할기는 지정된 크기의 분할로 문서를 나눕니다.
3. 저장: 저장소(예: vector store)는 주로 분할된 문서를 저장하는데, 문서를 Embedding해서 저장할 수 있습니다.
검색: 앱은 저장소에서 분할된 문서를 검색합니다. Embedding된 vector가 있을 경우, vector 정보와 함께 검색합니다.
생성: LLM은 질문 + 검색된 데이터를 포함한 프롬프트를 사용하여 답변을 생성합니다.
"""Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.{context}Question: {question}Helpful Answer:"""
대화 (확장): QA 체인에 메모리를 추가하여 다중 턴 대화를 진행합니다.
from langchain.document_loaders.pdf import PyPDFLoader
pdf_url = '/some/path/of/pdf_file.pdf'
loader = PyPDFLoader(pdf_url)
data = loader.load()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size = 800, chunk_overlap = 100)
all_splits = text_splitter.split_documents(data)
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
vectorstore = Chroma.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())
question = "apple에 대해서 설명해줘"
docs = vectorstore.similarity_search(question)
docs
# [Document(
# page_content='there is something red, \n...',
# metadata={'page': 7, 'source': '/some/path/of/pdf_file.pdf'}
# ), ... ]
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm, retriever=vectorstore.as_retriever())
response = qa_chain({"query": question})