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

calico·2025년 7월 8일

Artificial Intelligence

목록 보기
48/143

수정본: 최신 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
https://velog.io/@corone_hi/posts

0개의 댓글