Azure Cosmos DB

O Azure Cosmos DB suporta dois padrões distintos de fornecedores de contexto no Agent Framework. Escolha o prestador consoante se precisa de um histórico académico exato ou de um conhecimento extraído a longo prazo.

Padrão Provider Comportamento
Histórico de conversações CosmosChatHistoryProvider(.NET) ou CosmosHistoryProvider (Python) Guarda mensagens completas para que uma sessão possa ser retomada após um reinício ou noutra instância da aplicação.
Memória de longo prazo CosmosMemoryContextProvider(Python) Extrai factos, conhecimentos procedimentais, memórias episódicas e resumos, recuperando depois memórias relevantes para execuções posteriores.

Guardar histórico da conversa

Instale os pacotes

dotnet add package Microsoft.Agents.AI.CosmosNoSql --prerelease
dotnet add package Azure.Identity

Configurar o histórico de chat do Cosmos DB

Utilize a extensão de identidade gerida para anexar CosmosChatHistoryProvider a ChatClientAgentOptions.

using Azure.Identity;
using Microsoft.Agents.AI;

var options = new ChatClientAgentOptions
{
    ChatOptions = new() { Instructions = "You are a helpful assistant." }
}.WithCosmosDBChatHistoryProviderUsingManagedIdentity(
    accountEndpoint: Environment.GetEnvironmentVariable("AZURE_COSMOS_ENDPOINT")!,
    databaseId: Environment.GetEnvironmentVariable("AZURE_COSMOS_DATABASE_NAME")!,
    containerId: Environment.GetEnvironmentVariable("AZURE_COSMOS_CONTAINER_NAME")!,
    tokenCredential: new DefaultAzureCredential());

AIAgent agent = chatClient.AsAIAgent(options);

O inicializador do estado predefinido cria um ID da conversa. Forneça um CosmosChatHistoryProvider.State inicializador quando a sua aplicação precisar de comunicação explícita, encaminhamento de inquilinos e utilizadores. Quando estão presentes IDs de inquilino e utilizador, o fornecedor utiliza uma chave de partição hierárquica.

Warning

DefaultAzureCredential é conveniente para o desenvolvimento. Num ambiente de produção, deve dar-se preferência a uma credencial específica, como ManagedIdentityCredential.

Instale o pacote

pip install agent-framework-azure-cosmos --pre

Configurar CosmosHistoryProvider

O fornecedor Python aceita uma credencial do Azure ou uma chave de conta e usa a session_id como chave de partição.

# 1. Create an Azure credential and a CosmosHistoryProvider for agent context
async with (
    AzureCliCredential() as credential,
    CosmosHistoryProvider(
        endpoint=cosmos_endpoint,
        database_name=cosmos_database_name,
        container_name=cosmos_container_name,
        credential=cosmos_key or credential,
    ) as history_provider,
    # 2. Create an agent that uses Cosmos for persisted conversation history.
    Agent(
        client=FoundryChatClient(
            project_endpoint=project_endpoint,
            model=model,
            credential=credential,
        ),
        name="CosmosHistoryAgent",
        instructions="You are a helpful assistant that remembers prior turns.",
        context_providers=[history_provider],
        default_options={"store": False},
    ) as agent,
):
    # 3. Create a session (session_id is used as the partition key).
    session = agent.create_session()

    # 4. Run a multi-turn conversation; history is persisted by CosmosHistoryProvider.
    response1 = await agent.run("My name is Ada and I enjoy distributed systems.", session=session)
    print(f"Assistant: {response1.text}")

    response2 = await agent.run("What do you remember about me?", session=session)
    print(f"Assistant: {response2.text}")
    print(f"Container: {history_provider.container_name}")

Guarde a versão serializada de AgentSession no armazenamento fidedigno da aplicação quando os clientes precisarem de recuperar posteriormente o mesmo identificador de sessão.

Observação

O armazenamento de histórico do Azure Cosmos DB não está atualmente disponível para o Agent Framework Go. Implemente um fornecedor de histórico personalizado ou consulte o repositório Agent Framework Go para o estado mais recente.

Adicionar memória semântica de longo prazo

Observação

O fornecedor de memória de longo prazo Azure Cosmos DB está atualmente disponível para Python. Use o fornecedor de histórico de conversas acima quando uma aplicação .NET necessita de persistência exata das transcrições.

Pré-requisitos

  • Uma conta e base de dados Azure Cosmos DB.
  • Um projeto Microsoft Foundry com implementações de modelos de chat e de incorporação vetorial.
  • Acesso com identidade do Azure a ambos os recursos.

Instale os pacotes

pip install agent-framework-azure-cosmos-memory agent-framework-foundry --pre

Configurar o fornecedor de memória

O mesmo projeto Foundry pode fornecer o modelo de chat, embeddings e modelo de extração de memória. Anexe o fornecedor através de context_providers.

def _build_agent(provider: CosmosMemoryContextProvider, credential: DefaultAzureCredential) -> Agent:
    """Build an agent that uses the memory provider and the same Foundry endpoint for chat."""
    return Agent(
        client=FoundryChatClient(
            project_endpoint=os.environ["FOUNDRY_ENDPOINT"],
            model=os.getenv("CHAT_MODEL", "gpt-4o-mini"),
            credential=credential,
        ),
        name="Memory Assistant",
        instructions="You are a helpful assistant with long-term memory about the user.",
        context_providers=[provider],
    )


async def user_scoped_memory() -> None:
    """Memory scoped to a stable user id, so it persists across sessions and threads."""
    credential = DefaultAzureCredential()
    provider = CosmosMemoryContextProvider(
        cosmos_endpoint=os.environ["COSMOS_ENDPOINT"],
        foundry_endpoint=os.environ["FOUNDRY_ENDPOINT"],
        embedding_model=os.getenv("EMBEDDING_MODEL", "text-embedding-3-large"),
        chat_model=os.getenv("CHAT_MODEL", "gpt-4o-mini"),
        credential=credential,
    )
    agent = _build_agent(provider, credential)

    async with provider:
        session = agent.create_session()
        # Provider state is scoped by source id; set a stable user id there so memory
        # persists across sessions rather than being limited to this one.
        session.state.setdefault(provider.source_id, {})["user_id"] = "alice"
        first = await agent.run("I love hiking and I'm allergic to peanuts.", session=session)
        print("Assistant:", first.text)

        # A brand-new session for the same user still recalls the earlier facts.
        new_session = agent.create_session()
        new_session.state.setdefault(provider.source_id, {})["user_id"] = "alice"
        recall = await agent.run("What do you remember about me?", session=new_session)
        print("Assistant:", recall.text)

        # Let background extraction finish and persist before the client closes.
        await provider.flush()

Um user_id estável mantém a memória disponível entre sessões e threads. Na sua ausência, o fornecedor limita a memória ao ID da sessão atual.

Processamento de memória

A extração de memória corre em segundo plano após cada turno. Utilize o provedor como gestor de contexto assíncrono ou chame flush() antes do encerramento para que a extração pendente seja concluída antes de os clientes fecharem.

O fornecedor também suporta prompts de extração personalizados, cadência do processador, limiares de confiança, tipos de memória e limites de recuperação.

Observação

A memória de longo prazo do Azure Cosmos DB não está atualmente disponível para o Agent Framework Go. Consulte o repositório Agent Framework Go para o estado mais recente.

Considerações sobre a produção

  • Derivar identificadores de utilizador, inquilino e sessão a partir da identidade de aplicação autenticada.
  • Escolha chaves de partição que distribuam o tráfego e garantam o isolamento entre inquilinos.
  • Mantenha o Cosmos DB e os recursos de modelo em regiões aprovadas e aplique o RBAC de privilégio mínimo.
  • Configure as políticas de tempo de vida, cópias de segurança, retenção e eliminação, tanto para transcrições como para memórias extraídas.
  • Filtre ou rediga conteúdos sensíveis antes da persistência e não use memórias extraídas diretamente para decisões de autorização.

Passos seguintes

Vai mais fundo: