최신 LangChain 파이프라인(LCEL) 구조인데, 여기에선
chain.memory = memory코드가 오류를 만듭니다. (memory를 직접 장착할 수 없음)
- 즉, 아래와 같이 메모리는 직접 연결하지 말고(이 줄을 제거!),
필요하다면 대화 내역을 직접 context로 넘기거나, 혹은 LLMChain 등 클래식 체인으로 구조를 변경해야 합니다.
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.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
import httpx
# (1) 환경 변수 로딩
load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
# (2) 용어집(txt) → 벡터DB 구축 함수
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()
# chroma DB: 메모리에만 저장(세션별), 필요시 persist_directory 지정
vector_db = Chroma.from_texts(glossaries, embedding, metadatas=metadatas)
return vector_db
# (3) 번역체인 생성 (용어 컨텍스트 활용)
def create_translation_chain(vector_db):
# 프롬프트 세팅
prompt_template = ChatPromptTemplate.from_messages([
('system', """너는 전문 번역가야. 주어진 한국어 문장을 자연스럽게 {language}로 번역해.
아래 '참고 용어'가 있으면 반드시 정확하게 반영해.
참고 용어: {glossary_context}
"""),
('user', '{text}'),
])
# LLM 연결(온도 0.3: 일관적 번역)
model = ChatOpenAI(temperature=0.3)
parser = StrOutputParser()
chain = prompt_template | model | parser
return chain
def main():
print("== LangChain 번역기(Memory+VectorDB) ==")
# (1) (옵션) 대화 기록 관리: LCEL 파이프라인에서는 memory 불가
# memory = ConversationBufferMemory() # <- 안 씀!
# (2) 용어집 벡터DB 준비
vector_db = build_glossary_vector_db("glossary.txt")
# (3) 번역체인 준비
translation_chain = create_translation_chain(vector_db)
while True:
text = input("\n번역할 한국어 문장을 입력하세요 (종료:'exit'): ")
if text.lower().strip() == "exit":
break
language = input("어떤 언어로 번역할까요? (예: 영어, 일본어, 중국어 등): ")
# (4) 입력 문장에서 용어집 연관 검색(3개)
similar_docs = vector_db.similarity_search(text, k=3)
glossary_context = "\n".join([doc.page_content for doc in similar_docs]) if similar_docs else "없음"
# (5) 번역 실행
try:
result = translation_chain.invoke({
"language": language,
"text": text,
"glossary_context": glossary_context
})
print(f"\n번역 결과:\n{result}")
except Exception as e:
print("오류:", e)
# troubleshooting: .env, API KEY, ChromaDB 등 체크
if __name__ == "__main__":
main()
memory = ConversationBufferMemory() → 사용해도 되긴 하지만, chain에 직접 붙이지 않게 코드 변경
chain.memory = memory → 해당 줄 삭제
전체 구조 유지(용어집, Chroma, 최신 LangChain 파이프 구성)
대화 context 확장이 필요하면 직접 로그 관리해서 context에 넣는 식으로 확장하면 됩니다.
langchain.chains.LLMChain 혹은 langchain.chains.ConversationChain에서 memory 인자를 활용하는 구조로 바꿔야 합니다.