A geração aumentada de recuperação de gráficos (Graph RAG) está emergindo como uma técnica poderosa para aplicações de IA generativa para usar conhecimento específico de domínio e informações relevantes. A Graph RAG é uma alternativa aos métodos de pesquisa vetorial que usam um banco de dados de vetores.
Os gráficos de conhecimento são sistemas de conhecimento em que bancos de dados gráficos, como Neo4j ou Amazon Neptune, podem representar dados estruturados. Em um gráfico de conhecimento, as relações entre pontos de dados, chamados de edges, são tão significativas quanto as conexões entre os pontos de dados, chamados de nós. Um gráfico de conhecimento facilita a travessia de uma rede e o processamento de consultas complexas sobre dados conectados. Os gráficos de conhecimento são especialmente adequados para casos de uso envolvendo chatbots, resolução de identidade, análise de rede, mecanismos de recomendação, customer 360 e detecção de fraude.
A abordagem da Graph RAG aproveita a natureza estruturada dos bancos de dados gráficos para dar maior profundidade e contexto às informações recuperadas sobre redes ou relacionamentos complexos. Quando um banco de dados gráfico é emparelhado com um grande modelo de linguagem (LLM), um desenvolvedor pode automatizar partes significativas do processo de criação do gráfico a partir de dados não estruturados, como texto. Um LLM pode processar dados de texto e identificar entidades, entender seus relacionamentos e representá-los em uma estrutura gráfica.
Há muitas maneiras de criar uma aplicação Graph RAG, por exemplo, o GraphRAG da Microsoft, ou emparelhar o GPT4 com o LlamaIndex. Para este tutorial, você usará o Memgraph, uma solução de banco de dados gráfico de código aberto para criar um sistema rag usando o Llama-3 da Meta no watsonx. O Memgraph usa Cypher, uma linguagem de consulta declarativa. Ele compartilha algumas semelhanças com o SQL mas concentra-se em nós e relacionamentos em vez de tabelas e linhas. Você fará com que o Llama 3 crie e preencha seu banco de dados gráfico a partir de texto não estruturado e informações de consultas no banco de dados.
Embora você possa escolher entre várias ferramentas, este tutorial explica como configurar uma conta da IBM para usar um Jupyter Notebook.
Faça login no watsonx.ai usando sua conta do IBM Cloud.
Crie um projeto do watsonx.ai.
Você obtém a ID do projeto no seu projeto. Clique na guia Gerenciar. Em seguida, copie a ID do projeto da seção Detalhes da página Geral. Você precisa dessa ID do projeto para este tutorial.
Em seguida, associe seu projeto ao watsonx.ai Runtime
a. Crie uma instância do serviço watsonx.ai Runtime (escolha o plano Lite, que é uma instância gratuita).
b. Gere uma chave de API no watsonx.ai® tempo de execução. Salve esta chave de API para uso neste tutorial.
c. Acesse seu projeto e selecione a guia Gerenciar
d. Na guia esquerda, selecione Serviços e integrações
e. Selecione os serviços da IBM
f. Selecione Associar serviço e escolha watsonx.ai Runtime.
g. Associe o watsonx.ai Runtime. ao projeto que você criou no watsonx.ai
Agora, você precisará instalar o Docker.
Depois de instalar o Docker, instale o Memgraph usando o contêiner do Docker. No OSX ou no Linux, você pode usar este comando em um terminal:
Em um computador Windows, use:
Siga as etapas de instalação para colocar o mecanismo Memgraph e o laboratório Memgraph em funcionamento.
Em seu computador, crie um novo virtualenv para este projeto:
No ambiente do Python para seu notebook, instale as seguintes bibliotecas do Python:
Agora você está pronto para se conectar ao Memgraph.
Se você configurou o Memgraph para usar um nome de usuário e senha, defina-os aqui, caso contrário, poderá usar o padrão de não ter nenhum dos dois. Não é uma boa prática para um banco de dados de produção, mas para um ambiente de desenvolvimento local que não armazena dados confidenciais, não é um problema.
Agora, crie uma string de amostra que descreva um conjunto de dados de relacionamentos que você pode usar para testar os recursos de geração de gráficos do seu sistema LLM. Você pode usar fontes de dados mais complexas, mas esse exemplo simples nos ajuda a demonstrar o algoritmo.
Insira a chave de API do watsonx que você criou na primeira etapa:
Agora, configure uma instância do WatsonxLLM para gerar texto. A temperatura deve ser bastante baixa, e o número de tokens alto para incentivar o modelo a gerar o máximo de detalhes possível sem alucinar entidades ou relacionamentos que não estejam presentes.
O LLMGraphTransformer permite que você defina quais tipos de nós e relacionamentos você gostaria que o LLM gerasse. No seu caso, o texto descreve os funcionários de uma empresa, os grupos em que trabalham e os cargos que ocupam. Restringir o LLM a apenas essas entidades aumenta a probabilidade de obter uma boa representação do conhecimento em um gráfico.
A chamada para convert_to_graph_documents faz com que o LLMGraphTransformer crie um gráfico de conhecimento a partir do texto. Essa etapa gera a sintaxe correta do Neo4j para inserir as informações no banco de dados gráfico para representar o contexto relevante e as entidades relevantes.
Agora, limpe todos os dados antigos do banco de dados do Memgraph e insira os novos nós e edges.
A sintaxe do Cypher gerada é armazenada nos objetos graph_documents . Você pode inspecioná-lo simplesmente exibindo-o como uma string.
O esquema e os tipos de dados criados pelo Cypher podem ser vistos na propriedade "get_schema" dos gráficos.
Isso imprime:
Você também pode ver a estrutura do gráfico no visualizador do Memgraph labs:
O LLM fez um trabalho razoável na criação dos nós e das relações corretas. Chegou a hora de consultar o gráfico de conhecimento.
Solicitar o LLM corretamente requer alguma engenharia de prompts. O LangChain fornece um FewShotPromptTemplate que pode ser usado para dar exemplos ao LLM no prompt para garantir que ele grave a sintaxe do Cypher correta e sucinta. O código a seguir fornece vários exemplos de perguntas e consultas que o LLM deve usar. Elas também mostram como restringir a saída do modelo apenas à consulta. Um LLM excessivamente conversacional pode adicionar informações extras que levariam a consultas inválidas do Cypher, de modo que o prompt pede ao modelo que produza apenas a própria consulta.
Adicionar um prefixo instrutivo também ajuda a restringir o comportamento do modelo e torna mais provável que o LLM produza a sintaxe correta do Cypher.
Em seguida, você criará um prompt para controlar como o LLM responde à pergunta com as informações retornadas do Memgraph. Daremos ao LLM vários exemplos e instruções sobre como responder assim que ele receber as informações de contexto do banco de dados do gráfico.
Agora é hora de criar a cadeia de resposta à pergunta. O MemgraphQACChain permite que você defina qual LLM você gostaria de usar, o esquema do gráfico a ser usado e informações sobre depuração. Usar uma temperatura de 0 e uma penalidade de comprimento incentiva o LLM a manter o prompt do Cypher curto e direto.
Agora, você pode invocar a cadeia com uma pergunta em linguagem natural (observe que suas respostas podem ser ligeiramente diferentes, porque LLMs não são puramente determinísticos).
Isso gerará:
> Entering new MemgraphQAChain chain...
Generated Cypher:
MATCH (p:Person {id: 'John'})-[:TITLE]->(t:Title) RETURN t.id
Full Context:
[{'t.id': 'Director of the Digital Marketing Group'}]
> Finished chain.
{'query': 'What is Johns title?',
'result': ' \nAnswer: Director of the Digital Marketing Group.',
'intermediate_steps': [{'query': " MATCH (p:Person {id: 'John'})-[:TITLE]->(t:Title) RETURN t.id"},
{'context': [{'t.id': 'Director of the Digital Marketing Group'}]}]}
Na próxima pergunta, faça à cadeia uma pergunta um pouco mais complexa:
Isso deve retornar:
A resposta correta está contida na resposta. Em alguns casos, pode haver texto extra que você gostaria de remover antes de devolver a resposta ao usuário final.
Você pode perguntar à cadeia do Memgraph sobre os relacionamentos com o grupo:
Isso retornará:
Essa é a resposta correta.
Finalmente, faça uma pergunta à cadeia com duas saídas:
Isso deve produzir:
A cadeia identifica corretamente ambos os colaboradores.
Neste tutorial, você criou uma aplicação da Graph RAG usando o Memgraph e o watsonx para gerar as estruturas de dados gráficas e consultá-las. Usando um LLM por meio do watsonx, você extraiu informações de nós e edge do texto de origem em linguagem natural e gerou a sintaxe de consulta do Cypher para preencher um banco de dados gráfico. Em seguida, você usou o watsonx para transformar perguntas de linguagem natural sobre esse texto de origem em consultas do Cypher que extraíram informações do banco de dados gráfico. Usando engenharia de prompts, o LLM transformou os resultados do banco de dados Memgraph em respostas de linguagem natural.