聊天存储
聊天存储库作为存储聊天历史的集中式接口。与其他存储格式相比,聊天历史具有独特性,因为消息的顺序对于维持整体对话至关重要。
聊天存储可以通过键(如 user_ids 或其他唯一可识别字符串)来组织聊天消息序列,并处理 delete、insert 和 get 操作。
SimpleChatStore
Section titled “SimpleChatStore”最基本的聊天存储是 SimpleChatStore,它在内存中存储消息,可以保存到磁盘或从磁盘加载,也可以序列化并存储在其他地方。
通常,您会实例化一个聊天存储并将其提供给记忆模块。如果未提供,使用聊天存储的记忆模块将默认使用 SimpleChatStore。
from llama_index.core.storage.chat_store import SimpleChatStorefrom llama_index.core.memory import ChatMemoryBuffer
chat_store = SimpleChatStore()
chat_memory = ChatMemoryBuffer.from_defaults( token_limit=3000, chat_store=chat_store, chat_store_key="user1",)一旦创建了记忆,你可以将其包含在智能体或聊天引擎中:
agent = FunctionAgent(tools=tools, llm=llm)await agent.run("...", memory=memory)# ORchat_engine = index.as_chat_engine(memory=memory)要保存聊天记录供以后使用,您可以选择从磁盘保存/加载
chat_store.persist(persist_path="chat_store.json")loaded_chat_store = SimpleChatStore.from_persist_path( persist_path="chat_store.json")或者您可以在过程中将字符串转换或保存到其他地方
chat_store_string = chat_store.json()loaded_chat_store = SimpleChatStore.parse_raw(chat_store_string)UpstashChatStore
Section titled “UpstashChatStore”使用UpstashChatStore,您可以通过Upstash Redis远程存储聊天记录,该服务提供无服务器Redis解决方案,非常适合需要可扩展且高效聊天存储的应用程序。
此聊天存储支持同步和异步操作。
pip install llama-index-storage-chat-store-upstashfrom llama_index.storage.chat_store.upstash import UpstashChatStorefrom llama_index.core.memory import ChatMemoryBuffer
chat_store = UpstashChatStore( redis_url="YOUR_UPSTASH_REDIS_URL", redis_token="YOUR_UPSTASH_REDIS_TOKEN", ttl=300, # Optional: Time to live in seconds)
chat_memory = ChatMemoryBuffer.from_defaults( token_limit=3000, chat_store=chat_store, chat_store_key="user1",)UpstashChatStore 支持同步和异步操作。以下是使用异步方法的示例:
import asynciofrom llama_index.core.llms import ChatMessage
async def main(): # Add messages messages = [ ChatMessage(content="Hello", role="user"), ChatMessage(content="Hi there!", role="assistant"), ] await chat_store.async_set_messages("conversation1", messages)
# Retrieve messages retrieved_messages = await chat_store.async_get_messages("conversation1") print(retrieved_messages)
# Delete last message deleted_message = await chat_store.async_delete_last_message( "conversation1" ) print(f"Deleted message: {deleted_message}")
asyncio.run(main())RedisChatStore
Section titled “RedisChatStore”使用 RedisChatStore,您可以远程存储聊天记录,无需担心手动保存和加载聊天历史。
from llama_index.storage.chat_store.redis import RedisChatStorefrom llama_index.core.memory import ChatMemoryBuffer
chat_store = RedisChatStore(redis_url="redis://localhost:6379", ttl=300)
chat_memory = ChatMemoryBuffer.from_defaults( token_limit=3000, chat_store=chat_store, chat_store_key="user1",)AzureChatStore
Section titled “AzureChatStore”使用 AzureChatStore,您可以将聊天记录远程存储在 Azure 表存储或 CosmosDB 中,无需担心手动保存和加载聊天记录。
pip install llama-indexpip install llama-index-llms-azure-openaipip install llama-index-storage-chat-store-azurefrom llama_index.core.chat_engine import SimpleChatEnginefrom llama_index.core.memory import ChatMemoryBufferfrom llama_index.storage.chat_store.azure import AzureChatStore
chat_store = AzureChatStore.from_account_and_key( account_name="", account_key="", chat_table_name="ChatUser",)
memory = ChatMemoryBuffer.from_defaults( token_limit=3000, chat_store=chat_store, chat_store_key="conversation1",)
chat_engine = SimpleChatEngine( memory=memory, llm=Settings.llm, prefix_messages=[])
response = chat_engine.chat("Hello.")DynamoDBChatStore
Section titled “DynamoDBChatStore”使用 DynamoDBChatStore,您可以将聊天记录存储在 AWS DynamoDB 中。
pip install llama-index-storage-chat-store-dynamodb确保您已创建一个具有适当架构的 DynamoDB 表。默认情况下,示例如下:
import boto3
# Get the service resource.dynamodb = boto3.resource("dynamodb")
# Create the DynamoDB table.table = dynamodb.create_table( TableName="EXAMPLE_TABLE", KeySchema=[{"AttributeName": "SessionId", "KeyType": "HASH"}], AttributeDefinitions=[ {"AttributeName": "SessionId", "AttributeType": "S"} ], BillingMode="PAY_PER_REQUEST",)然后您可以使用 DynamoDBChatStore 类来持久化存储和检索聊天记录:
import osfrom llama_index.core.llms import ChatMessage, MessageRolefrom llama_index.storage.chat_store.dynamodb.base import DynamoDBChatStore
# Initialize DynamoDB chat storechat_store = DynamoDBChatStore( table_name="EXAMPLE_TABLE", profile_name=os.getenv("AWS_PROFILE"))
# A chat history, which doesn't exist yet, returns an empty array.print(chat_store.get_messages("123"))# >>> []
# Initializing a chat history with a key of "SessionID = 123"messages = [ ChatMessage(role=MessageRole.USER, content="Who are you?"), ChatMessage( role=MessageRole.ASSISTANT, content="I am your helpful AI assistant." ),]chat_store.set_messages(key="123", messages=messages)print(chat_store.get_messages("123"))# >>> [ChatMessage(role=<MessageRole.USER: 'user'>, content='Who are you?', additional_kwargs={}),# ChatMessage(role=<MessageRole.ASSISTANT: 'assistant'>, content='I am your helpful AI assistant.', additional_kwargs={})]]
# Appending a message to an existing chat historymessage = ChatMessage(role=MessageRole.USER, content="What can you do?")chat_store.add_message(key="123", message=message)print(chat_store.get_messages("123"))# >>> [ChatMessage(role=<MessageRole.USER: 'user'>, content='Who are you?', additional_kwargs={}),# ChatMessage(role=<MessageRole.ASSISTANT: 'assistant'>, content='I am your helpful AI assistant.', additional_kwargs={})],# ChatMessage(role=<MessageRole.USER: 'user'>, content='What can you do?', additional_kwargs={})]PostgresChatStore
Section titled “PostgresChatStore”使用 PostgresChatStore,您可以远程存储聊天记录,无需担心手动保存和加载聊天历史。
from llama_index.storage.chat_store.postgres import PostgresChatStorefrom llama_index.core.memory import ChatMemoryBuffer
chat_store = PostgresChatStore.from_uri( uri="postgresql+asyncpg://postgres:password@127.0.0.1:5432/database",)
chat_memory = ChatMemoryBuffer.from_defaults( token_limit=3000, chat_store=chat_store, chat_store_key="user1",)TablestoreChatStore
Section titled “TablestoreChatStore”使用 TablestoreChatStore,您可以将聊天记录远程存储,无需担心手动保存和加载聊天记录。
pip install llama-index-storage-chat-store-tablestorefrom llama_index.storage.chat_store.tablestore import TablestoreChatStorefrom llama_index.core.memory import ChatMemoryBuffer
# 1. create tablestore vector storechat_store = TablestoreChatStore( endpoint="<end_point>", instance_name="<instance_name>", access_key_id="<access_key_id>", access_key_secret="<access_key_secret>",)# You need to create a table for the first usechat_store.create_table_if_not_exist()
chat_memory = ChatMemoryBuffer.from_defaults( token_limit=3000, chat_store=chat_store, chat_store_key="user1",)Google AlloyDB 聊天存储
Section titled “Google AlloyDB ChatStore”使用 AlloyDBChatStore,您可以将聊天记录存储在AlloyDB中,无需担心手动保存和加载聊天记录。
本教程演示同步接口。所有同步方法都有对应的异步方法。
pip install llama-indexpip install llama-index-alloydb-pgpip install llama-index-llms-vertexfrom llama_index.core.chat_engine import SimpleChatEnginefrom llama_index.core.memory import ChatMemoryBufferfrom llama_index_alloydb_pg import AlloyDBChatStore, AlloyDBEnginefrom llama_index.llms.vertex import Verteximport asyncio
# Replace with your own AlloyDB infoengine = AlloyDBEngine.from_instance( project_id=PROJECT_ID, region=REGION, cluster=CLUSTER, instance=INSTANCE, database=DATABASE, user=USER, password=PASSWORD,)
engine.init_chat_store_table(table_name=TABLE_NAME)
chat_store = AlloyDBChatStore.create_sync( engine=engine, table_name=TABLE_NAME,)
memory = ChatMemoryBuffer.from_defaults( token_limit=3000, chat_store=chat_store, chat_store_key="user1",)
llm = Vertex(model="gemini-1.5-flash-002", project=PROJECT_ID)
chat_engine = SimpleChatEngine(memory=memory, llm=llm, prefix_messages=[])
response = chat_engine.chat("Hello.")
print(response)Google Cloud SQL for PostgreSQL 聊天存储
Section titled “Google Cloud SQL for PostgreSQL ChatStore”使用 PostgresChatStore,您可以将聊天记录存储在 Cloud SQL for Postgres 中,无需担心手动保存和加载聊天记录。
本教程演示同步接口。所有同步方法都有对应的异步方法。
pip install llama-indexpip install llama-index-cloud-sql-pgpip install llama-index-llms-vertexfrom llama_index.core.chat_engine import SimpleChatEnginefrom llama_index.core.memory import ChatMemoryBufferfrom llama_index_cloud_sql_pg import PostgresChatStore, PostgresEnginefrom llama_index.llms.vertex import Verteximport asyncio
# Replace with your own Cloud SQL infoengine = PostgresEngine.from_instance( project_id=PROJECT_ID, region=REGION, instance=INSTANCE, database=DATABASE, user=USER, password=PASSWORD,)
engine.init_chat_store_table(table_name=TABLE_NAME)
chat_store = PostgresChatStore.create_sync( engine=engine, table_name=TABLE_NAME,)
memory = ChatMemoryBuffer.from_defaults( token_limit=3000, chat_store=chat_store, chat_store_key="user1",)
llm = Vertex(model="gemini-1.5-flash-002", project=PROJECT_ID)
chat_engine = SimpleChatEngine(memory=memory, llm=llm, prefix_messages=[])
response = chat_engine.chat("Hello.")
print(response)YugabyteDBChatStore
Section titled “YugabyteDBChatStore”使用 YugabyteDBChatStore,您可以远程存储聊天记录,无需担心手动保存和加载聊天历史。
在使用此集成之前,您需要运行一个YugabyteDB实例。您可以通过遵循YugaByteDB快速入门指南来设置本地YugabyteDB实例。
pip install llama-index-storage-chat-store-yugabytedbfrom llama_index.storage.chat_store.yugabytedb import YugabyteDBChatStorefrom llama_index.core.memory import ChatMemoryBuffer
chat_store = YugabyteDBChatStore.from_uri( uri="yugabytedb+psycopg2://yugabyte:password@127.0.0.1:5433/yugabyte?load_balance=true",)
chat_memory = ChatMemoryBuffer.from_defaults( token_limit=3000, chat_store=chat_store, chat_store_key="user1",)传递给 YugabyteDBChatStore.from_uri() 的连接字符串支持多种参数,可用于配置与您的 YugabyteDB 集群的连接。
您可以在 YugabyteDB psycopg2 驱动程序文档 中找到支持的参数完整列表。
YugabyteDB 特定参数包括:
load_balance: 启用/禁用负载均衡(默认值:false)topology_keys: 指定用于连接路由的首选节点yb_servers_refresh_interval: 刷新可用服务器列表的时间间隔(以秒为单位)fallback_to_topology_keys_only: 是否仅连接到拓扑键中指定的节点failed_host_ttl_seconds: 在尝试连接失败节点前等待的时间(以秒为单位)