Génération augmentée par récupération avec citations
Lorsque vous obtenez des réponses de vos applications de grands modèles de langage (LLM), voulez-vous savoir d’où vient cette réponse ? C’est le pouvoir des citations ou des attributions. Dans ce tutoriel, nous verrons pourquoi il est important d’inclure des citations, comment vous pouvez obtenir des citations à un niveau général, puis nous plongerons dans un exemple de code !
Pourquoi citer vos sources de Retrieval Augmented Generation (RAG) ?
La Retrieval Augmented Generation est une technique utilisée avec les applications LLM pour compléter leurs connaissances. L’une des principales faiblesses des LLM en général est leur manque de connaissances soit à jour, soit spécifiques à un domaine. Il existe deux solutions principales à cela : le fine-tuning et la génération augmentée par récupération.
Ici, chez Zilliz, et dans d’autres entreprises comme OpenAI, nous proposons RAG comme l’option supérieure au fine-tuning pour la récupération fondée sur des faits. Le fine-tuning est plus coûteux et nécessite beaucoup plus de données ; toutefois, c’est une bonne option pour le transfert de style. RAG utilise une base de données vectorielle telle que Milvus pour injecter vos connaissances dans votre application.
Au lieu d’interroger le LLM sur votre produit ou votre documentation, vous pouvez utiliser une base de données vectorielle comme votre source de vérité. Cela garantit que votre application renvoie les bonnes connaissances et n’hallucine pas pour tenter de compenser le manque de données. À mesure que vous commencez à ajouter davantage de documents et de cas d’utilisation, il devient de plus en plus important de savoir où se trouve cette information.
C’est là que les citations et les attributions entrent en jeu. Lorsque vous obtenez une réponse de votre application LLM, vous voulez savoir comment elle a obtenu cette information. Le fait de recevoir des réponses avec des citations ou des attributions vous montre quel morceau de texte/d’où dans le texte provient votre réponse. À mesure que nous disposons de plus en plus de données, cela devient essentiel pour déterminer les réponses fiables.
Comment pouvez-vous citer vos sources RAG ?
Les LLM ont renforcé la popularité d’outils adjacents, tels que les bases de données vectorielles comme Milvus. Cela a également donné naissance à des frameworks tels que LangChain et LlamaIndex. Dans le cadre de cette montée en popularité, la génération augmentée par récupération est devenue une application essentielle, en particulier lorsqu’il s’agit de récupération d’informations sur vos données internes.
En plus de récupérer des données, de nombreuses personnes ont compris qu’ajouter des citations à vos données récupérées rend votre application plus robuste, plus explicable et fournit davantage de contexte. Alors, comment faire cela ? Il existe de nombreuses façons de le faire. Vous pouvez stocker les morceaux de texte dans votre base de données vectorielle si elle prend en charge les métadonnées comme Milvus, ou vous pouvez utiliser un framework comme LlamaIndex. Ce tutoriel expliquera comment faire du RAG avec des citations en utilisant LlamaIndex et Milvus.
Exemple de Retrieval Augmented Generation avec sources
Plongeons dans le code. Pour suivre ce tutoriel, vous devez faire pip install milvus llama-index python-dotenv. Les bibliothèques milvus et llama-index servent aux fonctionnalités principales, tandis que python-dotenv sert à charger vos variables d’environnement, comme votre clé API OpenAI. Dans cet exemple, nous extrayons des données sur différentes villes depuis Wikipedia et effectuons une requête avec citations dessus.
Nous importons quelques bibliothèques nécessaires et chargeons notre clé API OpenAI. Nous avons besoin de sept sous-modules de LlamaIndex. Sans ordre particulier : OpenAI pour accéder à un LLM, CitationQueryEngine pour créer le moteur de requête de citations, et MilvusVectorStore pour utiliser Milvus comme magasin vectoriel. En outre, nous importons également VectorStoreIndex pour utiliser Milvus, SimpleDirectoryReader pour lire des données locales, et StorageContext et ServiceContext pour donner à l’index vectoriel accès à Milvus. Enfin, nous utilisons load_dotenv pour charger notre clé API OpenAI.
from llama_index.llms import OpenAI
from llama_index.query_engine import CitationQueryEngine
from llama_index import (
VectorStoreIndex,
SimpleDirectoryReader,
StorageContext,
ServiceContext,
)
from llama_index.vector_stores import MilvusVectorStore
from milvus import default_server
from dotenv import load_dotenv
import os
load_dotenv()
open_api_key = os.getenv("OPENAI_API_KEY")
Récupération de quelques données de test
Commençons notre projet en ayant d’abord quelques données avec lesquelles travailler. Pour cet exemple, nous récupérons quelques données depuis Wikipédia. En réalité, nous récupérons les mêmes données que celles que nous avons utilisées pour construire un moteur de requête multi-document. Le code ci-dessous interroge l’API de Wikipédia pour les pages mentionnées dans la liste wiki_titles. Il enregistre le résultat localement dans un fichier texte.
wiki_titles = ["Toronto", "Seattle", "San Francisco", "Chicago", "Boston", "Washington, D.C.", "Cambridge, Massachusetts", "Houston"]
from pathlib import Path
import requests
for title in wiki_titles:
response = requests.get(
'https://en.wikipedia.org/w/api.php',
params={
'action': 'query',
'format': 'json',
'titles': title,
'prop': 'extracts',
'explaintext': True,
}
).json()
page = next(iter(response['query']['pages'].values()))
wiki_text = page['extract']
data_path = Path('data')
if not data_path.exists():
Path.mkdir(data_path)
with open(data_path / f"{title}.txt", 'w') as fp:
fp.write(wiki_text)
Configuration de votre vector store dans LlamaIndex
Maintenant que nous avons toutes nos données, nous pouvons configurer la logique de l’application pour notre application RAG avec citations. Pour commencer, la première chose que nous devons faire est de lancer une base de données vectorielle. Dans cet exemple, nous utilisons Milvus Lite pour l’exécuter directement dans notre notebook. Ensuite, nous utilisons le module MilvusVectorStore de LlamaIndex pour nous connecter à Milvus en tant que vector store.
default_server.start()
vector_store = MilvusVectorStore(
collection_name="citations",
host="127.0.0.1",
port=default_server.listen_port
)
Ensuite, créons les contextes pour notre index. Le contexte de service indique à l’index et au retriever quels services utiliser. Dans ce cas, il transmet GPT 3.5 Turbo comme LLM souhaité. Nous créons également un contexte de stockage afin que l’index sache où stocker et interroger les données. Dans ce cas, nous transmettons l’objet vector store Milvus que nous avons créé ci-dessus.
service_context = ServiceContext.from_defaults(
llm=OpenAI(model="gpt-3.5-turbo", temperature=0)
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
Une fois tout cela configuré, nous pouvons charger les données que nous avons récupérées précédemment et créer un index de vector store à partir de ces documents.
documents = SimpleDirectoryReader("./data/").load_data()
index = VectorStoreIndex.from_documents(documents, service_context=service_context, storage_context=storage_context)
Requêtes avec citations
Nous pouvons maintenant créer un moteur de requête avec citations. Nous lui fournissons l’index vectoriel que nous avons construit précédemment ainsi que des paramètres sur le nombre de résultats à renvoyer et la taille des segments de citation. C’est tout ce qu’il faut pour configurer les citations, et l’étape suivante consiste à interroger le moteur.
query_engine = CitationQueryEngine.from_args(
index,
similarity_top_k=3,
# here we can control how granular citation sources are, the default is 512
citation_chunk_size=512,
)
response = query_engine.query("Does Seattle or Houston have a bigger airport?")
print(response)
for source in response.source_nodes:
print(source.node.get_text())
Lorsque nous effectuons une requête, la réponse ressemble à ceci.
Requêtes avec citations
Résumé
Dans ce tutoriel, nous avons appris à réaliser une génération augmentée par récupération avec des citations (attributions). La génération augmentée par récupération est un type d’application LLM que de nombreuses entreprises souhaitent créer. En plus de récupérer et de mettre en forme vos informations dans un format facile à assimiler, nous voulons également savoir d’où proviennent les informations.
Nous pouvons créer ce type d’application RAG en utilisant LlamaIndex comme routeur de données et Milvus comme base vectorielle. Nous avons commencé par extraire certaines données de Wikipédia afin de montrer comment cela fonctionne. Ensuite, nous lançons une instance de Milvus et créons une instance de base vectorielle dans LlamaIndex. À partir de là, nous plaçons nos données dans Milvus et avons utilisé LlamaIndex pour suivre les attributions et les citations à l’aide d’un moteur de requêtes de citations. Nous pouvons ensuite interroger ce moteur de requêtes et obtenir des réponses, y compris l’endroit dans le texte et le texte dont nous tirons notre réponse.
Continuer à lire

Why We Built Vector Lakebase: Rethinking Unstructured Data Architecture for AI
Vector Lakebase: a unified, lake-native data foundation for AI workloads — and an answer to what happens after vector databases succeed.

Zilliz Cloud Enterprise Vector Search Powers High-Performance AI on AWS
Zilliz Cloud on AWS powers secure, scalable, ultra-fast vector search for enterprise AI apps, with BYOC, sub-10ms latency, and zero-DevOps simplicity.

Vector Databases vs. Object-Relational Databases
Use a vector database for AI-powered similarity search; use an object-relational database for complex data modeling with both relational integrity and object-oriented features.



