GraphRAG explicado: aprimorando RAG com grafos de conhecimento
Introdução ao RAG e seus desafios
Retrieval Augmented Generation (RAG) é uma técnica que conecta fontes de dados externas para aprimorar a saída de grandes modelos de linguagem (LLMs). Essa técnica é perfeita para que LLMs acessem dados privados ou específicos de um domínio e resolvam problemas de alucinação. Portanto, o RAG tem sido amplamente usado para impulsionar muitas aplicações de GenAI, como chatbots de IA e sistemas de recomendação.
Um RAG básico geralmente integra um banco de dados vetorial e um LLM, em que o banco de dados vetorial armazena e recupera informações contextuais para consultas de usuários, e o LLM gera respostas com base no contexto recuperado. Embora essa abordagem funcione bem em muitos casos, ela enfrenta dificuldades com tarefas complexas, como raciocínio multi-hop ou responder a perguntas que exigem conectar partes distintas de informação.
Por exemplo, considere esta pergunta: “Que nome foi dado ao filho do homem que derrotou o usurpador Allectus?”
Um RAG básico geralmente seguiria estas etapas para responder a essa pergunta:
Identificar o homem: Determinar quem derrotou Allectus.
Pesquisar o filho do homem: Procurar informações sobre a família dessa pessoa, especificamente seu filho.
Encontrar o nome: Identificar o nome do filho.
O desafio geralmente surge na primeira etapa porque um RAG básico recupera texto com base em similaridade semântica, não respondendo diretamente a consultas complexas nas quais detalhes específicos podem não ser mencionados explicitamente no conjunto de dados. Essa limitação dificulta encontrar a informação exata necessária, muitas vezes exigindo soluções caras e impraticáveis, como criar manualmente pares de perguntas e respostas para consultas frequentes.
Para enfrentar esses desafios, a Microsoft Research apresentou o GraphRAG, um método totalmente novo que amplia a recuperação e a geração do RAG com grafos de conhecimento. Nas seções a seguir, explicaremos como o GraphRAG funciona por baixo do capô e como executá-lo com o banco de dados vetorial Milvus .
O que é GraphRAG e como ele funciona?
Ao contrário de um RAG básico que usa um banco de dados vetorial para recuperar texto semanticamente semelhante, o GraphRAG aprimora o RAG incorporando grafos de conhecimento (KGs). Grafos de conhecimento são estruturas de dados que armazenam e vinculam dados relacionados ou não relacionados com base em seus relacionamentos.
Um pipeline GraphRAG geralmente consiste em dois processos fundamentais: indexação e consulta.
O pipeline GraphRAG
O pipeline GraphRAG (Fonte da imagem: Artigo do GraphRAG)
Indexação
O processo de indexação inclui quatro etapas principais:
Segmentação de unidades de texto: Todo o corpus de entrada é dividido em várias unidades de texto (trechos de texto). Esses trechos são as menores unidades analisáveis e podem ser parágrafos, frases ou outras unidades lógicas. Ao segmentar documentos longos em trechos menores, podemos extrair e preservar informações mais detalhadas sobre esses dados de entrada.
Extração de entidades, relacionamentos e afirmações: O GraphRAG usa LLMs para identificar e extrair todas as entidades (nomes de pessoas, lugares, organizações etc.), relacionamentos entre elas e afirmações-chave expressas no texto de cada unidade de texto. Usaremos essas informações extraídas para construir um grafo de conhecimento inicial.
Agrupamento Hierárquico: O GraphRAG usa a técnica Leiden para realizar agrupamento hierárquico nos grafos de conhecimento iniciais. Leiden é um algoritmo de detecção de comunidades que pode descobrir de forma eficaz estruturas de comunidades dentro do grafo. As entidades em cada cluster são atribuídas a diferentes comunidades para uma análise mais aprofundada.
Observação: Uma comunidade é um grupo de nós dentro do grafo que estão densamente conectados entre si, mas esparsamente conectados a outros grupos densos na rede.
- Geração de Resumos de Comunidades: O GraphRAG gera resumos para cada comunidade e seus membros usando uma abordagem de baixo para cima. Esses resumos incluem as principais entidades dentro da comunidade, seus relacionamentos e alegações-chave. Esta etapa fornece uma visão geral de todo o conjunto de dados e fornece informações contextuais úteis para consultas subsequentes.
Figura 1- Um grafo de conhecimento gerado por LLM criado usando GPT-4 Turbo.
Figura 1: Um grafo de conhecimento gerado por LLM criado usando GPT-4 Turbo.
(Fonte da imagem: Microsoft Research)
Consulta
O GraphRAG tem dois fluxos de trabalho de consulta diferentes adaptados para diferentes consultas.
Pesquisa Global para raciocinar sobre perguntas holísticas relacionadas a todo o corpus de dados, aproveitando os resumos das comunidades.
Pesquisa Local para raciocinar sobre entidades específicas, expandindo para seus vizinhos e conceitos associados.
Este fluxo de trabalho de pesquisa global inclui as seguintes fases.
Figura 2- Fluxo de dados da pesquisa global
Figura 2: Fluxo de dados da pesquisa global (Fonte da imagem: Microsoft Research)
Consulta do Usuário e Histórico da Conversa: O sistema usa a consulta do usuário e o histórico da conversa como entrada inicial.
Lotes de Relatórios de Comunidade: O sistema usa relatórios de comunidades de nós gerados pelo LLM a partir de um nível especificado da hierarquia de comunidades como dados de contexto. Esses relatórios de comunidade são embaralhados e divididos em vários lotes (Lote de Relatórios de Comunidade Embaralhado 1, Lote 2... Lote N).
RIR (Respostas Intermediárias Avaliadas): Cada lote de relatórios de comunidade é dividido ainda mais em blocos de texto de tamanho predefinido. Cada bloco de texto é usado para gerar uma resposta intermediária. A resposta contém uma lista de informações chamadas pontos. Cada ponto tem uma pontuação numérica indicando sua importância. Essas respostas intermediárias geradas são as Respostas Intermediárias Avaliadas (Resposta Intermediária Avaliada 1, Resposta 2... Resposta N).
Classificação e Filtragem: O sistema classifica e filtra essas respostas intermediárias, selecionando os pontos mais importantes. Os pontos importantes selecionados formam as Respostas Intermediárias Agregadas.
Resposta Final: As respostas intermediárias agregadas são usadas como contexto para gerar a resposta final.
Quando os usuários fazem perguntas sobre entidades específicas (como nomes de pessoas, lugares, organizações etc.), recomendamos que você use o fluxo de trabalho de pesquisa local. Este processo inclui as seguintes etapas:
Figura 3- Fluxo de dados da pesquisa local
Figura 3: Fluxo de dados da pesquisa local (Fonte da imagem: Microsoft Research)
Consulta do Usuário: Primeiro, o sistema recebe uma consulta do usuário, que pode ser uma pergunta simples ou uma consulta mais complexa.
Busca de Entidades Similares: O sistema identifica um conjunto de entidades do grafo de conhecimento que são semanticamente relacionadas à entrada do usuário. Essas entidades servem como pontos de entrada no grafo de conhecimento. Esta etapa usa um banco de dados vetorial como o Milvus para realizar buscas por similaridade de texto.
Mapeamento de Entidades-Unidades de Texto: As unidades de texto extraídas são mapeadas para as entidades correspondentes, removendo as informações de texto originais.
Extração de Entidades-Relacionamentos: A etapa extrai informações específicas sobre as entidades e seus relacionamentos correspondentes.
Mapeamento de Entidades-Covariáveis: Esta etapa mapeia entidades para suas covariáveis, que podem incluir dados estatísticos ou outros atributos relevantes.
Mapeamento de Entidades-Relatórios de Comunidade: Relatórios de comunidade são integrados aos resultados da busca, incorporando algumas informações globais.
Utilização do Histórico de Conversa: Se fornecido, o sistema usa o histórico de conversa para entender melhor a intenção e o contexto do usuário.
Geração de Resposta: Por fim, o sistema constrói e responde à consulta do usuário com base nos dados filtrados e ordenados gerados nas etapas anteriores.
RAG de Referência vs. GraphRAG na Qualidade da Saída
Para demonstrar a eficácia do GraphRAG, seus criadores comparam a qualidade da saída de um RAG de referência e do GraphRAG em seu blog de anúncio. Vou citar um exemplo simples para ilustração aqui.
Conjunto de dados usado
Os criadores do GraphRAG usaram o conjunto de dados Violent Incident Information from News Articles (VIINA) em seus experimentos.
Observação: Este conjunto de dados contém tópicos sensíveis. Ele foi escolhido exclusivamente devido à sua complexidade e à presença de opiniões divergentes e informações parciais. É um caso de teste confuso do mundo real que era recente o suficiente para não ser incluído no treinamento do modelo-base do LLM.
Visão geral do experimento
Tanto o RAG de Referência quanto o GraphRAG receberam a mesma pergunta, que exige agregar informações em todo o conjunto de dados para compor uma resposta.
P: Quais são os 5 principais temas no conjunto de dados?
As respostas são mostradas na imagem abaixo. Os resultados do RAG de Referência foram irrelevantes para os temas da guerra, pois a busca vetorial recuperou texto não relacionado, levando a uma avaliação imprecisa. Em contraste, o GraphRAG forneceu uma resposta clara e relevante, identificando os principais temas e detalhes de apoio. Os resultados estavam alinhados com o conjunto de dados, com referências ao material de origem.
Figura 4- BaselineRAG vs. GraphRAG ao responder perguntas complexas de sumarização
Figura 4: BaselineRAG vs. GraphRAG ao responder perguntas complexas de sumarização
Experimentos adicionais no artigo “From Local to Global: A Graph RAG Approach to Query-Focused Summarization.” demonstram que o GraphRAG melhora significativamente o raciocínio multi-hop e a sumarização de informações complexas. A pesquisa indica que o GraphRAG supera o RAG de Referência tanto em abrangência quanto em diversidade:
Abrangência: A medida em que a resposta cobre todos os aspectos da pergunta.
Diversidade: A variedade e a riqueza de perspectivas e insights que a resposta fornece.
Recomendamos que você leia o artigo original do GraphRAG para obter mais detalhes sobre esses experimentos.
Como Implementar o GraphRAG com o Banco de Dados Vetorial Milvus
O GraphRAG aprimora aplicações RAG com grafos de conhecimento e também depende de um banco de dados vetorial para recuperar entidades relevantes. Esta seção demonstra como implementar o GraphRAG, criar um índice GraphRAG e consultá-lo usando o banco de dados vetorial Milvus.
Pré-requisitos
Antes de executar o código deste blog, certifique-se de ter instalado as seguintes dependências:
pip install --upgrade pymilvus
pip install git+https://github.com/zc277584121/graphrag.git
Observação: Instalamos o GraphRAG a partir de um repositório forkado porque o recurso de armazenamento Milvus ainda aguarda uma mesclagem oficial no momento da escrita.
Vamos começar com o fluxo de trabalho de indexação.
Preparação dos dados
Baixe um pequeno arquivo de texto com cerca de mil linhas do Project Gutenberg e use-o para a indexação do GraphRAG.
Este conjunto de dados é sobre a história de Leonardo Da Vinci. Usamos o GraphRAG para construir um índice em grafo de todos os relacionamentos relacionados a Da Vinci e o banco de dados vetorial Milvus para buscar conhecimento relevante para responder a perguntas.
import nest_asyncio
nest_asyncio.apply()
import os
import urllib.request
index_root = os.path.join(os.getcwd(), 'graphrag_index')
os.makedirs(os.path.join(index_root, 'input'), exist_ok=True)
url = "https://www.gutenberg.org/cache/epub/7785/pg7785.txt"
file_path = os.path.join(index_root, 'input', 'davinci.txt')
urllib.request.urlretrieve(url, file_path)
with open(file_path, 'r+', encoding='utf-8') as file:
# We use the first 934 lines of the text file, because the later lines are not relevant for this example.
# If you want to save api key cost, you can truncate the text file to a smaller size.
lines = file.readlines()
file.seek(0)
file.writelines(lines[:934]) # Decrease this number if you want to save api key cost.
file.truncate()
Inicialize o workspace
Agora, vamos usar o GraphRAG para indexar o arquivo de texto. Para inicializar seu workspace, primeiro vamos executar o comando graphrag.index --init.
python -m graphrag.index --init --root ./graphrag_index
Configure o arquivo env e as configurações
Você encontrará o arquivo .env no diretório raiz do índice. Para usá-lo, adicione sua chave de API da OpenAI ao arquivo .env.
Observações importantes: __
Usaremos modelos da OpenAI neste exemplo; certifique-se de ter uma chave de API pronta.
A indexação do GraphRAG é custosa, pois processa todo o corpus de texto com LLMs. Executar esta demonstração pode custar alguns dólares. Para economizar dinheiro, considere truncar o arquivo de texto para um tamanho menor.
Executando o pipeline de indexação
O processo de indexação levará algum tempo. Depois de concluído, você encontrará uma nova pasta em ./graphrag_index/output/<timestamp>/artifacts contendo uma série de arquivos parquet.
python -m graphrag.index --root ./graphrag_index
Consultando com o banco de dados vetorial Milvus
Durante a etapa de consulta, usamos o Milvus para armazenar embeddings de descrições de entidades para a busca local do GraphRAG. Este método combina dados estruturados do grafo de conhecimento com dados não estruturados de documentos de entrada, enriquecendo o contexto do LLM com informações relevantes de entidades para respostas mais precisas.
import os
import pandas as pd
import tiktoken
from graphrag.query.context_builder.entity_extraction import EntityVectorStoreKey
from graphrag.query.indexer_adapters import (
# read_indexer_covariates,
read_indexer_entities,
read_indexer_relationships,
read_indexer_reports,
read_indexer_text_units,
)
from graphrag.query.input.loaders.dfs import (
store_entity_semantic_embeddings,
)
from graphrag.query.llm.oai.chat_openai import ChatOpenAI
from graphrag.query.llm.oai.embedding import OpenAIEmbedding
from graphrag.query.llm.oai.typing import OpenaiApiType
from graphrag.query.question_gen.local_gen import LocalQuestionGen
from graphrag.query.structured_search.local_search.mixed_context import (
LocalSearchMixedContext,
)
from graphrag.query.structured_search.local_search.search import LocalSearch
from graphrag.vector_stores import MilvusVectorStore
output_dir = os.path.join(index_root, "output")
subdirs = [os.path.join(output_dir, d) for d in os.listdir(output_dir)]
latest_subdir = max(subdirs, key=os.path.getmtime) # Get latest output directory
INPUT_DIR = os.path.join(latest_subdir, "artifacts")
COMMUNITY_REPORT_TABLE = "create_final_community_reports"
ENTITY_TABLE = "create_final_nodes"
ENTITY_EMBEDDING_TABLE = "create_final_entities"
RELATIONSHIP_TABLE = "create_final_relationships"
COVARIATE_TABLE = "create_final_covariates"
TEXT_UNIT_TABLE = "create_final_text_units"
COMMUNITY_LEVEL = 2
Carregar dados do processo de indexação
Durante o processo de indexação, alguns arquivos parquet serão gerados. Nós os carregamos na memória e armazenamos as informações de descrição das entidades no banco de dados vetorial Milvus.
Ler entidades:
# read nodes table to get community and degree data
entity_df = pd.read_parquet(f"{INPUT_DIR}/{ENTITY_TABLE}.parquet")
entity_embedding_df = pd.read_parquet(f"{INPUT_DIR}/{ENTITY_EMBEDDING_TABLE}.parquet")
entities = read_indexer_entities(entity_df, entity_embedding_df, COMMUNITY_LEVEL)
description_embedding_store = MilvusVectorStore(
collection_name="entity_description_embeddings",
)
# description_embedding_store.connect(uri="http://localhost:19530") # For Milvus docker service
description_embedding_store.connect(uri="./milvus.db") # For Milvus Lite
entity_description_embeddings = store_entity_semantic_embeddings(
entities=entities, vectorstore=description_embedding_store
)
print(f"Entity count: {len(entity_df)}")
entity_df.head()
Contagem de entidades: 651
Figura 5: uma captura de tela de entidades
Figura 5: uma captura de tela de entidades
Ler relacionamentos
relationship_df = pd.read_parquet(f"{INPUT_DIR}/{RELATIONSHIP_TABLE}.parquet")
relationships = read_indexer_relationships(relationship_df)
print(f"Relationship count: {len(relationship_df)}")
relationship_df.head()
Contagem de relacionamentos: 290
Figura 6- uma captura de tela de relacionamentos
Figura 6: uma captura de tela de relacionamentos
Ler relatórios de comunidade
report_df = pd.read_parquet(f"{INPUT_DIR}/{COMMUNITY_REPORT_TABLE}.parquet")
reports = read_indexer_reports(report_df, entity_df, COMMUNITY_LEVEL)
print(f"Report records: {len(report_df)}")
report_df.head()
Registros de relatório: 45
Figura 7- uma captura de tela de registros de relatório
Figura 7: uma captura de tela de registros de relatório
Ler unidades de texto
text_unit_df = pd.read_parquet(f"{INPUT_DIR}/{TEXT_UNIT_TABLE}.parquet")
text_units = read_indexer_text_units(text_unit_df)
print(f"Text unit records: {len(text_unit_df)}")
text_unit_df.head()
Registros de unidades de texto: 51
Figura 8- uma captura de tela de registros de unidades de texto
Figura 8: uma captura de tela de registros de unidades de texto
Criar um mecanismo de busca local
Preparamos os dados necessários para o mecanismo de busca local. Agora, podemos criar uma instância LocalSearch com eles, um LLM e um modelo de embedding.
Preparamos os dados necessários para o mecanismo de busca local. Agora, podemos criar uma instância LocalSearch com eles, um LLM e um modelo de embedding.
api_key = os.environ["OPENAI_API_KEY"] # Your OpenAI API key
llm_model = "gpt-4o" # Or gpt-4-turbo-preview
embedding_model = "text-embedding-3-small"
llm = ChatOpenAI(
api_key=api_key,
model=llm_model,
api_type=OpenaiApiType.OpenAI,
max_retries=20,
)
token_encoder = tiktoken.get_encoding("cl100k_base")
text_embedder = OpenAIEmbedding(
api_key=api_key,
api_base=None,
api_type=OpenaiApiType.OpenAI,
model=embedding_model,
deployment_name=embedding_model,
max_retries=20,
)
context_builder = LocalSearchMixedContext(
community_reports=reports,
text_units=text_units,
entities=entities,
relationships=relationships,
covariates=None, #covariates,#todo
entity_text_embeddings=description_embedding_store,
embedding_vectorstore_key=EntityVectorStoreKey.ID, # if the vectorstore uses entity title as ids, set this to EntityVectorStoreKey.TITLE
text_embedder=text_embedder,
token_encoder=token_encoder,
)
local_context_params = {
"text_unit_prop": 0.5,
"community_prop": 0.1,
"conversation_history_max_turns": 5,
"conversation_history_user_turns_only": True,
"top_k_mapped_entities": 10,
"top_k_relationships": 10,
"include_entity_rank": True,
"include_relationship_weight": True,
"include_community_rank": False,
"return_candidate_context": False,
"embedding_vectorstore_key": EntityVectorStoreKey.ID, # set this to EntityVectorStoreKey.TITLE if the vectorstore uses entity title as ids
"max_tokens": 12_000, # change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 5000)
}
llm_params = {
"max_tokens": 2_000, # change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 1000=1500)
"temperature": 0.0,
}
search_engine = LocalSearch(
llm=llm,
context_builder=context_builder,
token_encoder=token_encoder,
llm_params=llm_params,
context_builder_params=local_context_params,
response_type="multiple paragraphs", # free form text describing the response type and format, can be anything, e.g. prioritized list, single paragraph, multiple paragraphs, multiple-page report
)
Faça uma consulta.
result = await search_engine.asearch("Tell me about Leonardo Da Vinci")
print(result.response)
# Leonardo da Vinci
Leonardo da Vinci, nascido em 1452 na cidade de Vinci, perto de Florença, é amplamente celebrado como um dos gênios mais versáteis do Renascimento italiano. Seu nome completo era Leonardo di Ser Piero d'Antonio di Ser Piero di Ser Guido da Vinci, e ele era o filho natural e primogênito de Ser Piero, um tabelião rural [Data: Entities (0)]. As contribuições de Leonardo abrangeram vários campos, incluindo arte, ciência, engenharia e filosofia, rendendo-lhe o título de o Gênio mais Universal dos tempos cristãos [Data: Entities (8)].
## Primeiros Anos e Formação
A promessa precoce de Leonardo foi reconhecida por seu pai, que levou alguns de seus desenhos a Andrea del Verrocchio, um renomado artista e escultor. Impressionado com o talento de Leonardo, Verrocchio o aceitou em sua oficina por volta de 1469-1470. Ali, Leonardo conheceu outros artistas notáveis, incluindo Botticelli e Lorenzo di Credi [Data: Sources (6, 7)]. Em 1472, Leonardo foi admitido na Guilda dos Pintores Florentinos, marcando o início de sua carreira profissional [Data: Sources (7)].
## Obras-Primas Artísticas
Leonardo talvez seja mais conhecido por suas pinturas icônicas, como a "Mona Lisa" e "A Última Ceia." A "Mona Lisa," renomada por sua expressão sutil e fundo detalhado, está abrigada no Louvre e continua sendo uma das obras de arte mais famosas do mundo [Data: Relationships (0, 45)]. "A Última Ceia," um afresco que retrata o momento em que Jesus anunciou que um de seus discípulos o trairia, está localizada no refeitório de Santa Maria delle Grazie, em Milão [Data: Sources (2)]. Outras obras significativas incluem "A Virgem dos Rochedos" e o "Tratado da Pintura," que ele começou por volta de 1489-1490 [Data: Relationships (7, 12)].
## Contribuições Científicas e de Engenharia
O gênio de Leonardo se estendeu além da arte a vários empreendimentos científicos e de engenharia. Ele fez observações significativas em anatomia, óptica e hidráulica, e seus cadernos estão repletos de esboços e ideias que anteciparam muitas invenções modernas. Por exemplo, ele antecipou a teoria de Copérnico sobre o movimento da Terra e a classificação dos animais de Lamarck [Data: Relationships (38, 39)]. Seu trabalho sobre as leis da luz e da sombra e seu domínio do chiaroscuro tiveram um impacto profundo tanto na arte quanto na ciência [Data: Sources (45)].
## Mecenato e Relações Profissionais
A carreira de Leonardo foi significativamente influenciada por seus mecenas. Ludovico Sforza, o Duque de Milão, empregou Leonardo como pintor da corte e artífice geral, encomendando várias obras e até lhe presenteando com um vinhedo em 1499 [Data: Relationships (9, 19, 84)]. Em seus últimos anos, Leonardo mudou-se para a França sob o mecenato do rei Francisco I, que lhe concedeu uma renda principesca e o tinha em alta consideração [Data: Relationships (114, 37)]. Leonardo passou seus últimos anos na Mansão de Cloux, perto de Amboise, onde era frequentemente visitado pelo rei e apoiado por seu amigo próximo e assistente, Francesco Melzi [Data: Relationships (28, 122)].
## Legado e Influência
A influência de Leonardo da Vinci se estendeu muito além de sua vida. Ele fundou uma Escola de pintura em Milão, e suas técnicas e ensinamentos foram levados adiante por seus alunos e seguidores, como Giovanni Ambrogio da Predis e Francesco Melzi [Data: Relationships (6, 15, 28)]. Suas obras continuam a ser celebradas e estudadas, consolidando seu legado como um dos maiores mestres do Renascimento. A capacidade de Leonardo de combinar arte e ciência deixou uma marca indelével em ambos os campos, inspirando incontáveis gerações de artistas e cientistas [Data: Entities (148, 86); Relationships (27, 12)].
Em resumo, as contribuições incomparáveis de Leonardo da Vinci para a arte, a ciência e a engenharia, combinadas com seu pensamento inovador e profunda influência sobre seus contemporâneos e as gerações futuras, fazem dele uma figura imponente na história das realizações humanas. Seu legado continua a inspirar admiração e estudo, ressaltando a relevância atemporal de seu gênio.
Os resultados do GraphRAG são específicos, com fontes de dados citadas claramente marcadas.
Geração de Perguntas
O GraphRAG também pode gerar perguntas com base em consultas históricas, o que é útil para criar perguntas recomendadas em um diálogo de chatbot. Este método combina dados estruturados do grafo de conhecimento com dados não estruturados de documentos de entrada para produzir perguntas candidatas relacionadas a entidades específicas.
question_generator = LocalQuestionGen(
llm=llm,
context_builder=context_builder,
token_encoder=token_encoder,
llm_params=llm_params,
context_builder_params=local_context_params,
)
question_history = [
"Tell me about Leonardo Da Vinci",
"Leonardo's early works",
]
Gere perguntas com base no histórico.
candidate_questions = await question_generator.agenerate(
question_history=question_history, context_data=None, question_count=5
)
candidate_questions.response
["- What were some of Leonardo da Vinci's early works and where are they housed?",
"- How did Leonardo da Vinci's relationship with Andrea del Verrocchio influence his early works?",
'- What notable projects did Leonardo da Vinci undertake during his time in Milan?',
"- How did Leonardo da Vinci's engineering skills contribute to his projects?",
"- What was the significance of Leonardo da Vinci's relationship with Francis I of France?"]
Você pode remover a raiz do índice se quiser excluir o índice para economizar espaço.
# import shutil
#
# shutil.rmtree(index_root)
Resumo
Neste blog, exploramos o GraphRAG, um método inovador que aprimora a tecnologia RAG ao integrar grafos de conhecimento. O GraphRAG é ideal para lidar com tarefas complexas, como raciocínio multi-hop, e responder a perguntas abrangentes que exigem a conexão de partes díspares de informações.
Quando combinado com o banco de dados vetorial Milvus, o GraphRAG pode navegar por relações semânticas complexas em grandes conjuntos de dados, fornecendo resultados mais precisos e perspicazes. Essa combinação poderosa torna o GraphRAG um recurso inestimável para várias aplicações práticas de GenAI, fornecendo uma solução robusta para compreender e processar informações complexas.
Recursos Adicionais
O artigo do GraphRAG: Do Local ao Global: Uma Abordagem Graph RAG para Sumarização Focada em Consultas
GitHub do GraphRAG: https://github.com/microsoft/graphrag
Outras técnicas de aprimoramento de RAG:
Continue lendo

From Vector Database to Vector Lakebase
Zilliz offers a fully managed Vector Lakebase powered by Milvus, unifying real-time vector search, lake-scale discovery, and Al data operations.

Vector Databases vs. Time Series Databases
Use a vector database for similarity search and semantic relationships; use a time series database for tracking value changes over time.

AI Integration in Video Surveillance Tools: Transforming the Industry with Vector Databases
Discover how AI and vector databases are revolutionizing video surveillance with real-time analysis, faster threat detection, and intelligent search capabilities for enhanced security.



