LangChain: 번역 LLM 애플리케이션 업그레이드 (Vector DB + Memory)

calico·2025년 7월 4일

Artificial Intelligence

목록 보기
47/143

1. Memory


  • 사용자의 최근 번역 기록(질문/답변 쌍)을 저장해, 다음 번역에 참고하게 함

    • 예: 사용자가 "그걸 영어로 다시 써줘" 등 맥락을 포함하는 요청 시 자연스럽게 처리



2. Vector DB


  • 사전에 등록한 “전문 용어/고유명사” 자료를 벡터DB(Chroma)에 저장

  • 번역 전에 입력 문장과 유사한 전문 용어를 검색해서, 번역 프롬프트에 포함

    • 예: "휴머노이드", "클라우드" 등의 고유 용어가 사용자 입력에 있을 때 자동 참고



파일 구조 (예시)


langchain-translator/
├── .env
├── translate.py
├── requirements.txt
└── glossary.txt  # (추가) 도메인 용어집 (원하는 텍스트로)



glossary.txt (용어집 예시)


예시, 실제로는 회사 용어, 제품명 등 자유롭게 작성

휴머노이드 : 인간을 닮은 로봇
클라우드 : 인터넷 기반 컴퓨팅 환경
챗봇 : 사용자와 대화하는 인공지능 프로그램



🐍 translate.py


  • 기본 번역 + Memory(대화기록) + Vector DB(용어집; Chroma)

  • 모든 주요 처리과정 주석 포함

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
from langchain.memory import ConversationBufferMemory
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma

# 1. 환경 설정
load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")

# 2. 용어 집합 벡터DB로 구축 (처음 1회만)
def build_glossary_vector_db(filepath="glossary.txt"):
    with open(filepath, "r", encoding="utf-8") as f:
        lines = f.readlines()
    glossaries = []
    metadatas = []

    for line in lines:
        if ":" in line:
            term, explanation = line.strip().split(":", 1)
            glossaries.append(f"{term.strip()}: {explanation.strip()}")
            metadatas.append({"term": term.strip()})

    embedding = OpenAIEmbeddings()
    vector_db = Chroma.from_texts(glossaries, embedding, metadatas=metadatas)
    return vector_db

# 3. 번역 체인 + Memory + 용어집 Context 적용
def create_translation_chain(vector_db, memory=None):
    # 기본 프롬프트
    prompt_template = ChatPromptTemplate.from_messages([
        ('system', """너는 전문 번역가야. 주어진 한국어 문장을 자연스럽게 {language}로 번역해.
아래 '참고 용어'가 있으면 반드시 올바르게 활용해.
참고 용어: {glossary_context}
"""),
        ('user', '{text}'),
    ])
    model = ChatOpenAI(temperature=0.3)
    parser = StrOutputParser()
    # memory가 있으면 chain에 메모리 포함
    chain = prompt_template | model | parser
    if memory:
        chain.memory = memory
    return chain

def main():
    print("LangChain 번역기 (Memory+VectorDB 업그레이드 버전)")
    # == ① 메모리 세팅 (대화 기록 보관) ==
    memory = ConversationBufferMemory()
    # == ② 용어집 Vector DB 생성 ==
    vector_db = build_glossary_vector_db("glossary.txt")
    # == ③ 번역 체인 생성 ==
    translation_chain = create_translation_chain(vector_db, memory=memory)

    while True:
        text = input("\n번역할 한국어 문장을 입력하세요 (종료하려면 'exit'): ")
        if text.lower().strip() == "exit":
            break
        language = input("어떤 언어로 번역할까요? (예: 영어, 일본어, 중국어 등) ")

        # === ④ 입력에서 전문용어(컨텍스트) 검색 ===
        similar_docs = vector_db.similarity_search(text, k=3)
        context = "\n".join([doc.page_content for doc in similar_docs])

        # === ⑤ 번역 + 메모리(이전 대화)로 수행 ===
        try:
            result = translation_chain.invoke({
                "language": language,
                "text": text,
                "glossary_context": context,
                # 메모리는 chain.memory로 따로 관리됨
            })
            print(f"\n번역 결과:\n{result}")
        except Exception as e:
            print("오류:", e)

if __name__ == "__main__":
    main()



주요 포인트


  • Vector DB: 입력 문장과 관련된 용어집 컨텍스트를 자동으로 꺼내서, 더 자연스러운 번역 및 전문 용어 정확도↑

  • Memory: 대화 내역(사용자 질문, 번역 결과)을 기억해 “방금 그 단어”, “이전 내용 다시 번역해” 등에 더 잘 대응



requirements.txt


langchain_core
langchain_openai
langchain
python-dotenv
chromadb
tiktoken



확장 아이디어


  • 용어집 자동 업데이트 (파일 말고 DB/Google Sheet 등에서 동기화)

  • 웹 UI로 변환 (Streamlit, FastAPI 등)

  • Memory 대신 Summary Memory, Entity Memory 등 적용 가능



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

0개의 댓글