LangChain: memory를 직접 장착할 수 없음

calico·2025년 7월 8일

Artificial Intelligence

목록 보기
48/177

수정본: 최신 LangChain 구조 & 오류 없는 버전

최신 LangChain 파이프라인(LCEL) 구조인데, 여기에선 chain.memory = memory 코드가 오류를 만듭니다. (memory를 직접 장착할 수 없음)

  • 즉, 아래와 같이 메모리는 직접 연결하지 말고(이 줄을 제거!),
    필요하다면 대화 내역을 직접 context로 넘기거나, 혹은 LLMChain 등 클래식 체인으로 구조를 변경해야 합니다.
  • 여기선 기존 파이프라인 구조(LangChain 0.1+ 기준)를 유지하며, memory 부분을 빼고, 코드 주석만 조금 더 보강
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에 넣는 식으로 확장하면 됩니다.



"진짜 대화 Memory"를 꼭 쓰고 싶으면?


  • “최신 LangChain 체인” 대신 langchain.chains.LLMChain 혹은 langchain.chains.ConversationChain에서 memory 인자를 활용하는 구조로 바꿔야 합니다.



profile
All views expressed here are solely my own and do not represent those of any affiliated organization.

0개의 댓글