Redis Chat Message History
Redis (Remote Dictionary Server) 是一個開放原始碼的記憶體內儲存系統,用作分散式、記憶體內鍵值資料庫、快取和訊息代理程式,並具有可選的持久性。
Redis
提供低延遲的讀取和寫入。Redis 是最受歡迎的 NoSQL 資料庫,也是整體最受歡迎的資料庫之一。
本筆記本示範如何使用 langchain-redis 套件中的 RedisChatMessageHistory
類別,以使用 Redis 儲存和管理聊天訊息歷史記錄。
設定
首先,我們需要安裝必要的依賴項,並確保我們有一個 Redis 實例正在執行。
%pip install -qU langchain-redis langchain-openai redis
請確保您有一個 Redis 伺服器正在執行。您可以使用 Docker 和以下命令啟動一個
docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest
或根據您作業系統的指示,在本機安裝並執行 Redis。
import os
# Use the environment variable if set, otherwise default to localhost
REDIS_URL = os.getenv("REDIS_URL", "redis://127.0.0.1:6379")
print(f"Connecting to Redis at: {REDIS_URL}")
Connecting to Redis at: redis://redis:6379
匯入必要的程式庫
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.messages import AIMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain_redis import RedisChatMessageHistory
API 參考:BaseChatMessageHistory | AIMessage | HumanMessage | ChatPromptTemplate | MessagesPlaceholder | RunnableWithMessageHistory | ChatOpenAI | RedisChatMessageHistory
RedisChatMessageHistory 的基本用法
# Initialize RedisChatMessageHistory
history = RedisChatMessageHistory(session_id="user_123", redis_url=REDIS_URL)
# Add messages to the history
history.add_user_message("Hello, AI assistant!")
history.add_ai_message("Hello! How can I assist you today?")
# Retrieve messages
print("Chat History:")
for message in history.messages:
print(f"{type(message).__name__}: {message.content}")
Chat History:
HumanMessage: Hello, AI assistant!
AIMessage: Hello! How can I assist you today?
將 RedisChatMessageHistory 與語言模型搭配使用
設定 OpenAI API 金鑰
from getpass import getpass
# Check if OPENAI_API_KEY is already set in the environment
openai_api_key = os.getenv("OPENAI_API_KEY")
if not openai_api_key:
print("OpenAI API key not found in environment variables.")
openai_api_key = getpass("Please enter your OpenAI API key: ")
# Set the API key for the current session
os.environ["OPENAI_API_KEY"] = openai_api_key
print("OpenAI API key has been set for this session.")
else:
print("OpenAI API key found in environment variables.")
OpenAI API key not found in environment variables.
``````output
Please enter your OpenAI API key: ········
``````output
OpenAI API key has been set for this session.
# Create a prompt template
prompt = ChatPromptTemplate.from_messages(
[
("system", "You are a helpful AI assistant."),
MessagesPlaceholder(variable_name="history"),
("human", "{input}"),
]
)
# Initialize the language model
llm = ChatOpenAI()
# Create the conversational chain
chain = prompt | llm
# Function to get or create a RedisChatMessageHistory instance
def get_redis_history(session_id: str) -> BaseChatMessageHistory:
return RedisChatMessageHistory(session_id, redis_url=REDIS_URL)
# Create a runnable with message history
chain_with_history = RunnableWithMessageHistory(
chain, get_redis_history, input_messages_key="input", history_messages_key="history"
)
# Use the chain in a conversation
response1 = chain_with_history.invoke(
{"input": "Hi, my name is Alice."},
config={"configurable": {"session_id": "alice_123"}},
)
print("AI Response 1:", response1.content)
response2 = chain_with_history.invoke(
{"input": "What's my name?"}, config={"configurable": {"session_id": "alice_123"}}
)
print("AI Response 2:", response2.content)
AI Response 1: Hello Alice! How can I assist you today?
AI Response 2: Your name is Alice.
進階功能
自訂 Redis 設定
# Initialize with custom Redis configuration
custom_history = RedisChatMessageHistory(
"user_456",
redis_url=REDIS_URL,
key_prefix="custom_prefix:",
ttl=3600, # Set TTL to 1 hour
index_name="custom_index",
)
custom_history.add_user_message("This is a message with custom configuration.")
print("Custom History:", custom_history.messages)
Custom History: [HumanMessage(content='This is a message with custom configuration.')]
搜尋訊息
# Add more messages
history.add_user_message("Tell me about artificial intelligence.")
history.add_ai_message(
"Artificial Intelligence (AI) is a branch of computer science..."
)
# Search for messages containing a specific term
search_results = history.search_messages("artificial intelligence")
print("Search Results:")
for result in search_results:
print(f"{result['type']}: {result['content'][:50]}...")
Search Results:
human: Tell me about artificial intelligence....
ai: Artificial Intelligence (AI) is a branch of comput...
清除歷史記錄
# Clear the chat history
history.clear()
print("Messages after clearing:", history.messages)
Messages after clearing: []
結論
本筆記本示範了 langchain-redis 套件中 RedisChatMessageHistory
的主要功能。它展示了如何初始化和使用聊天歷史記錄、將其與語言模型整合,以及利用進階功能,例如自訂設定和訊息搜尋。Redis 為管理 AI 應用程式中的聊天歷史記錄提供了快速且可擴充的解決方案。