LangChain: 간단한 번역 LLM 애플리케이션 구축

calico·2025년 5월 16일

Artificial Intelligence

목록 보기
26/144

출처


1. 환경 준비 및 필수 라이브러리 설치


1) 프로젝트 폴더 구조 및 파일명 예시


langchain-translator/
├── .env
├── translate.py
├── requirements.txt
└── (추가 폴더 및 파일: 필요시)
  • langchain-translator/: 폴더명(원하는 대로 지정)

  • .env: OpenAI API 키 등 환경 변수 저장 파일

  • translate.py: Python 메인 실행 파일 (코드 예시 그대로)

  • requirements.txt: 설치해야 할 패키지 목록 (옵션, 배포 시 유용)



2) 파일별 내용


.env


  • 반드시 프로젝트 루트(최상위)에 위치시키세요.
  • 아래 형식으로 반드시 자신의 API 키를 적어주세요.
    OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • 절대 git 등 공개 저장소에 올리지 않도록 주의!



requirements.txt


  • 이 파일은 패키지 설치 자동화를 위해 사용합니다.

  • 내용 예시:

langchain_core
langchain_openai
python-dotenv
  • 이후 한줄 명령어로 한 번에 설치:
pip install -r requirements.txt



translate.py


  • 파일명은 원하시는 대로 하셔도 되지만, 예를 들어 translate.py가 이해하기 쉽고 관리에 편리합니다.
  • 코드를 실행할 때 명령 프롬프트(터미널)에서 해당 폴더로 이동해
    python translate.py
    이렇게 명령을 내립니다.



(보너스) .gitignore 작성 예시


  • 코드 버전 관리를 할 땐 항상 .env 파일을 무시하세요!
.env
venv/
__pycache__/



3) 세팅 및 실행 요약

  1. 폴더 생성
    원하는 위치에 새 폴더 생성 (예: langchain-translator)
  2. 필수 파일 생성
    translate.py, .env, requirements.txt 생성 및 채우기
  3. 가상환경(선택)
    (권장)
    python -m venv venv
    source venv/bin/activate    # macOS/Linux
    .\venv\Scripts\activate     # Windows
  4. 패키지 설치
    pip install -r requirements.txt
  5. 코드 실행
    python translate.py
  6. 결과 확인



(옵션) 파일/폴더 정리 꿀팁

  • 추가적으로, 코드가 복잡해지면 다음처럼 코드와 환경 파일, 실행 파일을 별도로 관리해도 좋습니다:
    project/
    ├── src/
    │   └── translate.py
    ├── .env
    ├── requirements.txt
    └── README.md
  • 이때 실행은 src/translate.py로 경로만 신경 쓰면 됩니다.
  • .env 경로를 바꿀 경우, load_dotenv(dotenv_path='경로') 파라미터로 쉽게 지정할 수 있습니다.



2. OpenAI API 키 발급 및 설정


  1. OpenAI 홈페이지에서 API 키를 발급받아주세요.

  2. 프로젝트 폴더에 .env 파일 생성 후 다음 내용 입력

OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx



3. 애플리케이션 코드 구현


3-1. 라이브러리 임포트 및 환경 변수 불러오기


import os
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

# 환경 변수(.env)에서 API 키 불러오기
load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")



3-2. 번역 체인 생성 함수 정의


def create_translation_chain():
    # 1. 시스템 프롬프트(지시문) 템플릿 생성
    system_template = "다음 한국어 문장을 {language}로 번역하세요:"
    
    # 2. ChatPromptTemplate을 활용하여 프롬프트 구조화
    prompt_template = ChatPromptTemplate.from_messages([
        ('system', system_template),
        ('user', '{text}')
    ])
    
    # 3. LLM(OpenAI 챗모델) 초기화 (온도 값 조정 가능)
    model = ChatOpenAI(temperature=0.7)
    
    # 4. 출력 파서 정의 (문자열 반환)
    parser = StrOutputParser()
    
    # 5. LangChain 체인으로 연결 (프롬프트 → 모델 → 파서)
    translation_chain = prompt_template | model | parser
    return translation_chain



3-3. 사용자 입력 받고 번역 실행 코드 작성


def main():
    print("LangChain 번역 애플리케이션!")
    # 번역 체인 객체 생성
    translation_chain = create_translation_chain()
    
    # 사용자에게 번역할 문장·목표 언어 입력 받기
    text = input("번역할 한국어 문장을 입력하세요: ")
    language = input("어떤 언어로 번역할까요? (예: 영어, 일본어, 중국어 등) ")
    
    # 번역 실행 및 결과 출력
    try:
        result = translation_chain.invoke({"language": language, "text": text})
        print(f"\n번역 결과:\n{result}")
    except Exception as e:
        print("오류:", e)



3-4. 전체 코드 실행 구문


if __name__ == "__main__":
    main()



★ 전체 코드 한 번에 보기


import os
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")

def create_translation_chain():
    system_template = "다음 한국어 문장을 {language}로 번역하세요:"
    prompt_template = ChatPromptTemplate.from_messages([
        ('system', system_template),
        ('user', '{text}')
    ])
    model = ChatOpenAI(temperature=0.7)
    parser = StrOutputParser()
    return prompt_template | model | parser

def main():
    print("LangChain 번역 애플리케이션!")
    translation_chain = create_translation_chain()
    text = input("번역할 한국어 문장을 입력하세요: ")
    language = input("어떤 언어로 번역할까요? (예: 영어, 일본어, 중국어 등) ")
    try:
        result = translation_chain.invoke({"language": language, "text": text})
        print(f"\n번역 결과:\n{result}")
    except Exception as e:
        print("오류:", e)

if __name__ == "__main__":
    main()



4. 실제 실행 예시


실행


python translate.py



에러 발생 (SSL 인증서)


  • 코드 수정

import os
import httpx
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

# .env에서 API 키 불러오기
load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")

# https 인증 오류 우회용 httpx 클라이언트 생성 (SSL 비검증)
my_http_client = httpx.Client(verify=False)

def create_translation_chain():
    # 1. 시스템 프롬프트(지시문) 템플릿 생성
    system_template = "다음 한국어 문장을 {language}로 번역하세요: "

    # 2. ChatPromptTemplate을 활용하여 프롬프트 구조화
    prompt_template = ChatPromptTemplate.from_messages(
        [
            ('system', system_template),
            ('user', '{text}'),
        ]
    )

    # 3. LLM(OpenAI 챗 모델) 초기화 (온도 값 및 http_client 전달)
    model = ChatOpenAI(
        temperature=0.7,
        http_client=my_http_client
    )

    # 4. 출력 파서 설정 (문자열 반환)
    parser = StrOutputParser()

    translation_chain = prompt_template | model | parser
    return translation_chain

def main():
    print("LangChain 번역 애플리케이션!")
    # 번역 체인 객체 생성
    translation_chain = create_translation_chain()

    # 사용자에게 번역할 문장·목표 언어 입력 받기
    text = input("번역할 한국어 문장을 입력하세요: ")
    language = input("어떤 언어로 번역할까요? (예: 영어, 일본어, 중국어 등) ")

    # 번역 실행 및 결과 출력
    try:
        result = translation_chain.invoke({"language": language, "text": text})
        print(f"\n번역 결과:\n{result}")
    except Exception as e:
        print("오류:", e)

if __name__ == "__main__":
    main()



결과 예시


LangChain 번역 애플리케이션!
번역할 한국어 문장을 입력하세요: 안녕하세요, 오늘 기분이 어떠신가요?
어떤 언어로 번역할까요? (예: 영어, 일본어, 중국어 등) 영어

번역 결과:
Hello, how are you feeling today?



5. 상세 설명 및 확장 아이디어


컴포넌트 역할 요약


  • 프롬프트 템플릿: 명확한 작업 지시 및 입력 변수(언어, 번역할 문장) 정의

  • LLM: OpenAI의 GPT 모델을 활용해 자연스러운 번역 수행

  • 파서: LLM 답변을 사용자 출력을 위한 문자열로 변환



확장 예시


  • 여러 언어 동시에 번역 지원

  • 번역 결과 로그·캐싱

  • 프롬프트에 “공식/비공식” 등 스타일 지정 가능

  • Flask, Streamlit 등으로 웹 UI 구현

  • 언어 감지-자동 번역 기능 추가



6. 요약


LangChain을 활용하면 LLM(대형 언어 모델) 기능을 이용한 애플리케이션을 매우 빠르고 모듈화된 방식으로 개발할 수 있습니다.

  • “프롬프트 → 모델 → 파싱” 흐름을 자유롭게 구성

  • 다양한 추가 기능 쉽게 연동

  • 실제 서비스 레벨까지 손쉽게 진화 가능



🟦 LangChain / LangGraph / LangSmith 파트별 실전 예제 모음


1️⃣ [LangChain: 프롬프트 + 체인]

“입력값을 받아 맞춤형 답변 생성 (PromptTemplate + LLMChain)”

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

llm = OpenAI(api_key='YOUR_API_KEY_HERE')

prompt = PromptTemplate(
    input_variables=['dish'],
    template="한국식 {dish} 요리법을 친절하게 설명해줘."
)

chain = LLMChain(llm=llm, prompt=prompt)
answer = chain.run(dish="김치찌개")
print(answer)
  • 💡응용 팁: input_variables만 바꿔주면 다양한 정보를 자동 삽입



2️⃣ [LangChain: Agent + 외부툴 결합]


“LLM이 직접 계산하거나 실시간 정보 검색”

from langchain.agents import initialize_agent, load_tools
from langchain.llms import OpenAI

llm = OpenAI(api_key='YOUR_API_KEY_HERE')
tools = load_tools(["llm-math", "serpapi"], llm=llm)

agent = initialize_agent(
    tools, llm, agent="zero-shot-react-description", verbose=True
)
print(agent.run("광화문에서 오늘 날씨와 3 곱하기 12의 값 알려줘"))
  • 💡TIP: “Tool” 확장 가능 (DB, API 등 자유 조합)



3️⃣ [LangChain: 벡터스토어 기반 RAG Q&A]


“내 문서에서만 정확하게 답 뽑아내는 Q&A 챗봇”

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import TextLoader
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

# 1. 문서 임베딩 및 벡터DB 저장
loader = TextLoader('./my_guide.txt')
docs = loader.load()
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(docs, embeddings)

# 2. QA 체인 생성
qa = RetrievalQA.from_chain_type(
    llm=OpenAI(api_key='YOUR_API_KEY_HERE'),
    retriever=db.as_retriever()
)

# 3. 질문!
query = "이 가이드에서 '워크플로우'란 무엇인가요?"
print(qa.run(query))
  • 💡TIP: PDF, 웹, DB 등 어떤 텍스트 소스든 적용 OK



4️⃣ [LangGraph: 조건 분기 & 복잡한 Workflow]


“사용자 요청에 따라 처리 루트가 달라지는 그래프 흐름”

import langgraph
from langgraph.nodes import Node, InputNode, OutputNode

def greet_user(inputs):
    name = inputs['name']
    return {"greeting": f"안녕하세요, {name}님"}

def check_task(inputs):
    if inputs['task'] == "검색":
        return "search"
    else:
        return "default"

def do_search(inputs):
    # 실제 검색 코드는 생략
    return {"result": "검색 결과!"}

def default_action(inputs):
    return {"result": "일반 처리!"}

graph = langgraph.Graph()
graph.add_node(InputNode())
graph.add_node(Node("greet", greet_user))
graph.add_node(Node("branch", check_task, branch_targets={"search": "search_task", "default": "default"}))
graph.add_node(Node("search_task", do_search))
graph.add_node(Node("default", default_action))
graph.add_node(OutputNode())

graph.connect("input", "greet")
graph.connect("greet", "branch")
graph.connect("branch", ["search_task", "default"])
graph.connect(["search_task", "default"], "output")

inputs = {"name": "이순신", "task": "검색"}
result = graph.run("input", inputs)
print(result)
  • 💡TIP: 복잡한 챗봇, 에이전트 설계에 특히 강력 (조건·병렬·반복 등)



5️⃣ [LangSmith: 실시간 품질 분석/로그 모니터링 예시]


“LangChain/Agent 실행 과정 자동 추적 + 대시보드 보기”

from langchain.llms import OpenAI
from langsmith import traceable

llm = OpenAI(api_key='YOUR_API_KEY_HERE')

@traceable(name="custom_test_chain")
def my_chain(question):
    return llm(f"다음 질문에 답해줘: {question}")

# 실행하는 모든 chain이 LangSmith 대시보드에 자동 로깅됨!
result = my_chain("LangChain의 특징을 3가지로 정리해줘.")
print(result)
  • 💡TIP: 프롬프트 버전별 실험, 에러트래킹, 실행시간 분석 → 웹 대시보드 확인



🟧 실전 아이디어 및 확장 팁


  • 내 사내 데이터(메뉴얼, 매뉴얼, 문서 등) 업로드→ RAG형 상담봇 즉시 구현

  • 복잡한 챗봇: 조건~반복 구조 그래프( LangGraph ) 설계로 대화루트 자유롭게

  • 품질 개선: LangSmith로 출시 후 실제 대화 로그/에러 분석 → 서비스 고도화

  • 프롬프트 버전별 MVP 실험: 한 번에 여러 프롬프트 실험 후 LangSmith로 비교



profile
https://velog.io/@corone_hi/posts

0개의 댓글