Iniziare a utilizzare il recupero semantico

Visualizza su ai.google.dev Provare un notebook di Colab Visualizza blocco note su GitHub

Panoramica

I modelli linguistici di grandi dimensioni (LLM) possono apprendere nuove capacità senza essere addestrati direttamente su di esse. Tuttavia, è noto che gli LLM "allucinano" quando devono fornire risposte a domande per le quali non sono stati addestrati. Questo accade in parte perché gli LLM non sono a conoscenza degli eventi dopo l'addestramento. È inoltre molto difficile risalire alle fonti da cui gli LLM ricavano le loro risposte. Per applicazioni affidabili e scalabili, è importante che un LLM fornisca risposte basate su fatti e sia in grado di citare le sue fonti di informazioni.

Un approccio comune utilizzato per superare questi vincoli è chiamato Retrieval Augmented Generation (RAG), che aumenta il prompt inviato a un LLM con dati pertinenti recuperati da una knowledge base esterna attraverso un meccanismo di recupero delle informazioni (IR). La knowledge base può essere costituita dai tuoi corpora di documenti, database o API.

Questo notebook illustra un flusso di lavoro per migliorare la risposta di un LLM aumentando le sue conoscenze con corpora di testo esterni ed eseguendo il recupero di informazioni semantiche per rispondere alle domande utilizzando Semantic Retriever e le API Attributed Question & Answering (AQA) dell'API Generative Language.

Configurazione

Importa l'API Generative Language

# Install the Client library (Semantic Retriever is only supported for versions >0.4.0)
pip install -U google.ai.generativelanguage

Autentica

L'API Semantic Retriever ti consente di eseguire ricerche semantiche sui tuoi dati. Poiché si tratta dei tuoi dati, questo richiede controlli di accesso più rigidi rispetto alle chiavi API. Esegui l'autenticazione con OAuth con account di servizio o tramite le tue credenziali utente.

Questa guida rapida utilizza un approccio di autenticazione semplificato pensato per un ambiente di test e le configurazioni degli account di servizio sono in genere più facili da iniziare. Per un ambiente di produzione, scopri di più su autenticazione e autorizzazione prima di scegliere le credenziali di accesso appropriate per la tua app.

Configurare OAuth utilizzando gli account di servizio

Per configurare OAuth utilizzando gli account di servizio, segui questi passaggi:

  1. Attiva l'API Generative Language.

  1. Crea l'account di servizio seguendo la documentazione.

    • Dopo aver creato l'account di servizio, genera una chiave dell'account di servizio.

  1. Carica il file dell'account di servizio utilizzando l'icona del file nella barra laterale sinistra, quindi l'icona di caricamento, come mostrato nello screenshot seguente.

    • Rinomina il file caricato in service_account_key.json o modifica la variabile service_account_file_name nel codice seguente.

pip install -U google-auth-oauthlib
service_account_file_name = 'service_account_key.json'

from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file(service_account_file_name)

scoped_credentials = credentials.with_scopes(
    ['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/generative-language.retriever'])

Inizializza la libreria client utilizzando le credenziali dell'account di servizio.

import google.ai.generativelanguage as glm
generative_service_client = glm.GenerativeServiceClient(credentials=scoped_credentials)
retriever_service_client = glm.RetrieverServiceClient(credentials=scoped_credentials)
permission_service_client = glm.PermissionServiceClient(credentials=scoped_credentials)

Crea un corpus

L'API Semantic Retriever ti consente di definire fino a 5 corpora di testo personalizzati per progetto. Durante la definizione dei corpora, puoi specificare uno dei seguenti campi:

  • name: il nome (ID) della risorsa Corpus. Deve contenere al massimo 40 caratteri alfanumerici. Se name è vuoto al momento della creazione, verrà generato un nome univoco con una lunghezza massima di 40 caratteri con un prefisso da display_name e un suffisso casuale di 12 caratteri.
  • display_name: il nome visualizzato leggibile per il Corpus. Deve contenere un massimo di 512 caratteri, inclusi alfanumerici, spazi e trattini.
example_corpus = glm.Corpus(display_name="Google for Developers Blog")
create_corpus_request = glm.CreateCorpusRequest(corpus=example_corpus)

# Make the request
create_corpus_response = retriever_service_client.create_corpus(create_corpus_request)

# Set the `corpus_resource_name` for subsequent sections.
corpus_resource_name = create_corpus_response.name
print(create_corpus_response)
name: "corpora/google-for-developers-blog-dqrtz8rs0jg"
display_name: "Google for Developers Blog"
create_time {
  seconds: 1713497533
  nanos: 587977000
}
update_time {
  seconds: 1713497533
  nanos: 587977000
}

Ottenere il corpus creato

Utilizza il metodo GetCorpusRequest per accedere in modo programmatico al Corpus che hai creato sopra. Il valore del parametro name fa riferimento al nome completo della risorsa di Corpus ed è impostato nella cella sopra come corpus_resource_name. Il formato previsto è corpora/corpus-123.

get_corpus_request = glm.GetCorpusRequest(name=corpus_resource_name)

# Make the request
get_corpus_response = retriever_service_client.get_corpus(get_corpus_request)

# Print the response
print(get_corpus_response)

Crea un documento

Un elemento Corpus può contenere fino a 10.000 Document. Durante la definizione dei documenti, puoi specificare uno dei seguenti campi:

  • name: il nome (ID) della risorsa Document. Deve contenere un massimo di 40 caratteri (solo alfanumerici o trattini). L'ID non può iniziare o terminare con un trattino. Se il nome è vuoto al momento della creazione, verrà ricavato un nome univoco dadisplay_name insieme a un suffisso casuale di 12 caratteri.
  • display_name: il nome visualizzato leggibile. Deve contenere un massimo di 512 caratteri, inclusi alfanumerici, spazi e trattini.

I Document supportano anche fino a 20 campi custom_metadata specificati dall'utente, specificati come coppie chiave-valore. I metadati personalizzati possono essere stringhe, elenchi di stringhe o numerici. Tieni presente che gli elenchi di stringhe possono supportare un massimo di 10 valori e che i valori numerici sono rappresentati come numeri in virgola mobile nell'API.

# Create a document with a custom display name.
example_document = glm.Document(display_name="Introducing Project IDX, An Experiment to Improve Full-stack, Multiplatform App Development")

# Add metadata.
# Metadata also supports numeric values not specified here
document_metadata = [
    glm.CustomMetadata(key="url", string_value="https://developers.googleblog.com/2023/08/introducing-project-idx-experiment-to-improve-full-stack-multiplatform-app-development.html")]
example_document.custom_metadata.extend(document_metadata)

# Make the request
# corpus_resource_name is a variable set in the "Create a corpus" section.
create_document_request = glm.CreateDocumentRequest(parent=corpus_resource_name, document=example_document)
create_document_response = retriever_service_client.create_document(create_document_request)

# Set the `document_resource_name` for subsequent sections.
document_resource_name = create_document_response.name
print(create_document_response)

Recuperare il documento creato

Utilizza il metodo GetDocumentRequest per accedere tramite programmazione al documento creato sopra. Il valore del parametro name fa riferimento al nome completo della risorsa del documento ed è impostato nella cella sopra come document_resource_name. Il formato previsto è corpora/corpus-123/documents/document-123.

get_document_request = glm.GetDocumentRequest(name=document_resource_name)

# Make the request
# document_resource_name is a variable set in the "Create a document" section.
get_document_response = retriever_service_client.get_document(get_document_request)

# Print the response
print(get_document_response)

Importare e suddividere un documento

Per migliorare la pertinenza dei contenuti restituiti dal database di vettori durante il recupero semantico, suddividi i documenti di grandi dimensioni in pezzi più piccoli o chunk durante l'importazione.

Un Chunk è una sottoparte di un Document trattata come unità indipendente ai fini della rappresentazione e dell'archiviazione dei vettori. Un Chunk può contenere un massimo di 2043 token. Un Corpus può avere al massimo 1 milione di Chunk.

Come per i Document, anche i Chunks supportano fino a 20 campi custom_metadata specificati dall'utente, specificati come coppie chiave-valore. I metadati personalizzati possono essere stringhe, elenchi di stringhe o numerici. Tieni presente che gli elenchi di stringhe possono supportare un massimo di 10 valori e che i valori numerici sono rappresentati come numeri in virgola mobile nell'API.

Questa guida utilizza HtmlChunker open source di Google.

Altri chunker che puoi utilizzare sono LangChain o LlamaIndex.

Importa HTML e suddividi in blocchi tramite HtmlChunker

!pip install google-labs-html-chunker

from google_labs_html_chunker.html_chunker import HtmlChunker

from urllib.request import urlopen

Ottieni il DOM HTML di un sito web. In questo caso, il codice HTML viene letto direttamente, ma sarebbe meglio ottenere il codice HTML post-rendering che includa il codice HTML con codice JavaScript inserito, come document.documentElement.innerHTML.

with(urlopen("https://developers.googleblog.com/2023/08/introducing-project-idx-experiment-to-improve-full-stack-multiplatform-app-development.html")) as f:
  html = f.read().decode("utf-8")

Suddividi il documento di testo in passaggi e crea Chunk da questi passaggi. Questo passaggio crea gli oggetti Chunk stessi e la sezione successiva li carica nell'API Semantic Retriever.

# Chunk the file using HtmlChunker
chunker = HtmlChunker(
    max_words_per_aggregate_passage=200,
    greedily_aggregate_sibling_nodes=True,
    html_tags_to_exclude={"noscript", "script", "style"},
)
passages = chunker.chunk(html)
print(passages)


# Create `Chunk` entities.
chunks = []
for passage in passages:
    chunk = glm.Chunk(data={'string_value': passage})
    # Optionally, you can add metadata to a chunk
    chunk.custom_metadata.append(glm.CustomMetadata(key="tags",
                                                    string_list_value=glm.StringList(
                                                        values=["Google For Developers", "Project IDX", "Blog", "Announcement"])))
    chunk.custom_metadata.append(glm.CustomMetadata(key="chunking_strategy",
                                                    string_value="greedily_aggregate_sibling_nodes"))
    chunk.custom_metadata.append(glm.CustomMetadata(key = "publish_date",
                                                    numeric_value = 20230808))
    chunks.append(chunk)
print(chunks)

Creare batch di chunk

Creare chunk in batch. Puoi specificare un massimo di 100 chunk per richiesta batch.

Utilizza CreateChunk() per la creazione di un singolo chunk.

# Option 1: Use HtmlChunker in the section above.
# `chunks` is the variable set from the section above.
create_chunk_requests = []
for chunk in chunks:
  create_chunk_requests.append(glm.CreateChunkRequest(parent=document_resource_name, chunk=chunk))

# Make the request
request = glm.BatchCreateChunksRequest(parent=document_resource_name, requests=create_chunk_requests)
response = retriever_service_client.batch_create_chunks(request)
print(response)

In alternativa, puoi creare chunk senza utilizzare HtmlChunker.

# Add up to 100 CreateChunk requests per batch request.
# document_resource_name is a variable set in the "Create a document" section.
chunks = []
chunk_1 = glm.Chunk(data={'string_value': "Chunks support user specified metadata."})
chunk_1.custom_metadata.append(glm.CustomMetadata(key="section",
                                                  string_value="Custom metadata filters"))
chunk_2 = glm.Chunk(data={'string_value': "The maximum number of metadata supported is 20"})
chunk_2.custom_metadata.append(glm.CustomMetadata(key = "num_keys",
                                                  numeric_value = 20))
chunks = [chunk_1, chunk_2]
create_chunk_requests = []
for chunk in chunks:
  create_chunk_requests.append(glm.CreateChunkRequest(parent=document_resource_name, chunk=chunk))

# Make the request
request = glm.BatchCreateChunksRequest(parent=document_resource_name, requests=create_chunk_requests)
response = retriever_service_client.batch_create_chunks(request)
print(response)

Elenca Chunk e recupera lo stato

Utilizza il metodo ListChunksRequest per ottenere tutti i Chunk disponibili come elenco impaginato, con un limite di dimensioni massimo di 100 Chunk per pagina, in ordine crescente di Chunk.create_time. Se non specifichi un limite, vengono restituiti un massimo di 10 Chunk.

Fornisci il valore next_page_token restituito nella risposta ListChunksRequest come argomento alla richiesta successiva per recuperare la pagina successiva. Tieni presente che, durante la paginazione, tutti gli altri parametri forniti a ListChunks devono corrispondere alla chiamata che ha fornito il token pagina.

Tutti i valori Chunk restituiscono state. Utilizzalo per controllare lo stato del Chunks prima di eseguire una query su un Corpus. Gli stati Chunk includono UNSPECIFIED, PENDING_PROCESSING, ACTIVE e FAILED. Puoi eseguire query solo su ACTIVE Chunk.

# Make the request
request = glm.ListChunksRequest(parent=document_resource_name)
list_chunks_response = retriever_service_client.list_chunks(request)
for index, chunks in enumerate(list_chunks_response.chunks):
  print(f'\nChunk # {index + 1}')
  print(f'Resource Name: {chunks.name}')
  # Only ACTIVE chunks can be queried.
  print(f'State: {glm.Chunk.State(chunks.state).name}')

Importa un altro documento

Aggiungi un altro Document tramite HtmlChunker e aggiungi filtri.

# Create a document with a custom display name.
example_document = glm.Document(display_name="How it’s Made: Interacting with Gemini through multimodal prompting")

# Add document metadata.
# Metadata also supports numeric values not specified here
document_metadata = [
    glm.CustomMetadata(key="url", string_value="https://developers.googleblog.com/2023/12/how-its-made-gemini-multimodal-prompting.html")]
example_document.custom_metadata.extend(document_metadata)

# Make the CreateDocument request
# corpus_resource_name is a variable set in the "Create a corpus" section.
create_document_request = glm.CreateDocumentRequest(parent=corpus_resource_name, document=example_document)
create_document_response = retriever_service_client.create_document(create_document_request)

# Set the `document_resource_name` for subsequent sections.
document_resource_name = create_document_response.name
print(create_document_response)

# Chunks - add another webpage from Google for Developers
with(urlopen("https://developers.googleblog.com/2023/12/how-its-made-gemini-multimodal-prompting.html")) as f:
  html = f.read().decode("utf-8")

# Chunk the file using HtmlChunker
chunker = HtmlChunker(
    max_words_per_aggregate_passage=100,
    greedily_aggregate_sibling_nodes=False,
)
passages = chunker.chunk(html)

# Create `Chunk` entities.
chunks = []
for passage in passages:
    chunk = glm.Chunk(data={'string_value': passage})
    chunk.custom_metadata.append(glm.CustomMetadata(key="tags",
                                                    string_list_value=glm.StringList(
                                                        values=["Google For Developers", "Gemini API", "Blog", "Announcement"])))
    chunk.custom_metadata.append(glm.CustomMetadata(key="chunking_strategy",
                                                    string_value="no_aggregate_sibling_nodes"))
    chunk.custom_metadata.append(glm.CustomMetadata(key = "publish_date",
                                                    numeric_value = 20231206))
    chunks.append(chunk)

# Make the request
create_chunk_requests = []
for chunk in chunks:
  create_chunk_requests.append(glm.CreateChunkRequest(parent=document_resource_name, chunk=chunk))
request = glm.BatchCreateChunksRequest(parent=document_resource_name, requests=create_chunk_requests)
response = retriever_service_client.batch_create_chunks(request)
print(response)

Esegui una query sul corpus

Utilizza il metodo QueryCorpusRequest per eseguire una ricerca semantica e ottenere passaggi pertinenti.

  • results_count: specifica il numero di passaggi da restituire. Il valore massimo è 100. Se non specificato, l'API restituisce un massimo di 10 Chunk.
  • metadata_filters: filtra per chunk_metadata o document_metadata. Ogni MetadataFilter deve corrispondere a una chiave univoca. Più oggetti MetadataFilter sono uniti da AND logici. Le condizioni di filtro dei metadati simili sono unite da OR logici. Ecco alcuni esempi:
(year >= 2020 OR year < 2010) AND (genre = drama OR genre = action)

metadata_filter = [
  {
    key = "document.custom_metadata.year"
    conditions = [
      {int_value = 2020, operation = GREATER_EQUAL},
      {int_value = 2010, operation = LESS}]
  },
  {
    key = "document.custom_metadata.genre"
    conditions = [
      {string_value = "drama", operation = EQUAL},
      {string_value = "action", operation = EQUAL} }]
  }]

Tieni presente che solo i valori numerici supportano gli "AND" per la stessa chiave. I valori stringa supportano solo gli "OR" per la stessa chiave.

("Google for Developers" in tags) and (20230314 > publish_date)

metadata_filter = [
 {
    key = "chunk.custom_metadata.tags"
    conditions = [
    {string_value = 'Google for Developers', operation = INCLUDES},
  },
  {
    key = "chunk.custom_metadata.publish_date"
    conditions = [
    {numeric_value = 20230314, operation = GREATER_EQUAL}]
  }]
user_query = "What is the purpose of Project IDX?"
results_count = 5

# Add metadata filters for both chunk and document.
chunk_metadata_filter = glm.MetadataFilter(key='chunk.custom_metadata.tags',
                                           conditions=[glm.Condition(
                                              string_value='Google For Developers',
                                              operation=glm.Condition.Operator.INCLUDES)])

# Make the request
# corpus_resource_name is a variable set in the "Create a corpus" section.
request = glm.QueryCorpusRequest(name=corpus_resource_name,
                                 query=user_query,
                                 results_count=results_count,
                                 metadata_filters=[chunk_metadata_filter])
query_corpus_response = retriever_service_client.query_corpus(request)
print(query_corpus_response)

Ricerca di risposte alle domande con attribuzione

Utilizza il metodo GenerateAnswer per eseguire la risposta alle domande attribuite sul documento, sul corpus o su un insieme di passaggi.

La risposta alle domande con attribuzione (AQA) si riferisce alla risposta a domande basate su un determinato contesto e alla fornitura di attribuzioni, riducendo al minimo le allucinazioni.

GenerateAnswer offre diversi vantaggi rispetto all'utilizzo di un LLM non ottimizzato, nei casi in cui sia richiesta l'AQA:

  • Il modello sottostante è stato addestrato per restituire solo risposte basate sul contesto fornito.
  • Identifica le attribuzioni (segmenti del contesto fornito che hanno contribuito alla risposta). Le attribuzioni consentono all'utente di verificare la risposta.
  • Stima il answerable_probability per una determinata coppia (domanda, contesto), il che ti consente ulteriormente di modificare il comportamento del prodotto a seconda della probabilità che la risposta restituita sia plausibile e corretta.

answerable_probability e il problema "Non so"

In alcuni casi, la risposta migliore alla domanda è in realtà "Non lo so". Ad esempio, se il contesto fornito non contiene la risposta alla domanda, la domanda è considerata "senza risposta".

Il modello AQA è molto abile nel riconoscere questi casi. È persino in grado di distinguere tra i gradi di risposta e quelli di mancata risposta.

Tuttavia, l'API GenerateAnswer ti mette nelle mani il potere decisionale finale in quanto:

  • Tentare sempre di restituire una risposta con grounding, anche quando è relativamente improbabile che sia concreta e corretta.
  • Restituzione di un valore answerable_probability: la stima del modello della probabilità che la risposta sia basata su dati e corretta.

Un valore answerable_probability basso può essere spiegato da uno o più dei seguenti fattori:

  • Il modello non è sicuro che la sua risposta sia corretta.
  • Il modello non è sicuro che la sua risposta sia basata sui passaggi citati; la risposta potrebbe essere dedotta dalla conoscenza del mondo. Ad esempio: question="1+1=?", passages=["2+2=4”]answer=2, answerable_probability=0.02
  • Il modello ha fornito informazioni pertinenti che non hanno risposto completamente alla domanda. Esempio: question="Is it available in my size?, passages=["Available in sizes 5-11"]answer="Yes it is available in sizes 5-11", answerable_probability=0.03"
  • Non è stata fatta alcuna domanda corretta nel campoGenerateAnswerRequest.

Poiché un valore answerable_probability basso indica che la risposta GenerateAnswerResponse.answer è probabilmente errata o non basata su dati, è vivamente consigliato elaborare ulteriormente la risposta controllando answerable_probability.

Quando il valore di answerable_probability è basso, alcuni clienti potrebbero voler:

  • Mostrare all'utente finale un messaggio del tipo "Impossibile rispondere a questa domanda".
  • Ricorrere a un LLM generico che risponde alla domanda sulla base delle conoscenze del mondo. La soglia e la natura di questi fallback dipenderanno dai singoli casi d'uso. Un valore di answerable_probability <= 0,5 è una buona soglia iniziale.

Suggerimenti utili per AQA

Per le specifiche complete dell'API, consulta la documentazione di riferimento dell'API GenerateAnswerRequest.

  • Lunghezza del passaggio: si consigliano fino a 300 token per passaggio.
  • Ordinamento dei passaggi:
  • Limitazioni: il modello AQA è specializzato per la risposta alle domande. Per altri casi d'uso, come scrittura creativa, sintesi e così via, chiama un modello generico tramite GenerateContent.
    • Chat: se è noto che l'input dell'utente è una domanda a cui è possibile rispondere in un determinato contesto, AQA può rispondere alle query della chat. Tuttavia, se l'input dell'utente può essere di qualsiasi tipo, un modello generico potrebbe essere una scelta migliore.
  • Temperatura:
    • In genere, per un'AQA accurata è consigliata una temperatura relativamente bassa (~0,2).
    • Se il tuo caso d'uso si basa su output deterministici, imposta temperature=0.
user_query = "What is the purpose of Project IDX?"
answer_style = "ABSTRACTIVE" # Or VERBOSE, EXTRACTIVE
MODEL_NAME = "models/aqa"

# Make the request
# corpus_resource_name is a variable set in the "Create a corpus" section.
content = glm.Content(parts=[glm.Part(text=user_query)])
retriever_config = glm.SemanticRetrieverConfig(source=corpus_resource_name, query=content)
req = glm.GenerateAnswerRequest(model=MODEL_NAME,
                                contents=[content],
                                semantic_retriever=retriever_config,
                                answer_style=answer_style)
aqa_response = generative_service_client.generate_answer(req)
print(aqa_response)
# Get the metadata from the first attributed passages for the source
chunk_resource_name = aqa_response.answer.grounding_attributions[0].source_id.semantic_retriever_chunk.chunk
get_chunk_response = retriever_service_client.get_chunk(name=chunk_resource_name)
print(get_chunk_response)

Altre opzioni: AQA con i passaggi in linea

In alternativa, puoi utilizzare direttamente l'endpoint AQA, senza utilizzare l'API Semantic Retriever, passando inline_passages.

user_query = "What is AQA from Google?"
user_query_content = glm.Content(parts=[glm.Part(text=user_query)])
answer_style = "VERBOSE" # or ABSTRACTIVE, EXTRACTIVE
MODEL_NAME = "models/aqa"

# Create the grounding inline passages
grounding_passages = glm.GroundingPassages()
passage_a = glm.Content(parts=[glm.Part(text="Attributed Question and Answering (AQA) refers to answering questions grounded to a given corpus and providing citation")])
grounding_passages.passages.append(glm.GroundingPassage(content=passage_a, id="001"))
passage_b = glm.Content(parts=[glm.Part(text="An LLM is not designed to generate content grounded in a set of passages. Although instructing an LLM to answer questions only based on a set of passages reduces hallucination, hallucination still often occurs when LLMs generate responses unsupported by facts provided by passages")])
grounding_passages.passages.append(glm.GroundingPassage(content=passage_b, id="002"))
passage_c = glm.Content(parts=[glm.Part(text="Hallucination is one of the biggest problems in Large Language Models (LLM) development. Large Language Models (LLMs) could produce responses that are fictitious and incorrect, which significantly impacts the usefulness and trustworthiness of applications built with language models.")])
grounding_passages.passages.append(glm.GroundingPassage(content=passage_c, id="003"))

# Create the request
req = glm.GenerateAnswerRequest(model=MODEL_NAME,
                                contents=[user_query_content],
                                inline_passages=grounding_passages,
                                answer_style=answer_style)
aqa_response = generative_service_client.generate_answer(req)
print(aqa_response)

Condividere il corpus

Puoi scegliere di condividere il corpus con altri utenti utilizzando l'API CreatePermissionRequest.

Limitazioni:

  • Esistono due ruoli per la condivisione: READER e EDITOR.
    • Un READER può eseguire query sul corpus.
    • Un WRITER ha le autorizzazioni del lettore e può anche modificare e condividere il corpus.
  • Un corpus può essere pubblico concedendo a EVERYONE l'accesso in lettura come user_type.
# Replace your-email@gmail.com with the email added as a test user in the OAuth Quickstart
shared_user_email = "TODO-your-email@gmail.com" #  @param {type:"string"}
user_type = "USER"
role = "READER"

# Make the request
# corpus_resource_name is a variable set in the "Create a corpus" section.
request = glm.CreatePermissionRequest(
    parent=corpus_resource_name,
    permission=glm.Permission(grantee_type=user_type,
                              email_address=shared_user_email,
                              role=role))
create_permission_response = permission_service_client.create_permission(request)
print(create_permission_response)

Elimina il corpus

Utilizza DeleteCorpusRequest per eliminare il corpus di un utente e tutti i Document e Chunk associati.

Tieni presente che i corpora non vuoti genereranno un errore senza specificare un flag force=True. Se imposti force=True, verranno eliminati anche tutti i Chunk e gli oggetti correlati a questo Document.

Se force=False (il valore predefinito) e Document contengono Chunk, viene restituito un errore FAILED_PRECONDITION.

# Set force to False if you don't want to delete non-empty corpora.
req = glm.DeleteCorpusRequest(name=corpus_resource_name, force=True)
delete_corpus_response = retriever_service_client.delete_corpus(req)
print("Successfully deleted corpus: " + corpus_resource_name)

Riepilogo e letture consigliate

Questa guida ha presentato le API Semantic Retriever e Attributed Question &Answering (AQA) dell'API Generative Language e ha mostrato come utilizzarle per eseguire il recupero di informazioni semantiche sui tuoi dati di testo personalizzati. Tieni presente che questa API funziona anche con il framework di dati LlamaIndex. Per saperne di più, consulta il tutorial.

Consulta anche la documentazione dell'API per scoprire di più sulle altre funzionalità disponibili.

Appendice: configurazione di OAuth con credenziali utente

Per configurare l'autenticazione OAuth, segui i passaggi riportati di seguito nella guida rapida di OAuth.

  1. Configura la schermata per il consenso OAuth.

  2. Autorizzare le credenziali per un'applicazione desktop. Per eseguire questo blocco note in Colab, devi prima rinominare il file delle credenziali (di solito client_secret_*.json) impostandolo solo su client_secret.json. Carica il file utilizzando l'icona del file nella barra laterale sinistra e poi l'icona di caricamento, come mostrato nello screenshot di seguito.

# Replace TODO-your-project-name with the project used in the OAuth Quickstart
project_name = "TODO-your-project-name" #  @param {type:"string"}
# Replace TODO-your-email@gmail.com with the email added as a test user in the OAuth Quickstart
email = "TODO-your-email@gmail.com" #  @param {type:"string"}
# Rename the uploaded file to `client_secret.json` OR
# Change the variable `client_file_name` in the code below.
client_file_name = "client_secret.json"

# IMPORTANT: Follow the instructions from the output - you must copy the command
# to your terminal and copy the output after authentication back here.
!gcloud config set project $project_name
!gcloud config set account $email

# NOTE: The simplified project setup in this tutorial triggers a "Google hasn't verified this app." dialog.
# This is normal, click "Advanced" -> "Go to [app name] (unsafe)"
!gcloud auth application-default login --no-browser --client-id-file=$client_file_name --scopes="https://www.googleapis.com/auth/generative-language.retriever,https://www.googleapis.com/auth/cloud-platform"

Inizializza la libreria client ed esegui di nuovo il notebook a partire da Creare un corpus.

import google.ai.generativelanguage as glm

generative_service_client = glm.GenerativeServiceClient()
retriever_service_client = glm.RetrieverServiceClient()
permission_service_client = glm.PermissionServiceClient()