Afficher sur ai.google.dev | Essayer un notebook Colab | Afficher le notebook sur GitHub |
Présentation
Les grands modèles de langage (LLM) peuvent apprendre de nouvelles capacités sans être directement entraînés dessus. Cependant, on sait que les LLM "hallucinent" sont chargés de fournir des réponses à des questions sur lesquelles ils n'ont pas été entraînés. Cela s'explique en partie par le fait que les LLM ne sont pas conscients des événements après l'entraînement. Il est également très difficile de tracer les sources à partir desquelles les LLM extraient leurs réponses. Pour les applications fiables et évolutives, il est important qu'un LLM fournisse des réponses fondées sur des faits et qu'il soit en mesure de citer ses sources d'informations.
Une approche courante pour surmonter ces contraintes est la génération augmentée de récupération (RAG, Retrieval Augmented Generation), qui étend la requête envoyée à un LLM avec des données pertinentes extraites d'une base de connaissances externe grâce à un mécanisme de récupération d'informations (IR). La base de connaissances peut être votre propre corpus de documents, de bases de données ou d'API.
Ce notebook vous guide tout au long d'un workflow permettant d'améliorer la réponse d'un LLM en renforçant ses connaissances avec des corpus textuels externes et en effectuant des récupérations d'informations sémantiques pour répondre à des questions à l'aide du récupérateur sémantique et des API de questions et réponses attribuées (AQA) de l'API de langage génératif.
Configuration
Importer l'API Generative Language
# Install the Client library (Semantic Retriever is only supported for versions >0.4.0)
pip install -U google.ai.generativelanguage
Authentifier
L'API Semantic Retriever vous permet d'effectuer une recherche sémantique sur vos propres données. Comme il s'agit de vos données, vous devez appliquer des contrôles d'accès plus stricts que pour les clés API. Authentifiez-vous avec OAuth à l'aide de comptes de service ou de vos identifiants utilisateur.
Ce guide de démarrage rapide utilise une approche d'authentification simplifiée destinée à un environnement de test. Les configurations de compte de service sont généralement plus faciles à utiliser. Pour un environnement de production, découvrez l'authentification et l'autorisation avant de choisir les identifiants d'accès appropriés pour votre application.
Configurer OAuth à l'aide de comptes de service
Suivez les étapes ci-dessous pour configurer OAuth à l'aide de comptes de service:
- Activez l'API Generative Language.
Créez le compte de service en suivant les instructions de la documentation.
- Une fois le compte de service créé, générez une clé de compte de service.
Importez le fichier de votre compte de service en cliquant sur l'icône de fichier dans la barre latérale gauche, puis sur l'icône d'importation, comme illustré dans la capture d'écran ci-dessous.
- Renommez le fichier importé
service_account_key.json
ou modifiez la variableservice_account_file_name
dans le code ci-dessous.
- Renommez le fichier importé
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'])
Initialisez la bibliothèque cliente à l'aide des identifiants du compte de service.
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)
Créer un corpus
L'API Semantic Retriever vous permet de définir jusqu'à cinq corpus de texte personnalisés par projet. Vous pouvez spécifier l'un des champs suivants lorsque vous définissez vos corpus:
name
: nom (ID) de la ressourceCorpus
. Il ne doit pas comporter plus de 40 caractères alphanumériques. Si lename
est vide lors de la création, un nom unique d'une longueur maximale de 40 caractères est généré, avec un préfixe provenant dudisplay_name
et un suffixe aléatoire de 12 caractères.display_name
: nom à afficher lisible par l'utilisateur pourCorpus
. Il ne doit pas comporter plus de 512 caractères, y compris des caractères alphanumériques, des espaces et des tirets.
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 }
Obtenir le corpus créé
Utilisez la méthode GetCorpusRequest
pour accéder par programmation au Corpus
que vous avez créé ci-dessus. La valeur du paramètre name
fait référence au nom complet de la ressource de Corpus
et est définie dans la cellule ci-dessus sur corpus_resource_name
. Le format attendu est 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)
Créer un document
Un Corpus
peut contenir jusqu'à 10 000 éléments Document
. Vous pouvez spécifier l'un des champs suivants lorsque vous définissez vos documents:
name
: nom (ID) de la ressourceDocument
. Il ne doit pas comporter plus de 40 caractères (alphanumériques ou tirets uniquement). L'ID ne peut ni commencer, ni se terminer par un tiret. Si le nom est vide lors de la création, un nom unique est dérivé dedisplay_name
, avec un suffixe aléatoire de 12 caractères.display_name
: nom à afficher lisible par l'utilisateur. Le nom ne doit pas comporter plus de 512 caractères, y compris les caractères alphanumériques, les espaces et les tirets.
Les Document
acceptent également jusqu'à 20 champs custom_metadata
spécifiés par l'utilisateur, spécifiés sous forme de paires clé-valeur. Les métadonnées personnalisées peuvent être des chaînes, des listes de chaînes ou des valeurs numériques. Notez que les listes de chaînes peuvent contenir au maximum 10 valeurs et que les valeurs numériques sont représentées sous forme de nombres à virgule flottante dans l'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)
Obtenir le document créé
Utilisez la méthode GetDocumentRequest
pour accéder par programmation au document que vous avez créé ci-dessus. La valeur du paramètre name
fait référence au nom complet de la ressource du document et est définie dans la cellule ci-dessus sur document_resource_name
. Le format attendu est 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)
Ingérer et segmenter un document
Pour améliorer la pertinence du contenu renvoyé par la base de données vectorielle lors de la récupération sémantique, décomposez les documents volumineux en fragments plus petits ou morceaux lors de l'ingestion du document.
Un Chunk
est une sous-partie d'un Document
qui est traité comme une unité indépendante à des fins de représentation et de stockage vectoriels. Un Chunk
peut comporter jusqu'à 2 043 jetons. Un Corpus
peut comporter jusqu'à un million de Chunk
.
Comme les Document
, les Chunks
acceptent également jusqu'à 20 champs custom_metadata
spécifiés par l'utilisateur, spécifiés sous la forme de paires clé-valeur. Les métadonnées personnalisées peuvent être des chaînes, des listes de chaînes ou des valeurs numériques. Notez que les listes de chaînes peuvent accepter jusqu'à 10 valeurs et que les valeurs numériques sont représentées par des nombres à virgule flottante dans l'API.
Ce guide utilise l'outil Open Source HTMLChunker de Google.
Vous pouvez également utiliser LangChain ou LlamaIndex.
Ingérer du code HTML et le diviser en blocs via HtmlChunker
!pip install google-labs-html-chunker
from google_labs_html_chunker.html_chunker import HtmlChunker
from urllib.request import urlopen
Obtenez le DOM HTML d'un site Web. Ici, le code HTML est lu directement, mais il serait préférable d'inclure du code HTML injecté en JavaScript dans le post-affichage HTML, comme 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")
Divisez le document textuel en passages et créez des Chunk
à partir de ces passages. Cette étape crée les objets Chunk
eux-mêmes, et la section suivante les importe dans l'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)
Créer des fragments par lot
Créez des segments par lot. Vous pouvez spécifier un maximum de 100 fragments par requête par lot.
Utilisez CreateChunk()
pour créer un seul bloc.
# 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)
Vous pouvez également créer des fragments sans utiliser 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)
Lister les Chunk
et obtenir l'état
Utilisez la méthode ListChunksRequest
pour obtenir tous les Chunk
disponibles sous forme de liste paginée avec une limite de taille maximale de 100 Chunk
par page, triés par ordre croissant de Chunk.create_time
. Si vous ne spécifiez pas de limite, 10 Chunk
au maximum sont renvoyés.
Fournissez l'next_page_token
renvoyé dans la réponse ListChunksRequest
comme argument de la requête suivante pour récupérer la page suivante. Notez que lors de la pagination, tous les autres paramètres fournis à ListChunks
doivent correspondre à l'appel ayant fourni le jeton de page.
Toutes les Chunk
renvoient un state
. Utilisez-le pour vérifier l'état de Chunks
avant d'interroger un Corpus
. Les états Chunk
incluent UNSPECIFIED
, PENDING_PROCESSING
, ACTIVE
et FAILED
. Vous ne pouvez interroger que ACTIVE
instances 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}')
Ingérer un autre document
Ajoutez un autre Document
via HtmlChunker et ajoutez des filtres.
# 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)
Interroger le corpus
Utilisez la méthode QueryCorpusRequest
pour effectuer une recherche sémantique afin d'obtenir des passages pertinents.
results_count
: spécifie le nombre de passages à renvoyer. La valeur maximale est de 100. Si ce paramètre n'est pas spécifié, l'API renvoie un maximum de 10Chunk
.metadata_filters
: filtrez parchunk_metadata
oudocument_metadata
. ChaqueMetadataFilter
doit correspondre à une clé unique. Plusieurs objetsMetadataFilter
sont joints par desAND
logiques. Les conditions de filtre de métadonnées similaires sont jointes par desOR
logiques. Voici quelques exemples :
(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} }]
}]
Notez que seules les valeurs numériques acceptent les opérateurs "AND" pour la même clé. Les valeurs de chaîne n'acceptent que les "OU" pour la même clé.
("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)
Système de questions-réponses attribué
Utilisez la méthode GenerateAnswer
pour effectuer la réponse aux questions attribuée sur votre document, votre corpus ou un ensemble de passages.
L'attribution de réponses aux questions (AQA) consiste à répondre à des questions fondées sur un contexte donné et à fournir des mentions, tout en minimisant les hallucinations.
GenerateAnswer
présente plusieurs avantages par rapport à l'utilisation d'un LLM non configuré, lorsque l'AQA est souhaitée:
- Le modèle sous-jacent a été entraîné pour ne renvoyer que des réponses basées sur le contexte fourni.
- Il identifie les attributions (segments du contexte fourni qui ont contribué à la réponse). Les attributions permettent à l'utilisateur de vérifier la réponse.
- Elle estime la
answerable_probability
pour une paire (question, contexte) donnée, ce qui vous permet de modifier le comportement du produit en fonction de la probabilité que la réponse renvoyée soit pertinente et correcte.
answerable_probability
et le problème "Je ne sais pas"
Dans certains cas, la meilleure réponse à la question est en fait "Je ne sais pas". Par exemple, si le contexte fourni ne contient pas la réponse à la question, celle-ci est considérée comme "sans réponse".
Le modèle AQA est très doué pour reconnaître ces cas. Il peut même faire la distinction entre les degrés de réponse et d'absence de réponse.
Toutefois, l'API GenerateAnswer
vous donne le pouvoir de prendre la décision finale:
- Toujours essayer de renvoyer une réponse avec ancrage, même si cette réponse est relativement peu susceptible d'être fondée et correcte.
- Renvoie une valeur
answerable_probability
: estimation du modèle de la probabilité que la réponse soit fondée et correcte.
Un answerable_probability
faible peut s'expliquer par un ou plusieurs des facteurs suivants:
- Le modèle n'est pas sûr que sa réponse est correcte.
- Le modèle n'est pas certain que sa réponse repose sur les passages cités. Elle peut, à la place, être dérivée de la connaissance du monde. Exemple:
question="1+1=?", passages=["2+2=4”]
→answer=2, answerable_probability=0.02
- Le modèle a fourni des informations pertinentes qui n'ont pas répondu complètement à la question. Exemple:
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"
- Aucune question bien formulée n'a été posée dans la requête GenerateAnswerRequest.
Étant donné qu'une valeur answerable_probability
faible indique que la réponse GenerateAnswerResponse.answer est probablement incorrecte ou non fondée, il est fortement recommandé de traiter davantage la réponse en inspectant answerable_probability
.
Lorsque la valeur de answerable_probability
est faible, certains clients peuvent souhaiter:
- Afficher le message "Impossible de répondre à cette question" à l'utilisateur final.
- Reposez-vous sur un LLM à usage général qui répond à la question à partir de la connaissance du monde. Le seuil et la nature de ces solutions de secours dépendront des cas d'utilisation individuels. Une valeur de
answerable_probability
≤ 0,5 est un bon seuil de départ.
Conseils utiles de l'AQA
Pour connaître les spécifications complètes de l'API, consultez la documentation de référence de l'API GenerateAnswerRequest
.
- Longueur du passage: nous vous recommandons de ne pas dépasser 300 jetons par passage.
- Tri des passages :
- Si vous indiquez
GenerateAnswerRequest.inline_passages
, les passages doivent être triés par ordre décroissant de pertinence par rapport à la requête. Si la limite de longueur du contexte du modèle est dépassée, les derniers passages (les moins pertinents) sont omis. - Si vous fournissez
GenerateAnswerRequest.semantic_retriever
, le tri par pertinence sera effectué automatiquement.
- Si vous indiquez
- Limites: le modèle AQA est spécialisé dans la réponse aux questions. Pour d'autres cas d'utilisation, tels que l'écriture créative, le résumé, etc., veuillez appeler un modèle à usage général via GenerateContent.
- Chat: si l'entrée utilisateur est connue comme étant une question pouvant être répondue à partir d'un certain contexte, l'AQA peut répondre aux requêtes par chat. Toutefois, si l'entrée utilisateur peut être de n'importe quel type, un modèle à usage général peut être un meilleur choix.
- Température :
- En règle générale, une température relativement basse (environ 0,2 °C) est recommandée pour une évaluation de la qualité de l'air précise.
- Si votre cas d'utilisation repose sur des sorties déterministes, définissez 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)
Autres options: AQA avec des passages intégrés
Vous pouvez également utiliser directement le point de terminaison AQA, sans utiliser l'API Semantic Retriever, en transmettant 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)
Partager le corpus
Vous pouvez choisir de partager le corpus avec d'autres personnes à l'aide de l'API CreatePermissionRequest
.
Contraintes:
- Il existe deux rôles de partage:
READER
etEDITOR
.- Un
READER
peut interroger le corpus. - Un
WRITER
dispose des autorisations du lecteur et peut en outre modifier et partager le corpus.
- Un
- Un corpus peut être public en accordant à
EVERYONE
un accès en lectureuser_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)
Supprimer le corpus
Utilisez DeleteCorpusRequest
pour supprimer un corpus utilisateur et tous les Document
et Chunk
associés.
Notez que les corpus non vides génèrent une erreur sans spécifier d'indicateur force=True
. Si vous définissez force=True
, tous les Chunk
et objets associés à ce Document
seront également supprimés.
Si force=False
(valeur par défaut) et Document
contiennent des Chunk
, une erreur FAILED_PRECONDITION
est renvoyée.
# 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)
Résumé et lectures complémentaires
Ce guide a présenté les API Semantic Retriever et AQA (Attributed Question & Answering) de l'API Generative Language et expliqué comment les utiliser pour effectuer une récupération d'informations sémantiques sur vos données textuelles personnalisées. Notez que cette API fonctionne également avec le framework de données LlamaIndex. Pour en savoir plus, consultez le tutoriel.
Consultez également la documentation de l'API pour en savoir plus sur les autres fonctionnalités disponibles.
Annexe: Configurer OAuth avec des identifiants utilisateur
Suivez les étapes du guide de démarrage rapide OAuth ci-dessous pour configurer l'authentification OAuth.
Autoriser des identifiants pour une application de bureau Pour exécuter ce notebook dans Colab, commencez par renommer votre fichier d'identifiants (généralement
client_secret_*.json
) enclient_secret.json
. Transférez ensuite le fichier à l'aide de l'icône de fichier dans la barre latérale de gauche, puis de l'icône de transfert, comme illustré dans la capture d'écran ci-dessous.
# 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"
Initialisez la bibliothèque cliente et exécutez à nouveau le notebook à partir de Créer un corpus.
import google.ai.generativelanguage as glm
generative_service_client = glm.GenerativeServiceClient()
retriever_service_client = glm.RetrieverServiceClient()
permission_service_client = glm.PermissionServiceClient()