사용자의 최근 번역 기록(질문/답변 쌍)을 저장해, 다음 번역에 참고하게 함
사전에 등록한 “전문 용어/고유명사” 자료를 벡터DB(Chroma)에 저장
번역 전에 입력 문장과 유사한 전문 용어를 검색해서, 번역 프롬프트에 포함
langchain-translator/
├── .env
├── translate.py
├── requirements.txt
└── glossary.txt # (추가) 도메인 용어집 (원하는 텍스트로)
예시, 실제로는 회사 용어, 제품명 등 자유롭게 작성
휴머노이드 : 인간을 닮은 로봇
클라우드 : 인터넷 기반 컴퓨팅 환경
챗봇 : 사용자와 대화하는 인공지능 프로그램
기본 번역 + 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: 대화 내역(사용자 질문, 번역 결과)을 기억해 “방금 그 단어”, “이전 내용 다시 번역해” 등에 더 잘 대응
langchain_core
langchain_openai
langchain
python-dotenv
chromadb
tiktoken
용어집 자동 업데이트 (파일 말고 DB/Google Sheet 등에서 동기화)
웹 UI로 변환 (Streamlit, FastAPI 등)
Memory 대신 Summary Memory, Entity Memory 등 적용 가능