LangChain이란?

컴퓨터가 사람처럼 말하고 이해할 수 있도록 돕는 특별한 프로그램으로 우리가 컴퓨터에게 어떤 일을 시킬 때, 그 일을 더 잘 이해하고 수행할 수 있도록 도와준다. 예를 들어, 컴퓨터에게 "이 문장을 영어에서 한국어로 번역해줘"라고 말하면, LangChain은 그 요청을 잘 처리할 수 있게 해준다.

 

LangChain은 대규모 언어 모델(LLM)이라는 것을 사용하며, LLM은 아주 많은 양의 텍스트 데이터를 학습해서 사람처럼 자연스럽게 말을 생성할 수 있는 컴퓨터 프로그램이다.

예를 들어, ChatGPT 같은 프로그램이 LLM의 일종이다.

 

LangChain의 주요 기능

  1. 프롬프트 템플릿 사용하기
    • 프롬프트 템플릿은 컴퓨터에게 어떤 역할을 수행할지 지시하는 방법
    • 컴퓨터가 번역가처럼 행동하도록 하려면, 번역할 문장을 주고 "이걸 다른 언어로 바꿔줘"라는 지시를 내리면 컴퓨터는 주어진 문장을 다른 언어로 번역
  2. 체인 구성하기
    • 체인은 여러 작업을 순서대로 연결하여 수행하는 것을 의미
    • 복잡한 프로세스를 여러 단계로 나누고, 각 단계를 자동으로 처리
      • 정보 수집: 웹에서 정보 수집
      • 정보 분석: 가져온 정보를 분석하고 요약
      • 결과 제공: 분석 결과를 사용자에게 전달
    • 체인 구조는 반복적인 작업이나 복잡한 문제 해결에 매우 유용, 마치 요리 레시피를 따라 여러 단계를 거쳐 요리를 완성하는 것과 비슷
  3. 메모리 기능
    • LangChain에는 메모리 기능이 있어서, 이전에 했던 대화나 작업의 내용을 기억
    • 컴퓨터는 대화의 맥락을 이해하고, 더 자연스럽고 일관성 있는 대화를 유지
    • 메모리 기능은 컴퓨터가 사람처럼 기억력

LangChain의 장점

  • 개발 용이성: 복잡한 LLM 기반 애플리케이션 개발 과정을 단순화
  • 다양한 언어 모델 지원: OpenAI의 GPT와 같은 다양한 언어 모델과 연동하여 사용
  • 확장 가능성: 여러 모듈로 구성되어 있어, 필요에 따라 기능을 추가하거나 조합하여 사용

LangChain의 단점

  • 복잡성과 문서화 부족: LangChain은 복잡한 추상화 구조로 인해 사용자가 이해하고 수정하기 어려우며, 문서화가 불충분하여 중요한 세부 사항이 부족
  • 신뢰성과 통합 문제: 쉽게 깨지거나 신뢰할 수 없는 경우가 발생할 수 있으며, 기존 도구와의 통합이 어렵다
  • 제한된 가치와 대안 존재: 충분한 가치를 제공하지 않는다고 느낄 수 있으며, Semantic Kernel 등 더 나은 대안들이 존재

LangChain의 응용 분야

  • 고객 서비스: 자동 응답 시스템을 구축하여 고객 문의에 신속하게 대응
  • 콘텐츠 생성: 글쓰기 도우미나 번역기 등 콘텐츠 생성 작업을 자동화
  • 데이터 분석: 대량의 데이터를 분석하고 요약하여 인사이트를 제공하는 데 사용

 

LangChain의 예제

  • 파이썬 예제
pip install openai langchain
import os
from langchain import OpenAI, LLMChain
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
from langchain.vectorstores.chroma import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings


os.environ["OPENAI_API_KEY"] = "your_openai_api_key"

# OpenAI 모델 초기화
llm = OpenAI(model_name="gpt-3.5-turbo")

# 벡터 데이터베이스 및 임베딩 설정
embeddings = OpenAIEmbeddings()
vectorstore = Chroma(embedding_function=embeddings)

# 대화 기록 메모리 설정
memory = ConversationBufferMemory()

# 대화형 질의응답 체인 생성
qa_chain = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=vectorstore.as_retriever(),
    get_chat_history=memory,
    memory=True,
    return_generated_question=False,
    verbose=True
)

# 질의응답 실행 예시
chat_history = []

def ask_question(question):
    response = qa_chain.invoke({"input": question, "chat_history": chat_history})
    chat_history.append({"type": "human", "content": question})
    chat_history.append({"type": "ai", "content": response})
    return response

# 예시 질문 및 응답
print(ask_question("What is the capital of France?"))
print(ask_question("And what about Germany?"))
  • 장고 예제
pip install django djangorestframework langchain openai
django-admin startproject myproject
cd myproject
django-admin startapp myapp
# myapp/models.py
from django.db import models

class Question(models.Model):
    text = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.text
        
        
# myapp/serializers.py
from rest_framework import serializers
from .models import Question

class QuestionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Question
        fields = ['id', 'text', 'created_at']
        

# myapp/views.py
from rest_framework import viewsets, status
from rest_framework.response import Response
from .models import Question
from .serializers import QuestionSerializer
from langchain import OpenAI, LLMChain

class QuestionViewSet(viewsets.ModelViewSet):
    queryset = Question.objects.all()
    serializer_class = QuestionSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        
        # OpenAI 모델 초기화 및 LangChain 사용
        llm = OpenAI(model_name="gpt-3.5-turbo")
        chain = LLMChain(llm=llm, prompt=f"Answer the following question: {serializer.validated_data['text']}")
        
        # LangChain을 통한 응답 생성
        response = chain.run()
        
        # 질문 저장 및 응답 반환
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response({'question': serializer.data, 'answer': response}, status=status.HTTP_201_CREATED, headers=headers)
        
        
# myproject/urls.py
from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from myapp.views import QuestionViewSet

router = DefaultRouter()
router.register(r'questions', QuestionViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),
]

+ Recent posts