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:
- Attivare l'API Generative Language.
Crea l'account di servizio seguendo la documentazione.
- Dopo aver creato l'account di servizio, genera una chiave dell'account di servizio.
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 variabileservice_account_file_name
nel codice seguente.
- Rinomina il file caricato in
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 risorsaCorpus
. Deve contenere al massimo 40 caratteri alfanumerici. Se il camponame
è vuoto al momento della creazione, verrà generato un nome univoco con una lunghezza massima di 40 caratteri con un prefisso didisplay_name
e un suffisso casuale di 12 caratteri.display_name
: nome visualizzato leggibile per l'elementoCorpus
. 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 risorsaDocument
. 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 univocodisplay_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 10Chunk
.metadata_filters
: filtra perchunk_metadata
odocument_metadata
. OgniMetadataFilter
deve corrispondere a una chiave univoca. Più oggettiMetadataFilter
sono uniti daAND
logici. Le condizioni di filtro dei metadati simili sono unite daOR
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.
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:
- .
- Se fornisci
GenerateAnswerRequest.inline_passages
, i passaggi devono essere ordinati in ordine decrescente di pertinenza rispetto alla query. Se viene superato il limite di lunghezza del contesto del modello, gli ultimi passaggi (meno pertinenti) verranno omessi. - Se fornisci
GenerateAnswerRequest.semantic_retriever
, l'ordinamento per pertinenza verrà eseguito automaticamente.
- Se fornisci
- 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
eEDITOR
.- Un
READER
può eseguire query sul corpus. - Un
WRITER
dispone delle autorizzazioni di lettura e può inoltre modificare e condividere il corpus.
- Un
- Un corpus può essere pubblico concedendo a
EVERYONE
come accesso in letturauser_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.
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 suclient_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()