2 분 소요

1. LangChain 소개

LangChain은 언어 모델(LLM)을 활용한 애플리케이션 개발을 위한 프레임워크다. 다양한 LLM을 쉽게 통합하고, 체인과 에이전트를 구성하여 복잡한 작업을 수행할 수 있도록 도와준다.

2. 기본 구성 요소

2.1 LLM/Chat Models

Groq 사용

from langchain_groq import ChatGroq

# Groq LLM 초기화
chat_model = ChatGroq(
    temperature=0.1,
    model_name="model_name",
    api_key="your_api_key"
)

OpenAI 사용

from langchain_openai import ChatOpenAI

# OpenAI LLM 초기화
chat_model = ChatOpenAI(
    temperature=0.7,
    model_name="gpt-4",  # 또는 "gpt-3.5-turbo"
    api_key="your_openai_api_key"
)

Ollama 사용

from langchain_community.llms import Ollama

# Ollama LLM 초기화
llm = Ollama(
    model="llama2",  # 또는 "mistral", "codellama" 등
    temperature=0.5,
    base_url="http://localhost:11434"  # Ollama 서버 URL
)

# 또는 Ollama Chat 모델 사용
from langchain_community.chat_models import ChatOllama

chat_model = ChatOllama(
    model="llama2",
    temperature=0.5
)

2.2 프롬프트 템플릿

from langchain.prompts import PromptTemplate

# 프롬프트 템플릿 생성
prompt = PromptTemplate(
    template="Context: {context}\nQuestion: {question}\nChoices: {choices}\nAnswer: {answer}",
    input_variables=["context", "question", "choices", "answer"]
)

2.3 출력 파서

from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field

# Pydantic 모델 정의
class AnswerResponse(BaseModel):
    answer: int = Field(description="답변 번호 (1-5)", ge=1, le=5)

# 파서 초기화
parser = PydanticOutputParser(pydantic_object=AnswerResponse)

3. 주요 기능 및 사용 예시

3.1 체인 구성

LangChain은 여러 컴포넌트를 체인으로 연결하여 복잡한 작업을 수행할 수 있다.

# 프롬프트 템플릿과 출력 파서 연결
prompt = PromptTemplate(
    template=template_text + "\n{format_instructions}",
    input_variables=["context", "question", "choices"],
    partial_variables={"format_instructions": parser.get_format_instructions()}
)

3.2 비동기 처리

from concurrent.futures import ThreadPoolExecutor, as_completed

def process_batch(batch_data, model):
    with ThreadPoolExecutor() as executor:
        futures = []
        for item in batch_data:
            future = executor.submit(process_single_item, item, model)
            futures.append(future)
        
        results = []
        for future in as_completed(futures):
            results.append(future.result())
        return results

4. 실제 구현 예시

4.1 질문 생성 시스템

def generate_answer(context: str, question: str, choices: List[str]):
    """
    주어진 문맥과 질문에 대한 답변을 생성한다.
    
    Args:
        context: 문제의 문맥
        question: 질문 내용
        choices: 선택지 목록
    
    Returns:
        AnswerResponse: 1-5 사이의 답변 번호
    """
    try:
        # 프롬프트 준비
        messages = [
            {"role": "system", "content": "문제를 해결하고 정답 번호를 선택하는 assistant다."},
            {"role": "user", "content": f"Context: {context}\nQuestion: {question}\nChoices: {choices}"}
        ]
        
        # LLM에 요청
        response = chat_model.invoke(messages)
        
        # 응답 파싱
        return parser.parse(response.content)
        
    except Exception as e:
        print(f"Error generating answer: {e}")
        return None

4.2 데이터 검증 시스템

class QuestionFormatValidator(BaseModel):
    id: str = Field(description="질문 ID")
    context: str = Field(description="문제 문맥")
    question: str = Field(description="질문 내용")
    choices: List[str] = Field(description="선택지 목록")
    answer: str = Field(description="정답")
    is_error: int = Field(description="오류 여부 (1: 오류, 0: 정상)")
    error_type: str = Field(description="오류 유형 설명")

댓글남기기