Generazione aumentata dal recupero con citazioni
Quando ricevi risposte dalle tue app basate su large language model (LLM), vuoi sapere da dove proviene quella risposta? Questo è il potere delle citazioni o attribuzioni. In questo tutorial, vedremo perché è importante includere citazioni, come puoi ottenere citazioni a un livello alto, e poi ci immergeremo in un esempio di codice!
Perché citare le tue fonti di Retrieval Augmented Generation (RAG)?
Retrieval Augmented Generation è una tecnica utilizzata con le app LLM per integrare la loro conoscenza. Una delle principali debolezze degli LLM in generale è la loro mancanza di conoscenze aggiornate o specifiche di dominio. Esistono due soluzioni principali a questo: fine-tuning e retrieval augmented generation.
Qui in Zilliz e in altre aziende come OpenAI, proponiamo RAG come opzione superiore al fine-tuning per il recupero basato sui fatti. Il fine-tuning è più costoso e richiede molti più dati; tuttavia, è una buona opzione per lo style-transfer. RAG utilizza un vector database come Milvus per iniettare la tua conoscenza nella tua app.
Invece di chiedere all’LLM informazioni sul tuo prodotto o sulla tua documentazione, puoi usare un vector database come archivio della verità. Questo garantisce che la tua app restituisca la conoscenza corretta e non abbia allucinazioni nel tentativo di compensare la mancanza di dati. Man mano che inizi ad aggiungere più documenti e casi d’uso, diventa sempre più importante sapere dove si trova quell’informazione.
È qui che entrano in gioco citazioni e attribuzioni. Quando ricevi una risposta dalla tua app LLM, vuoi sapere come ha ottenuto quell’informazione. Ricevere risposte con citazioni o attribuzioni ti mostra quale pezzo di testo/ dove nel testo proviene la tua risposta. Man mano che abbiamo sempre più dati, questo diventa fondamentale per determinare risposte affidabili.
Come puoi citare le tue fonti RAG?
Gli LLM hanno aumentato la popolarità di strumenti adiacenti, come i vector database tipo Milvus. Hanno anche dato impulso a framework come LangChain e LlamaIndex. Nell’ambito di questa crescita di popolarità, la retrieval augmented generation è diventata un’app essenziale, soprattutto quando si tratta di recupero di informazioni sui tuoi dati interni.
Oltre a recuperare dati, molte persone hanno capito che aggiungere citazioni ai dati recuperati rende la tua app più robusta, più spiegabile e fornisce più contesto. Quindi, come si fa? Ci sono molti modi per farlo. Puoi memorizzare i frammenti di testo all’interno del tuo vector database se supporta metadati come Milvus, oppure puoi usare un framework come LlamaIndex. Questo tutorial spiegherà come fare RAG con citazioni usando LlamaIndex e Milvus.
Esempio di Retrieval Augmented Generation con fonti
Immergiamoci nel codice. Per seguire questo tutorial, devi eseguire pip install milvus llama-index python-dotenv. Le librerie milvus e llama-index sono per la funzionalità principale, mentre python-dotenv serve per caricare le tue variabili d’ambiente come la tua chiave API OpenAI. In questo esempio, estraiamo alcuni dati su diverse città da Wikipedia e facciamo una query con citazioni su quei dati.
Importiamo alcune librerie necessarie e carichiamo la nostra chiave API OpenAI. Abbiamo bisogno di sette sottomoduli da LlamaIndex. In nessun ordine particolare: OpenAI per accedere a un LLM, CitationQueryEngine per creare il motore di query con citazioni, e MilvusVectorStore per usare Milvus come vector store. Inoltre, importiamo anche VectorStoreIndex per usare Milvus, SimpleDirectoryReader per leggere dati locali, e StorageContext e ServiceContext per dare all’indice vettoriale accesso a Milvus. Infine, usiamo load_dotenv per caricare la nostra chiave 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")
Recuperare alcuni dati di test tramite scraping
Iniziamo il nostro progetto avendo prima alcuni dati con cui lavorare. Per questo esempio, recuperiamo alcuni dati da Wikipedia tramite scraping. In realtà, stiamo recuperando tramite scraping gli stessi dati che abbiamo usato per creare un motore di query multi-documento. Il codice qui sotto interroga l’API di Wikipedia per le pagine menzionate nell’elenco wiki_titles. Salva il risultato localmente in un file di testo.
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)
Configurare il tuo vector store in LlamaIndex
Ora che abbiamo tutti i nostri dati, possiamo configurare la logica dell’app per la nostra app RAG con citazioni. Per iniziare, la prima cosa che dobbiamo fare è avviare un database vettoriale. In questo esempio, utilizziamo Milvus Lite per eseguirlo direttamente nel nostro notebook. Poi usiamo il modulo MilvusVectorStore di LlamaIndex per connetterci a Milvus come nostro vector store.
default_server.start()
vector_store = MilvusVectorStore(
collection_name="citations",
host="127.0.0.1",
port=default_server.listen_port
)
Successivamente, creiamo i contesti per il nostro indice. Il contesto di servizio indica all’indice e al retriever quali servizi utilizzare. In questo caso, passa GPT 3.5 Turbo come LLM desiderato. Creiamo anche un contesto di archiviazione in modo che l’indice sappia dove archiviare e interrogare i dati. In questo caso, passiamo l’oggetto vector store Milvus che abbiamo creato sopra.
service_context = ServiceContext.from_defaults(
llm=OpenAI(model="gpt-3.5-turbo", temperature=0)
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
Con tutto questo configurato, possiamo caricare i dati che abbiamo recuperato tramite scraping in precedenza e creare un indice vector store da quei documenti.
documents = SimpleDirectoryReader("./data/").load_data()
index = VectorStoreIndex.from_documents(documents, service_context=service_context, storage_context=storage_context)
Eseguire query con citazioni
Ora possiamo creare un Citation Query Engine. Gli forniamo l’indice vettoriale che abbiamo creato in precedenza e i parametri relativi a quanti risultati restituire e alla dimensione del chunk della citazione. Questo è tutto ciò che serve per configurare la citazione, e il passo successivo è interrogare il motore.
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())
Quando eseguiamo la query, la risposta appare più o meno così.
Eseguire query con citazioni
Riepilogo
In questo tutorial, abbiamo imparato come eseguire la retrieval augmented generation con citazioni (attribuzioni). La retrieval augmented generation è un tipo di applicazione LLM che molte aziende vogliono creare. Oltre a recuperare e formattare le informazioni in un formato digeribile, vogliamo anche sapere da dove provengono le informazioni.
Possiamo creare questo tipo di applicazione RAG usando LlamaIndex come nostro data router e Milvus come nostro vector store. Abbiamo iniziato estraendo alcuni dati da Wikipedia per mostrare come funziona. Poi, avviamo un'istanza di Milvus e creiamo un'istanza di vector store in LlamaIndex. Da lì, inseriamo i nostri dati in Milvus e abbiamo usato LlamaIndex per tenere traccia delle attribuzioni e delle citazioni usando un citation query engine. Possiamo quindi interrogare quel query engine e ottenere risposte, incluso il punto nel testo e quale testo da cui stiamo traendo la nostra risposta.
Continua a leggere

Why and How to Migrate from Self-Hosted Milvus to Zilliz Cloud
A simple, step-by-step guide to migrating from Milvus to Zilliz Cloud. Learn both endpoint and backup methods for a smooth, scalable vector database migration.

Zilliz Cloud Introduces Advanced BYOC-I Solution for Ultimate Enterprise Data Sovereignty
Explore Zilliz Cloud BYOC-I, the solution that balances AI innovation with data control, enabling secure deployments in finance, healthcare, and education sectors.

Bringing AI to Legal Tech: The Role of Vector Databases in Enhancing LLM Guardrails
Discover how vector databases enhance AI reliability in legal tech, ensuring accurate, compliant, and trustworthy AI-powered legal solutions.



