Redis

Redis 支持跨 SDK 的不同上下文模式。 在.NET中,将 Redis 支持的搜索连接到 RAG 的泛型TextSearchProvider。 Agent Framework Redis 包为Python提供可搜索的内存和聊天历史记录提供程序。

Pattern API SDK Behavior
RAG TextSearchProvider 使用 Redis 搜索适配器 .NET 在调用之前或通过按需搜索工具检索相关的 Redis 内容。
可搜索内存 RedisContextProvider Python 提取对话详细信息,并使用全文或混合矢量搜索检索相关上下文。
对话历史 RedisHistoryProvider Python 持久保存并重新加载会话的确切消息脚本。

添加 RAG TextSearchProvider

将提供程序无关TextSearchProvider的模式用于.NET。 使用应用程序选择的 Redis 客户端或矢量存储连接器实现其搜索适配器,将 Redis 结果 TextSearchProvider.TextSearchResult映射到该连接器,并通过该 AIContextProviders连接器附加提供程序。

此方法支持 Redis 支持的 RAG,而无需 Redis 特定的代理框架上下文提供程序包。

安装软件包

pip install agent-framework-redis --pre

添加可搜索内存

当代理应召回所选相关信息,而不是重播上一条消息时,请使用此模式。

先决条件

  • RediSearch 支持的 Redis 部署,例如 Redis Stack 或兼容的托管服务。
  • 示例代理的 Microsoft Foundry 项目和模型部署。
  • 启用混合矢量搜索时,嵌入提供程序。

配置可搜索内存

使用 application_idagent_id分区内存和 user_id 分区内存。 如果需要混合检索,请添加 Redis 向量器和矢量字段设置。

# Create a provider with partition scope and OpenAI embeddings

# Please set OPENAI_API_KEY to use the OpenAI vectorizer.
# For chat responses, also set FOUNDRY_PROJECT_ENDPOINT and FOUNDRY_MODEL.

# We attach an embedding vectorizer so the provider can perform hybrid (text + vector)
# retrieval. If you prefer text-only retrieval, instantiate RedisContextProvider without the
# 'vectorizer' and vector_* parameters.
vectorizer = OpenAITextVectorizer(
    model="text-embedding-ada-002",
    api_config={"api_key": os.getenv("OPENAI_API_KEY")},
    cache=EmbeddingsCache(name="openai_embeddings_cache", redis_url=REDIS_URL),
)
# The provider manages persistence and retrieval. application_id/agent_id/user_id
# scope data for multi-tenant separation; thread_id (set later) narrows to a
# specific conversation.
provider = RedisContextProvider(
    source_id="redis_context",
    redis_url=REDIS_URL,
    index_name="redis_basics",
    application_id="matrix_of_kermits",
    agent_id="agent_kermit",
    user_id="kermit",
    redis_vectorizer=vectorizer,
    vector_field_name="vector",
    vector_algorithm="hnsw",
    vector_distance_metric="cosine",
)

将内存附加到代理

将提供程序添加到 context_providers. 提供程序在运行后存储聊天详细信息,并在以后运行之前显示相关上下文。

# Create chat client for the agent
client = create_chat_client()
# Create agent wired to the Redis context provider. The provider automatically
# persists conversational details and surfaces relevant context on each turn.
agent = Agent(
    client=client,
    name="MemoryEnhancedAssistant",
    instructions=(
        "You are a helpful assistant. Personalize replies using provided context. "
        "Before answering, always check for stored context"
    ),
    tools=[],
    context_providers=[provider],
)

# Teach a user preference; the agent writes this to the provider's memory
query = "Remember that I enjoy glugenflorgle"
result = await agent.run(query)
print("User: ", query)
print("Agent: ", result)

# Ask the agent to recall the stored preference; it should retrieve from memory
query = "What do I enjoy?"
result = await agent.run(query)

保留对话历史记录

当会话在应用程序重启或其他实例后必须恢复其完整脚本时,请使用此模式。

先决条件

  • 可通过 > 访问 Redis 部署。
  • TLS 和经过身份验证的 Redis 用户用于生产部署。

context_providers通过 . 附加 RedisHistoryProvider 。 提供程序存储会话的消息,并可以限制保留的消息计数。

async def example_manual_memory_store() -> None:
    """Basic example of using Redis history provider."""
    print("=== Basic Redis History Provider Example ===")

    # Create Redis history provider
    redis_provider = RedisHistoryProvider(
        source_id="redis_basic_chat",
        redis_url=REDIS_URL,
    )

    # Create agent with Redis history provider
    agent = Agent(
        client=OpenAIChatClient(),
        name="RedisBot",
        instructions="You are a helpful assistant that remembers our conversation using Redis.",
        context_providers=[redis_provider],
    )

    # Create session
    session = agent.create_session()

    # Have a conversation
    print("\n--- Starting conversation ---")
    query1 = "Hello! My name is Alice and I love pizza."
    print(f"User: {query1}")
    response1 = await agent.run(query1, session=session)
    print(f"Agent: {response1.text}")

    query2 = "What do you remember about me?"
    print(f"User: {query2}")
    response2 = await agent.run(query2, session=session)
    print(f"Agent: {response2.text}")

使用稳定的会话 ID,并在进程重启后客户端必须恢复相同的逻辑会话时,在受信任的应用程序存储中保留序列化 AgentSession

注释

目前尚未为 Agent Framework Go 记录 Redis 上下文提供程序集成。 有关最新状态,请参阅 Agent Framework Go 存储库

生产注意事项

  • 从经过身份验证的应用程序标识派生租户、搜索、内存和会话范围,而不是模型输出。
  • 使用 TLS、Redis 身份验证和网络隔离。
  • 使用租户隔离需要单独的密钥前缀或部署。
  • 为所需的持久性、备份、保留和逐出配置持久性。
  • 将检索到的内存视为不受信任的输入并缓解间接提示注入。
  • 在保留消息或为可搜索内容编制索引之前对敏感内容进行修订。

后续步骤

更深入: