セマンティック取得を使ってみる

ai.google.dev で表示 Colab ノートブックを試す GitHub でノートブックを表示

概要

大規模言語モデル(LLM)は、新しい能力を直接トレーニングされなくても学習できます。ただし、LLM は、トレーニングされていない質問に対する回答を提供するよう求められると「幻覚」を起こすことが知られています。これは、LLM がトレーニング後のイベントを認識しない点が一因となっています。また、LLM が回答を取得するソースを特定することも非常に困難です。信頼性が高くスケーラブルなアプリケーションでは、LLM が事実に基づく回答を提供し、情報源を引用できることが重要です。

これらの制約を克服するために使用される一般的なアプローチは、検索拡張生成(RAG)と呼ばれ、LLM に送信されるプロンプトを、情報検索(IR)メカニズムを介して外部のナレッジベースから取得された関連データで拡張します。ナレッジベースには、独自のドキュメント コーパス、データベース、または API を使用できます。

このノートブックでは、外部テキスト コーパスで LLM の知識を補強し、Generative Language API の Semantic Retriever と Attributed Question & Answering(AQA)API を使用して質問に回答するためにセマンティック情報検索を実行することで、LLM のレスポンスを改善するためのワークフローを説明します。

セットアップ

Generative Language API をインポートする

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

認証

Semantic Retriever API を使用すると、独自のデータに対してセマンティック検索を実行できます。お客様のデータであるため、API キーよりも厳格なアクセス制御が必要です。サービス アカウントまたはユーザー認証情報を使用して OAuth 認証を行います。

このクイックスタートでは、テスト環境向けの簡素化された認証方法を使用します。通常、サービス アカウントの設定から始めると簡単です。本番環境の場合は、アプリに適したアクセス認証情報を選択する前に、認証と承認について学習してください。

サービス アカウントを使用して OAuth を設定する

サービス アカウントを使用して OAuth を設定する手順は次のとおりです。

  1. Generative Language API を有効にします。

  1. ドキュメントに沿ってサービス アカウントを作成します。

    • サービス アカウントを作成したら、サービス アカウント キーを生成します。

  1. 左側のサイドバーにあるファイルアイコン、次にアップロード アイコンを使用して、サービス アカウント ファイルをアップロードします(下のスクリーンショットを参照)。

    • アップロードしたファイルの名前を service_account_key.json に変更するか、以下のコードの変数 service_account_file_name を変更します。

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

サービス アカウントの認証情報を使用してクライアント ライブラリを初期化します。

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)

コーパスを作成する

Semantic Retriever API を使用すると、プロジェクトごとに最大 5 つのカスタム テキスト コーパスを定義できます。コーパスを定義するときに、次のいずれかのフィールドを指定できます。

  • name: Corpus リソース名(ID)。英数字のみで、最大 40 文字にしてください。作成時に name が空の場合、display_name の接頭辞と 12 文字のランダムな接尾辞を使用して、最大 40 文字の一意の名前が生成されます。
  • display_name: Corpus の読みやすい表示名。英数字、スペース、ダッシュを含め、最大 512 文字にする必要があります。
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
}

作成したコーパスを取得する

GetCorpusRequest メソッドを使用して、上記で作成した Corpus にプログラムでアクセスします。name パラメータの値は Corpus の完全なリソース名を参照し、上のセルで corpus_resource_name として設定されています。形式は 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)

ドキュメントを作成して

Corpus には最大 10,000 個の Document を含めることができます。ドキュメントを定義するときに、次のいずれかのフィールドを指定できます。

  • name: Document リソース名(ID)。最大 40 文字(英数字またはダッシュのみ)にする必要があります。ID の先頭または末尾をダッシュにすることはできません。作成時に名前が空の場合、display_name から 12 文字のランダムな接尾辞が付加された一意の名前が生成されます。
  • display_name: 人が読める形式の表示名。英数字、スペース、ダッシュを含め、最大 512 文字にする必要があります。

Document は、Key-Value ペアとして指定されたユーザー指定の custom_metadata フィールドを最大 20 個サポートします。カスタム メタデータには、文字列、文字列のリスト、数値を使用できます。文字列のリストは最大 10 個の値をサポートでき、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)

作成されたドキュメントを取得する

GetDocumentRequest メソッドを使用して、上で作成したドキュメントにプログラムでアクセスします。name パラメータの値は、ドキュメントの完全なリソース名を参照し、上のセルで document_resource_name として設定されています。想定される形式は 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)

ドキュメントの取り込みとチャンク化

セマンティック検索中にベクトル データベースから返されるコンテンツの関連性を高めるには、ドキュメントを取り込むときに大きなドキュメントを小さな部分またはチャンクに分割します。

Chunk は、ベクトル表現とストレージの目的で独立した単位として扱われる Document のサブパートです。Chunk には最大 2,043 個のトークンを指定できます。Corpus には、最大 100 万個の Chunk を指定できます。

Document と同様に、Chunks は Key-Value ペアとして指定された、ユーザー指定の custom_metadata フィールドを最大 20 個サポートします。カスタム メタデータには、文字列、文字列のリスト、数値を使用できます。文字列のリストは最大 10 個の値をサポートできます。数値は API で浮動小数点数として表されます。

このガイドでは、Google の オープンソースの HtmlChunker を使用します。

使用できるその他のチャンクには、LangChainLlamaIndex があります。

HtmlChunker を使用して HTML をインジェストし、チャンク化する

!pip install google-labs-html-chunker

from google_labs_html_chunker.html_chunker import HtmlChunker

from urllib.request import urlopen

ウェブサイトの HTML DOM を取得します。ここでは HTML が直接読み込まれますが、document.documentElement.innerHTML などの JavaScript 挿入 HTML を含めるには、レンダリング後の HTML を取得することをおすすめします。

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")

テキスト文書を文章に分解し、その文章からChunkを作成します。このステップでは Chunk オブジェクト自体を作成し、次のセクションでは Semantic Retriever API にアップロードします。

# 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)

チャンクの一括作成

チャンクをバッチで作成する。バッチ リクエストごとに指定できるチャンクは最大 100 個です。

単一チャンクの作成には CreateChunk() を使用します。

# 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)

または、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)

Chunk を一覧表示して状態を取得する

ListChunksRequest メソッドを使用して、使用可能なすべての Chunk をページ分割リストとして取得します。最大サイズの上限はページあたり 100 個の Chunk で、Chunk.create_time の昇順で並べ替えられます。上限を指定しない場合、最大 10 個の Chunk が返されます。

次のページを取得するには、ListChunksRequest レスポンスで返された next_page_token を次のリクエストの引数として指定します。ページネーションを行う場合、ListChunks に指定する他のすべてのパラメータは、ページトークンを受け取った呼び出しと一致している必要があります。

すべての Chunkstate を返します。Corpus をクエリする前に、Chunks の状態を確認するために使用します。Chunk の状態には、UNSPECIFIEDPENDING_PROCESSINGACTIVEFAILED があります。クエリできるのは 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}')

別のドキュメントを取り込む

HtmlChunker で別の Document を追加し、フィルタを追加します。

# 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)

コーパスにクエリを実行する

QueryCorpusRequest メソッドを使用してセマンティック検索を行い、関連する文章を取得します。

  • results_count: 返されるパッセージの数を指定します。最大値は 100 です。指定しない場合、API は最大 10 個の Chunk を返します。
  • metadata_filters: chunk_metadata または document_metadata でフィルタします。各 MetadataFilter は一意のキーに対応する必要があります。複数の MetadataFilter オブジェクトが論理 AND で結合されます。類似のメタデータ フィルタ条件は、論理 OR で結合されます。例:
(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} }]
  }]

同じキーの「AND」は数値値でのみサポートされます。文字列値では、同じキーの「OR」のみがサポートされます。

("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)

アトリビューションによる質問応答

GenerateAnswer メソッドを使用して、ドキュメント、コーパス、または一連のパラグラフに対して属性付き質問応答を実行します。

アトリビューション付き質問応答(AQA)とは、ハルシネーションを最小限に抑えながら、特定のコンテキストに基づいて質問に回答し、アトリビューションを提供することです。

GenerateAnswer には、AQA が必要な場合に、チューニングされていない LLM を使用する場合よりもいくつかの利点があります。

  • 基盤となるモデルは、指定されたコンテキストに基づく回答のみを返すようにトレーニングされています。
  • アトリビューション(回答に貢献した提供されたコンテキストのセグメント)を特定します。アトリビューションにより、ユーザーは回答を確認できます。
  • 特定の(質問、コンテキスト)ペアの answerable_probability を推定します。これにより、返された回答が根拠があり正しい可能性に応じて、プロダクトの動作を変更できます。

answerable_probability と「わからない」問題

場合によっては、質問に対する最適な回答が「わかりません」であることもあります。たとえば、提供されたコンテキストに質問の答えが含まれていない場合、その質問は「回答不可」と見なされます。

AQA モデルは、このようなケースを認識するのに非常に適しています。回答可能性と回答不可の度合いを区別することもできます。

ただし、GenerateAnswer API を使用すると、次の方法で最終的な意思決定を行うことができます。

  • 必ず、根拠のある回答を返すようにしてください。たとえその回答が根拠に基づいた正しい回答である可能性が比較的低い場合でも同様です。
  • answerable_probability を返す - 回答が根拠があり正しい確率のモデルの推定値。

answerable_probability が低い場合は、次のいずれかの要因が考えられます。

  • モデルは回答が正しいと確信していません。
  • モデルは、その答えが引用された文章に根拠があることに確信を持てません。その答えは、世界の知識から導出されたものかもしれません。例: question="1+1=?", passages=["2+2=4”]answer=2, answerable_probability=0.02
  • モデルは関連する情報を提供したが、質問に完全には答えなかった。例: 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"
  • GenerateAnswerRequest で適切な形式の質問が行われていません。

answerable_probability が低い値の場合、GenerateAnswerResponse.answer が間違っているか根拠がない可能性が高いため、answerable_probability を調べてレスポンスをさらに処理することを強くおすすめします

answerable_probability が低い場合、一部のクライアントは次のことを要求する可能性があります。

  • 「その質問には回答できませんでした」というようなメッセージをエンドユーザーに表示します。
  • 世界知識から質問に答える汎用 LLM にフォールバックします。このようなフォールバックしきい値と性質は、個々のユースケースによって異なります。answerable_probability <= 0.5 の値は、開始時のしきい値として適しています。

AQA のヒント

API の詳細な仕様については、GenerateAnswerRequest API リファレンスをご覧ください。

  • パッセージの長さ: 1 パッセージあたり最大 300 トークンをおすすめします。
  • 通路の並べ替え:
    • GenerateAnswerRequest.inline_passages を指定すると、クエリとの関連性が低い順に段落が並べ替えられます。モデルのコンテキスト長の上限を超えると、最後の(関連性が最も低い)パッセージが省略されます。
    • GenerateAnswerRequest.semantic_retriever を指定すると、関連性に基づく並べ替えが自動的に行われます。
  • 制限事項: AQA モデルは質問応答に特化しています。創作文、要約など、他のユースケースの場合は、GenerateContent を介して汎用モデルを呼び出してください。
    • チャット: ユーザー入力が特定のコンテキストから回答可能な質問であることが判明している場合、AQA はチャット クエリに回答できます。ただし、ユーザー入力が任意の種類のエントリである可能性がある場合は、汎用モデルの方が適している場合があります。
  • 温度:
    • 通常、正確な AQA を得るには、比較的低い温度(約 0.2)を推奨します。
    • ユースケースが決定論的な出力に依存している場合は、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)

その他のオプション: AQA の「インライン パッセージを使用」

また、inline_passages を渡して Semantic Retriever API を使用せずに、AQA エンドポイントを直接使用することもできます。

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)

コーパスを共有する

CreatePermissionRequest API を使用してコーパスを他のユーザーと共有できます。

制約:

  • 共有には、READEREDITOR の 2 つのロールがあります。
    • READER はコーパスをクエリできます。
    • WRITER には読み取り者の権限に加えて、コーパスの編集と共有の権限があります。
  • EVERYONEuser_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)

コーパスを削除する

DeleteCorpusRequest を使用して、ユーザー コーパスと、関連付けられているすべての DocumentChunk を削除します。

空ではないコーパスでは、force=True フラグを指定しないとエラーがスローされます。force=True を設定すると、この Document に関連付けられている Chunk とオブジェクトも削除されます。

force=False(デフォルト)と DocumentChunk が含まれている場合、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)

まとめと関連情報

このガイドでは、Generative Language API の Semantic Retriever API と Attributed Question &Answering(AQA)API を紹介し、これを使用してカスタム テキストデータに対してセマンティック情報を取得する方法を紹介しました。この API は LlamaIndex データ フレームワークでも動作します。詳しくは、チュートリアルをご覧ください。

利用可能なその他の機能については、API ドキュメントもご覧ください。

付録: ユーザー認証情報を使用して OAuth を設定する

OAuth クイックスタートの手順に沿って、OAuth 認証を設定します。

  1. OAuth 同意画面を構成する

  2. デスクトップ アプリケーションの認証情報を承認する。このノートブックを Colab で実行するには、まず認証情報ファイル(通常は client_secret_*.json)の名前を client_secret.json に変更します。次に、左側のサイドバーにあるファイル アイコン、アップロード アイコンの順にクリックして、ファイルをアップロードします(下のスクリーンショットを参照)。

# 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"

クライアント ライブラリを初期化し、[コーパスを作成する] からノートブックを再実行します。

import google.ai.generativelanguage as glm

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