"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > LangChain에서 메모리와 저장소를 활용하는 LangChain 부분: 종합 가이드

LangChain에서 메모리와 저장소를 활용하는 LangChain 부분: 종합 가이드

2024-08-25에 게시됨
검색:112

LangChain Part  Leveraging Memory and Storage in LangChain: A Comprehensive Guide

LangChain 4부 - LangChain의 메모리 및 스토리지 활용: 종합 가이드

코드는 여기에서 찾을 수 있습니다: GitHub - jamesbmour/blog_tutorials:

계속 진화하는 대화형 AI 및 언어 모델의 세계에서 컨텍스트를 유지하고 정보 흐름을 효율적으로 관리하는 것은 지능형 애플리케이션 구축의 중요한 구성 요소입니다. LLM(대형 언어 모델) 작업을 위해 설계된 강력한 프레임워크인 LangChain은 메모리 관리 및 데이터 지속성을 위한 강력한 도구를 제공하여 상황 인식 시스템 생성을 가능하게 합니다.

이 가이드에서는 더 스마트하고 반응성이 뛰어난 애플리케이션을 구축하기 위해 LangChain에서 메모리와 스토리지를 활용하는 방법에 대해 자세히 살펴보겠습니다.

1. LangChain에서 메모리 작업

LangChain의 메모리 관리를 통해 애플리케이션은 컨텍스트를 유지하여 상호 작용을 더욱 일관성 있고 상황에 맞게 적절하게 만들 수 있습니다. 다양한 메모리 유형과 사용 사례를 살펴보겠습니다.

1.1. 기억의 종류

LangChain은 다양한 시나리오를 해결하기 위해 다양한 메모리 유형을 제공합니다. 여기서는 두 가지 주요 유형에 중점을 둘 것입니다:

대화버퍼메모리

이 메모리 유형은 대화에서 최근 상호 작용을 캡처하고 회상하는 단기 컨텍스트 유지에 이상적입니다.

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory()
memory.save_context({"input": "Hi, I'm Alice"}, {"output": "Hello Alice, how can I help you today?"})
memory.save_context({"input": "What's the weather like?"}, {"output": "I'm sorry, I don't have real-time weather information. Is there anything else I can help you with?"})

print(memory.load_memory_variables({}))

대화 요약 메모리

더 긴 대화에는 ConversationSummaryMemory가 탁월한 선택입니다. 지나치게 자세한 내용 없이 맥락을 유지하면서 핵심 사항을 요약합니다.

from langchain.memory import ConversationSummaryMemory
from langchain.llms import Ollama 

llm = Ollama(model='phi3',temperature=0)
memory = ConversationSummaryMemory(llm=llm)
memory.save_context({"input": "Hi, I'm Alice"}, {"output": "Hello Alice, how can I help you today?"})
memory.save_context({"input": "I'm looking for a good Italian restaurant"}, {"output": "Great! I'd be happy to help you find a good Italian restaurant. Do you have any specific preferences or requirements, such as location, price range, or specific dishes you're interested in?"})

print(memory.load_memory_variables({}))

1.2. 사용 사례에 적합한 메모리 유형 선택

적절한 메모리 유형 선택은 여러 요인에 따라 달라집니다.

  • 기간 및 복잡성: 짧은 세션에서는 ConversationBufferMemory를 통한 자세한 컨텍스트 보존의 이점을 누리는 반면, 장기적인 상호 작용에는 ConversationSummaryMemory를 통한 요약이 필요할 수 있습니다.
  • 세부 사항과 개요: 자세한 상호 작용 기록이나 상위 수준 요약이 애플리케이션에 더 가치 있는지 결정합니다.
  • 성능: 메모리 크기와 검색 속도 간의 균형을 고려하세요.

사용 사례:

  • ConversationBufferMemory: 빠른 고객 지원 또는 FAQ 스타일 상호 작용에 적합합니다.
  • ConversationSummaryMemory: 프로젝트 관리 또는 지속적인 고객 상호 작용과 같은 장기적인 참여에 가장 적합합니다.

1.3. 체인과 에이전트에 메모리 통합

메모리는 LangChain 체인 및 에이전트에 원활하게 통합되어 대화 기능을 향상시킬 수 있습니다.

from langchain.chains import ConversationChain  
from langchain.memory import ConversationBufferMemory
# llm = OpenAI(temperature=0)
memory = ConversationBufferMemory()
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

conversation.predict(input="Hi, I'm Alice")
conversation.predict(input="What's my name?")

이 예에서는 ConversationBufferMemory를 사용하여 이전 상호 작용을 기억하여 보다 자연스러운 대화를 가능하게 하는 방법을 보여줍니다.

2. 데이터 유지 및 검색

영구 저장을 통해 세션 전반에 걸쳐 대화 기록과 컨텍스트가 유지되므로 상호 작용의 연속성이 보장됩니다.

2.1. 대화 기록 및 상태 저장

기본 지속성을 위해 JSON과 함께 파일 기반 저장소를 사용할 수 있습니다.

import json

class PersistentMemory:
    def __init__(self, file_path):
        self.file_path = file_path
        self.load_memory()

    def load_memory(self):
        try:
            with open(self.file_path, 'r') as f:
                self.chat_memory = json.load(f)
        except FileNotFoundError:
            self.chat_memory = {'messages': []}

    def save_memory(self):
        with open(self.file_path, 'w') as f:
            json.dump({'messages': self.chat_memory['messages']}, f)

# Usage
memory = PersistentMemory(file_path='conversation_history.json')
print(memory.chat_memory)

이 방법을 사용하면 사람이 읽을 수 있는 간단한 형식으로 대화 기록을 유지할 수 있습니다.

2.2. 데이터베이스 및 스토리지 시스템과 통합

보다 확장 가능하고 효율적인 스토리지를 위해 SQLite와 같은 데이터베이스와의 통합이 권장됩니다.

import sqlite3

class SQLiteMemory:
    def __init__(self, db_path):
        self.db_path = db_path
        self.conn = sqlite3.connect(db_path)
        self.create_table()

    def create_table(self):
        cursor = self.conn.cursor()
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS conversations
            (id INTEGER PRIMARY KEY, input TEXT, output TEXT)
        ''')
        self.conn.commit()

    def save_context(self, inputs, outputs):
        cursor = self.conn.cursor()
        cursor.execute('INSERT INTO conversations (input, output) VALUES (?, ?)',
                       (inputs['input'], outputs['output']))
        self.conn.commit()

    def load_memory_variables(self, inputs):
        cursor = self.conn.cursor()
        cursor.execute('SELECT input, output FROM conversations ORDER BY id DESC LIMIT 10')
        rows = cursor.fetchall()
        history = "\\n".join([f"Human: {row[0]}\\nAI: {row[1]}" for row in reversed(rows)])
        return {"history": history }

# Usage
memory = SQLiteMemory('conversation_history.db')

print(memory.load_memory_variables({}))

3 메모리 사용량 및 성능 최적화

애플리케이션의 응답성을 유지하려면 다음 최적화 전략을 고려하세요.

  • 효율적인 데이터 구조: 고정 크기 버퍼를 관리하려면 deque와 같은 구조를 사용하세요.
  • 캐싱 전략: 자주 액세스하는 데이터에 대한 캐싱을 구현하여 데이터베이스 쿼리를 줄입니다.
  • 데이터 정리: 오래된 데이터를 정기적으로 정리하거나 요약하여 관리 가능한 메모리 크기를 유지합니다.

다음은 기본 캐싱을 ​​사용하는 메모리 클래스의 예입니다.

import time

class CachedSQLiteMemory(SQLiteMemory):
    def __init__(self, db_path, cache_ttl=60):
        super().__init__(db_path)
        self.cache = None
        self.cache_time = 0
        self.cache_ttl = cache_ttl

    def load_memory_variables(self, inputs):
        current_time = time.time()
        if self.cache is None or (current_time - self.cache_time) > self.cache_ttl:
            var = self.cache
            self.cache = super().load_memory_variables(inputs)
            self.cache_time = current_time
            return self.cache

memory = CachedSQLiteMemory('conversation_history.db', cache_ttl=30)

이 구현은 지정된 시간 동안 데이터베이스 쿼리 결과를 캐시하여 데이터베이스의 로드를 줄이고 메모리 데이터에 자주 액세스하는 애플리케이션의 성능을 향상시킵니다.

결론

효과적인 메모리 관리는 지능형 상황 인식 대화형 AI 애플리케이션 구축의 초석입니다. LangChain은 메모리 관리를 위한 유연하고 강력한 프레임워크를 제공하여 개발자가 메모리 유형을 특정 사용 사례에 맞게 조정하고 영구 스토리지 솔루션을 구현하며 대규모 애플리케이션의 성능을 최적화할 수 있도록 합니다.

올바른 메모리 유형을 선택하고, 영구 스토리지를 통합하고, 사용자 정의 메모리 클래스 및 캐싱 전략과 같은 고급 기술을 활용함으로써 규모와 복잡성이 아무리 커져도 컨텍스트를 유지하고 사용자 경험을 개선하며 효율적으로 작동하는 정교한 AI 시스템을 구축할 수 있습니다. 상호작용이 증가합니다.

이러한 도구와 기술을 마음대로 사용하면 응답성이 뛰어나고 지능적이며 상황에 맞는 AI 애플리케이션을 만드는 데 LangChain의 잠재력을 최대한 활용할 수 있습니다. 고객 지원 봇, 가상 비서 또는 복잡한 대화 시스템을 개발하든 LangChain의 메모리와 스토리지를 마스터하는 것이 성공의 핵심 요소가 될 것입니다.

내 글을 후원하고 싶거나 맥주를 사주고 싶다면:
https://buymeacoffee.com/bmours

릴리스 선언문 이 기사는 https://dev.to/jamesbmour/langchain-part-4-leveraging-memory-and-storage-in-langchain-a-comprehensive-guide-h4m?1에서 복제됩니다. 침해가 있는 경우, 문의 Study_golang@163 .comdelete
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3