Compartilhar via


RAG (geração aumentada de recuperação) com o Azure Cosmos DB for MongoDB baseado em vCore

No campo em rápida evolução da IA generativa, LLMs (grandes modelos de linguagem) como GPT-3.5 transformaram o processamento de linguagem natural. No entanto, uma tendência emergente na IA é o uso de repositórios de vetores, que desempenham um papel fundamental no aprimoramento de aplicativos de IA.

Este tutorial explora como usar o Azure Cosmos DB for MongoDB (vCore), LangChain e OpenAI para implementar a RAG (geração aumentada em recuperação) para um desempenho de IA superior, além de discutir LLMs e suas limitações. Exploramos o paradigma rapidamente adotado da "geração aumentada de recuperação" (RAG) e discutimos brevemente a estrutura LangChain e modelos do Azure OpenAI. Por fim, integramos esses conceitos em um aplicativo do mundo real. Ao final, os leitores terão uma compreensão sólida desses conceitos.

Entender LLMs (grandes modelos de linguagem grande) e suas limitações

Os LLMs (grandes modelos de linguagem) são modelos avançados de rede neural profunda treinados em conjuntos de dados de texto extensivos, permitindo que eles entendam e gerem texto semelhante ao de humanos. Embora sejam revolucionários no processamento de linguagem natural, os LLMs têm limitações inerentes:

  • Alucinações: os LLMs às vezes geram informações factualmente incorretas ou sem fundamentos, conhecidas como "alucinações".
  • Dados obsoletos: os LLMs são treinadas com conjuntos de dados estáticos que podem não incluir as informações mais recentes, limitando sua relevância atual.
  • Falta de acesso aos dados locais do usuário: os LLMs não têm acesso direto a dados pessoais ou localizados, restringindo sua capacidade de fornecer respostas personalizadas.
  • Limites de token: os LLMs têm um limite máximo de token por interação, restringindo a quantidade de texto que podem processar ao mesmo tempo. Por exemplo, o gpt-3.5-turbo da OpenAI tem um limite de token de 4096.

Aproveitar a geração aumentada de recuperação (RAG)

A RAG (geração aumentada de recuperação) é uma arquitetura projetada para superar as limitações do LLM. A RAG usa a busca em vetores para recuperar documentos relevantes com base em uma consulta de entrada, fornecendo esses documentos como contexto para o LLM para gerar respostas mais precisas. Em vez de depender apenas de padrões pré-treinados, a RAG aprimora as respostas incorporando informações atualizadas e relevantes. Essa abordagem ajuda a:

  • Minimizar alucinações: baseando as respostas em informações factuais.
  • Garantir informações atuais: recuperando os dados mais recentes para garantir respostas atualizadas.
  • Utilizar bancos de dados externos: embora não conceda acesso direto a dados pessoais, a RAG permite a integração com bases de dados de conhecimento externas específicas ao usuário.
  • Otimizar o uso de token: ao se concentrar nos documentos mais relevantes, a RAG torna o uso de token mais eficiente.

Este tutorial demonstra como a RAG pode ser implementada usando o Azure Cosmos DB for MongoDB (vCore) para criar um aplicativo de resposta a perguntas adaptado aos seus dados.

Visão geral da arquitetura do aplicativo

O diagrama de arquitetura abaixo ilustra os principais componentes da implementação da RAG:

Diagrama da Arquitetura

Principais componentes e estruturas

Agora discutiremos as várias estruturas, modelos e componentes usados neste tutorial, enfatizando suas funções e nuances.

Azure Cosmos DB for MongoDB (vCore)

O Azure Cosmos DB for MongoDB (vCore) dá suporte a pesquisas de similaridade semântica, essenciais para aplicativos da plataforma AI. Ele permite que dados em vários formatos sejam representados como incorporações de vetor, que podem ser armazenados junto com dados de origem e metadados. Usando um algoritmo aproximado de vizinhos mais próximos, como HNSW (Hierarchical navigable small world — mundo pequeno navegável hierárquico), essas incorporações podem ser consultadas para pesquisas rápidas de similaridade semântica.

Estrutura LangChain

O LangChain simplifica a criação de aplicativos de LLM fornecendo uma interface padrão para cadeias, várias integrações de ferramentas e cadeias de ponta a ponta para tarefas comuns. Ele permite que os desenvolvedores de IA criem aplicativos de LLM que aproveitem fontes de dados externas.

Principais aspectos do LangChain:

  • Cadeias: sequências de componentes que resolvem tarefas específicas.
  • Componentes: módulos como wrappers de LLM, wrappers do repositório de vetores, modelos de prompt, carregadores de dados, divisores de texto e recuperadores.
  • Modularidade: simplifica o desenvolvimento, a depuração e a manutenção.
  • Popularidade: um projeto de código aberto sendo adotado rapidamente e evoluindo para atender às necessidades do usuário.

Interface dos Serviços de Aplicativos do Azure

Os serviços de aplicativos fornecem uma plataforma robusta para a criação de interfaces da Web amigáveis para aplicativos Gen-AI. Este tutorial usa os Serviços de Aplicativos do Azure para criar uma interface da Web interativa para o aplicativo.

Modelos de OpenAI

A OpenAI é líder em pesquisa de IA, fornecendo vários modelos para geração de linguagem, vetorização de texto, criação de imagem e conversão de áudio em texto. Para este tutorial, usaremos os modelos de incorporação e de linguagem da OpenAI, cruciais para entender e gerar aplicativos baseados em linguagem.

Modelos de incorporação vs. Modelos de geração de linguagem

Categoria Modelo de incorporação de texto Modelo de linguagem
Finalidade Converter texto em incorporações de vetor. Entender e gerar linguagem natural.
Função Transforma dados textuais em matrizes de números de alta dimensão, capturando o significado semântico do texto. Compreende e produz texto semelhante ao humano com base na entrada fornecida.
Saída Matriz de números (incorporações de vetor). Texto, respostas, traduções, código, etc.
Exemplo de saída Cada incorporação representa o significado semântico do texto na forma numérica, com uma dimensionalidade determinada pelo modelo. Por exemplo, text-embedding-ada-002 gera vetores com 1536 dimensões. Texto coerente e contextualmente relevante gerado com base na entrada fornecida. Por exemplo, gpt-3.5-turbo pode gerar respostas para perguntas, traduzir texto, escrever código e muito mais.
Casos de uso típicos – Pesquisa semântica – Chatbots
– Sistemas de recomendação – Criação de conteúdo automatizada
– Clustering e classificação de dados de texto – Tradução de idioma
– Recuperação de informações – Resumo
Representação de dados Representação numérica (incorporações) Texto da linguagem natural
Dimensionalidade O comprimento da matriz corresponde ao número de dimensões no espaço de incorporação, por exemplo, 1536 dimensões. Normalmente representado como uma sequência de tokens, com o contexto determinando o comprimento.

Principais componentes do aplicativo

  • Azure Cosmos DB for MongoDB vCore: armazenando e consultando incorporações de vetor.
  • LangChain: construindo o fluxo de trabalho de LLM do aplicativo. Utiliza ferramentas como:
    • Carregador de documentos: para carregar e processar documentos de um diretório.
    • Integração de repositório de vetores: para armazenar e consultar incorporações de vetor no Azure Cosmos DB.
    • AzureCosmosDBVectorSearch: wrapper em torno da busca em vetores do Cosmos DB
  • Serviços de Aplicativos do Azure: criando a interface do usuário para o aplicativo Cosmic Food.
  • Azure OpenAI: para fornecer modelos de incorporação e de LLM, incluindo:
    • text-embedding-ada-002: um modelo de incorporação de texto que converte texto em incorporações de vetor com 1536 dimensões.
    • gpt-3.5-turbo: um modelo de linguagem para entender e gerar linguagem natural.

Configurar o ambiente

Para começar a otimizar a geração aumentada de recuperação (RAG) usando o Azure Cosmos DB for MongoDB (vCore), siga estas etapas:

  • Crie os seguintes recursos no Microsoft Azure:
    • Cluster do Azure Cosmos DB for MongoDB vCore: consulte o Guia de início rápido aqui.
    • Recurso OpenAI do Azure com:
      • Implantação de modelo de incorporação (por exemplo, text-embedding-ada-002).
      • Implantação de modelo de chat (por exemplo, gpt-35-turbo).

Documentos de amostra

Neste tutorial, carregaremos um único arquivo de texto usando Document. Esses arquivos devem ser salvos em um diretório chamado dados na pasta src. O conteúdo do é o seguinte:

food_items.json

    {
        "category": "Cold Dishes",
        "name": "Hamachi Fig",
        "description": "Hamachi sashimi lightly tossed in a fig sauce with rum raisins, and serrano peppers then topped with fried lotus root.",
        "price": "16.0 USD"
    },

Carregue os documentos

  1. Defina a cadeia de conexão do Cosmos DB for MongoDB (vCore), o nome do banco de dados, o nome da coleção e o índice:

    mongo_client = MongoClient(mongo_connection_string)
    database_name = "Contoso"
    db = mongo_client[database_name]
    collection_name = "ContosoCollection"
    index_name = "ContosoIndex"
    collection = db[collection_name]
    
  2. Inicialize o cliente de incorporação.

    from langchain_openai import AzureOpenAIEmbeddings
    
    openai_embeddings_model = os.getenv("AZURE_OPENAI_EMBEDDINGS_MODEL_NAME", "text-embedding-ada-002")
    openai_embeddings_deployment = os.getenv("AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME", "text-embedding")
    
    azure_openai_embeddings: AzureOpenAIEmbeddings = AzureOpenAIEmbeddings(
        model=openai_embeddings_model,
        azure_deployment=openai_embeddings_deployment,
    )
    
  3. Crie incorporações dos dados, salve no banco de dados e retorne uma conexão ao seu repositório de vetores, Cosmos DB para MongoDB (vCore).

    vector_store: AzureCosmosDBVectorSearch = AzureCosmosDBVectorSearch.from_documents(
        json_data,
        azure_openai_embeddings,
        collection=collection,
        index_name=index_name,
    )
    
  4. Crie o seguinte Índice de vetor HNSW na coleção (observe que o nome do índice é o mesmo supramencionado).

    num_lists = 100
    dimensions = 1536
    similarity_algorithm = CosmosDBSimilarityType.COS
    kind = CosmosDBVectorSearchType.VECTOR_HNSW
    m = 16
    ef_construction = 64
    
    vector_store.create_index(
        num_lists, dimensions, similarity_algorithm, kind, m, ef_construction
    )
    

Executar a busca em vetores usando o Cosmos DB for MongoDB (vCore)

  1. Conecte-se ao repositório de vetores.

    vector_store: AzureCosmosDBVectorSearch =  AzureCosmosDBVectorSearch.from_connection_string(
        connection_string=mongo_connection_string,
        namespace=f"{database_name}.{collection_name}",
        embedding=azure_openai_embeddings,
    )
    
  2. Defina uma função que executa a pesquisa de similaridade semântica usando a Busca em vetores do Cosmos DB em uma consulta (observe que este snippet de código é apenas uma função de teste).

    query = "beef dishes"
    docs = vector_store.similarity_search(query)
    print(docs[0].page_content)
    
  3. Inicialize o cliente de chat para implementar uma função RAG.

    azure_openai_chat: AzureChatOpenAI = AzureChatOpenAI(
        model=openai_chat_model,
        azure_deployment=openai_chat_deployment,
    )
    
  4. Crie uma função RAG.

    history_prompt = ChatPromptTemplate.from_messages(
        [
            MessagesPlaceholder(variable_name="chat_history"),
            ("user", "{input}"),
            (
                "user",
                """Given the above conversation,
                generate a search query to look up to get information relevant to the conversation""",
            ),
        ]
    )
    
    context_prompt = ChatPromptTemplate.from_messages(
        [
            ("system", "Answer the user's questions based on the below context:\n\n{context}"),
            MessagesPlaceholder(variable_name="chat_history"),
            ("user", "{input}"),
        ]
    )
    
  5. Converte o repositório de vetores em um recuperador, que pode procurar documentos relevantes com base nos parâmetros especificados.

    vector_store_retriever = vector_store.as_retriever(
        search_type=search_type, search_kwargs={"k": limit, "score_threshold": score_threshold}
    )
    
  6. Crie uma cadeia de recuperadores que esteja ciente do histórico de conversas, garantindo a recuperação de documentos contextualmente relevantes usando o modelo azure_openai_chat e vector_store_retriever.

    retriever_chain = create_history_aware_retriever(azure_openai_chat, vector_store_retriever, history_prompt)
    
  7. Crie uma cadeia que combine documentos recuperados em uma resposta coerente usando o modelo de linguagem (azure_openai_chat) e um prompt especificado (context_prompt).

    context_chain = create_stuff_documents_chain(llm=azure_openai_chat, prompt=context_prompt)
    
  8. Crie uma cadeia que manipula todo o processo de recuperação, integrando a cadeia de recuperadores com reconhecimento de histórico e a cadeia de combinação de documentos. Essa cadeia RAG pode ser executada para recuperar e gerar respostas contextualmente precisas.

    rag_chain: Runnable = create_retrieval_chain(
        retriever=retriever_chain,
        combine_docs_chain=context_chain,
    )
    

Exemplos de saída

A captura de tela abaixo ilustra as saídas para várias perguntas. Uma pesquisa de similaridade puramente semântica retorna o texto bruto dos documentos de origem, enquanto o aplicativo de resposta a perguntas usando a arquitetura RAG gera respostas precisas e personalizadas combinando o conteúdo do documento recuperado com o modelo de linguagem.

Rag Comic App

Conclusão

Neste tutorial, exploramos como criar um aplicativo de resposta a perguntas que interage com seus dados privados usando o Cosmos DB como um repositório de vetores. Ao aproveitar a arquitetura de geração aumentada de recuperação (RAG) com LangChain e Azure OpenAI, demonstramos como os repositórios de vetores são essenciais para aplicativos de LLM.

A RAG é um avanço significativo na IA, particularmente no processamento de linguagem natural, e a combinação dessas tecnologias permite a criação de aplicativos de IA avançados para vários casos de uso.

Próxima etapa