Iniziare a utilizzare il recupero semantico

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

Panoramica

I modelli linguistici di grandi dimensioni (LLM) possono apprendere nuove abilità senza doverle addestrare direttamente. Tuttavia, gli LLM sono noti come "allucinazione" quando incaricati di fornire risposte a domande per le quali non hanno ricevuto formazione. Questo in parte perché gli LLM non sono a conoscenza degli eventi dopo l'addestramento. È inoltre molto difficile rintracciare le fonti da cui gli LLM traggono le loro risposte. Per applicazioni affidabili e scalabili, è importante che un LLM fornisca risposte basate su fatti e che sia in grado di citare le proprie fonti di informazioni.

Un approccio comune utilizzato per superare questi vincoli è chiamato RAG (Retrieval Augmented Generation), 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 il tuo corpora di documenti, database o API.

Questo blocco note illustra un flusso di lavoro per migliorare la risposta di un LLM aumentandone la conoscenza con corpora di testo esterno ed eseguendo il recupero di informazioni semantiche per rispondere a domande utilizzando il Semantic Retriever e il Attributed Question & API di risposta (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. Inoltre, in genere è più facile iniziare le configurazioni degli account di servizio. Per un ambiente di produzione, scopri di più su autenticazione e autorizzazione prima di scegliere le credenziali di accesso appropriate per la tua app.

Configura OAuth utilizzando account di servizio

Per configurare OAuth utilizzando gli account di servizio:

  1. Attivare 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 di seguito.

    • 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'])

Inizializzare 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 consente di definire fino a cinque corpora di testo personalizzati per progetto. Puoi specificare uno dei seguenti campi mentre definisci il corpora:

  • name: il nome (ID) della risorsa Corpus. Deve contenere al massimo 40 caratteri alfanumerici. Se il campo name è vuoto al momento della creazione, verrà generato un nome univoco con una lunghezza massima di 40 caratteri con un prefisso di display_name e un suffisso casuale di 12 caratteri.
  • display_name: nome visualizzato leggibile per l'elemento Corpus. Deve contenere al massimo 512 caratteri, inclusi caratteri 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
}

Ottieni 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 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 al massimo 40 caratteri (solo alfanumerici o trattini). L'ID non può iniziare o terminare con un trattino. Se il nome è vuoto al momento della creazione, ne verrà derivato un nome univoco display_name insieme a un suffisso casuale di 12 caratteri.
  • display_name: nome visualizzato leggibile. Deve contenere al massimo 512 caratteri, inclusi caratteri alfanumerici, spazi e trattini.

Le Document supportano inoltre 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)

Scarica il documento creato

Utilizza il metodo GetDocumentRequest per accedere in modo programmatico al documento che hai creato sopra. Il valore del parametro name si riferisce 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)

Importazione e chunking di un documento

Per migliorare la pertinenza dei contenuti restituiti dal database vettoriale durante il recupero semantico, suddivide i documenti di grandi dimensioni in parti o blocchi più piccoli durante l'importazione del documento.

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

Analogamente a Document, Chunks supporta 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.

Questa guida utilizza HTMLChunker open source di Google.

Altri chunker che puoi utilizzare includono LangChain o LlamaIndex.

Importa HTML e chunk 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 per un sito web. In questo caso il codice HTML viene letto direttamente, ma migliora il processo di post-rendering dell'HTML per includere l'HTML inserito da JavaScript ad esempio 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 e nella 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)

Creazione di blocchi in batch

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

Usa CreateChunk() per la creazione di un singolo blocco.

# 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 blocchi 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 al massimo 10 Chunk.

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

Tutti i valori Chunk restituiscono state. Utilizza questa opzione per verificare lo stato di Chunks prima di eseguire query su un Corpus. Gli stati di Chunk sono - 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 elemento Document tramite HTMLChunker e i 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

Usa il metodo QueryCorpusRequest per eseguire una ricerca semantica in modo da 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. 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)

Question-Answering attribuite

Utilizza il metodo GenerateAnswer per eseguire risposte a domande attribuite su un documento, un corpus o una serie di passaggi.

L'attribuzione delle domande (AQA) si riferisce alla risposta a domande basate su un determinato contesto e all'attribuzione o alle attribuzioni, riducendo al minimo l'allucinazione.

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

  • Il modello sottostante è stato addestrato per restituire solo risposte basate sul contesto fornito.
  • Identifica le attribuzioni (i 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.
di Gemini Advanced.

answerable_probability e il problema "Non so"

In alcuni casi, la risposta migliore alla domanda è infatti "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 lascia il potere decisionale finale nelle tue mani perché:

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

Un valore basso di answerable_probability 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 si basi sui passaggi citati; La risposta potrebbe derivare invece 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 nella generazione di risposte.

Poiché un valore answerable_probability basso indica che il valore generato è probabilmente sbagliato o privo di fondamento, ti consigliamo vivamente di elaborare ulteriormente la risposta ispezionando answerable_probability.

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

  • Mostrare un messaggio con l'effetto di "non ho potuto rispondere alla domanda" per l'utente finale.
  • Ricorri a un LLM per uso generico che risponde alla domanda partendo dalle conoscenze del mondo. La soglia e la natura di questi fallback dipenderanno dai singoli casi d'uso. Un valore answerable_probability <= 0,5 è una buona soglia iniziale.

Suggerimenti utili per l'AQA

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

  • Lunghezza del passaggio: sono consigliati 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, riassunto e così via, chiama un modello per uso generico tramite GeneraContent.
    • 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 un qualsiasi tipo di voce, un modello per uso generico può essere una scelta migliore.
  • Temperatura:
      .
    • In genere, si consiglia una temperatura relativamente bassa (~0,2) per una AQA accurata.
    • 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)

Condividi il corpus

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

Vincoli:

  • Sono disponibili due ruoli per la condivisione: READER e EDITOR.
    • Un READER può eseguire query sul corpus.
    • Un WRITER dispone delle autorizzazioni di lettura e può inoltre modificare e condividere il corpus.
  • Un corpus può essere pubblico concedendo a EVERYONE come accesso in lettura 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 i Document associati Chunk.

Tieni presente che corpora non vuoto genererà un errore senza specificare un flag force=True. Se imposti force=True, verranno eliminati anche tutti i Chunk e gli oggetti relativi a Document.

Se force=False (valore predefinito) e Document contiene Chunk, verrà 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 ulteriori approfondimenti

Questa guida ha introdotto il Semantic Retriever e la domanda attribuita e API Answering (AQA) dell'API Generative Language e hanno mostrato come utilizzarle per eseguire il recupero di informazioni semantiche sui dati di testo personalizzati. Tieni presente che questa API funziona anche con il framework di dati LlamaIndex. Per scoprire di più, consulta il tutorial.

Fai riferimento anche alla documentazione sulle API per scoprire di più sulle altre funzionalità disponibili.

Appendice: configurazione di OAuth con credenziali utente

Segui i passaggi riportati di seguito nella guida rapida di OAuth per configurare l'autenticazione 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. Quindi carica il file utilizzando l'icona del file nella barra laterale di sinistra, quindi 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 blocco note a partire da Crea un corpus.

import google.ai.generativelanguage as glm

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