코드는 여기에서 찾을 수 있습니다: GitHub - jamesbmour/blog_tutorials:
계속 진화하는 대화형 AI 및 언어 모델의 세계에서 컨텍스트를 유지하고 정보 흐름을 효율적으로 관리하는 것은 지능형 애플리케이션 구축의 중요한 구성 요소입니다. LLM(대형 언어 모델) 작업을 위해 설계된 강력한 프레임워크인 LangChain은 메모리 관리 및 데이터 지속성을 위한 강력한 도구를 제공하여 상황 인식 시스템 생성을 가능하게 합니다.
이 가이드에서는 더 스마트하고 반응성이 뛰어난 애플리케이션을 구축하기 위해 LangChain에서 메모리와 스토리지를 활용하는 방법에 대해 자세히 살펴보겠습니다.
LangChain의 메모리 관리를 통해 애플리케이션은 컨텍스트를 유지하여 상호 작용을 더욱 일관성 있고 상황에 맞게 적절하게 만들 수 있습니다. 다양한 메모리 유형과 사용 사례를 살펴보겠습니다.
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({}))
적절한 메모리 유형 선택은 여러 요인에 따라 달라집니다.
사용 사례:
메모리는 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를 사용하여 이전 상호 작용을 기억하여 보다 자연스러운 대화를 가능하게 하는 방법을 보여줍니다.
영구 저장을 통해 세션 전반에 걸쳐 대화 기록과 컨텍스트가 유지되므로 상호 작용의 연속성이 보장됩니다.
기본 지속성을 위해 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)
이 방법을 사용하면 사람이 읽을 수 있는 간단한 형식으로 대화 기록을 유지할 수 있습니다.
보다 확장 가능하고 효율적인 스토리지를 위해 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({}))
애플리케이션의 응답성을 유지하려면 다음 최적화 전략을 고려하세요.
다음은 기본 캐싱을 사용하는 메모리 클래스의 예입니다.
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
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3