Memulai pengambilan semantik

Lihat di ai.google.dev Mencoba notebook Colab Lihat notebook di GitHub

Ringkasan

Model Bahasa Besar (LLM) dapat mempelajari kemampuan baru tanpa dilatih secara langsung. Namun, LLM diketahui "mengalami halusinasi" saat ditugaskan untuk memberikan respons atas pertanyaan yang belum dilatih. Hal ini sebagian karena LLM tidak mengetahui peristiwa setelah pelatihan. Sangat sulit juga untuk melacak sumber yang digunakan LLM untuk membuat responsnya. Untuk aplikasi yang andal dan skalabel, LLM harus memberikan respons yang didasarkan pada fakta dan dapat mengutip sumber informasinya.

Pendekatan umum yang digunakan untuk mengatasi kendala ini disebut Retrieval Augmented Generation (RAG), yang meningkatkan prompt yang dikirim ke LLM dengan data relevan yang diambil dari pusat informasi eksternal melalui mekanisme Pengambilan Informasi (IR). Basis pengetahuan dapat berupa korpus dokumen, database, atau API Anda sendiri.

Notebook ini memandu Anda melalui alur kerja untuk meningkatkan respons LLM dengan menambah pengetahuannya dengan korpus teks eksternal dan melakukan pengambilan informasi semantik untuk menjawab pertanyaan menggunakan Semantic Retriever dan Attributed Question & Answering (AQA) API dari Generative Language API.

Penyiapan

Mengimpor Generative Language API

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

Autentikasikan

Semantic Retriever API memungkinkan Anda melakukan penelusuran semantik pada data Anda sendiri. Karena merupakan data Anda, kontrol akses yang lebih ketat diperlukan daripada kunci API. Lakukan autentikasi dengan OAuth menggunakan akun layanan atau melalui kredensial pengguna Anda.

Panduan memulai ini menggunakan pendekatan autentikasi sederhana yang ditujukan untuk lingkungan pengujian, dan penyiapan akun layanan biasanya lebih mudah untuk dimulai. Untuk lingkungan produksi, pelajari autentikasi dan otorisasi sebelum memilih kredensial akses yang sesuai untuk aplikasi Anda.

Menyiapkan OAuth menggunakan akun layanan

Ikuti langkah-langkah di bawah untuk menyiapkan OAuth menggunakan akun layanan:

  1. Aktifkan Generative Language API.

  1. Buat Akun Layanan dengan mengikuti dokumentasi.

    • Setelah membuat akun layanan, buat kunci akun layanan.

  1. Upload file akun layanan Anda menggunakan ikon file di sidebar kiri, lalu ikon upload, seperti yang ditunjukkan pada screenshot di bawah.

    • Ganti nama file yang diupload menjadi service_account_key.json atau ubah variabel service_account_file_name pada kode di bawah.

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

Lakukan inisialisasi library klien menggunakan kredensial akun layanan.

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)

Membuat korpus

Semantic Retriever API memungkinkan Anda menentukan hingga 5 korpus teks kustom per project. Anda dapat menentukan salah satu kolom berikut saat menentukan korpus:

  • name: Nama resource (ID) Corpus. Hanya boleh berisi maksimal 40 karakter alfanumerik. Jika name kosong saat pembuatan, nama unik akan dibuat dengan panjang maksimum 40 karakter dengan awalan dari display_name dan akhiran acak 12 karakter.
  • display_name: Nama tampilan yang dapat dibaca manusia untuk Corpus. Hanya boleh berisi maksimal 512 karakter, termasuk alfanumerik, spasi, dan tanda hubung.
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
}

Mendapatkan korpus yang dibuat

Gunakan metode GetCorpusRequest untuk mengakses Corpus yang Anda buat di atas secara terprogram. Nilai parameter name mengacu pada nama resource lengkap Corpus dan ditetapkan di sel di atas sebagai corpus_resource_name. Format yang diharapkan adalah 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)

Buat dokumen

Corpus dapat berisi hingga 10.000 Document. Anda dapat menentukan salah satu kolom berikut saat menentukan dokumen:

  • name: Nama resource (ID) Document. Hanya boleh berisi maksimum 40 karakter (hanya alfanumerik atau tanda hubung). ID tidak dapat diawali atau diakhiri dengan tanda hubung. Jika nama kosong saat pembuatan, nama unik akan berasal dari display_name beserta akhiran acak 12 karakter.
  • display_name: Nama tampilan yang dapat dibaca manusia. Hanya boleh berisi maksimal 512 karakter, termasuk alfanumerik, spasi, dan tanda hubung.

Document juga mendukung hingga 20 kolom custom_metadata yang ditentukan pengguna, yang ditentukan sebagai key-value pair. Metadata kustom dapat berupa string, daftar string, atau numerik. Perhatikan bahwa daftar string dapat mendukung maksimum 10 nilai dan nilai numerik direpresentasikan sebagai angka floating point di 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)

Mendapatkan dokumen yang dibuat

Gunakan metode GetDocumentRequest untuk mengakses dokumen yang Anda buat di atas secara terprogram. Nilai parameter name mengacu pada nama resource lengkap dokumen dan ditetapkan di sel di atas sebagai document_resource_name. Format yang diharapkan adalah 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)

Menyerap &Potong Dokumen

Untuk meningkatkan relevansi konten yang ditampilkan oleh database vektor selama pengambilan semantik, uraikan dokumen besar menjadi bagian atau bagian yang lebih kecil saat menyerap dokumen.

Chunk adalah subbagian dari Document yang diperlakukan sebagai unit independen untuk tujuan representasi dan penyimpanan vektor. Chunk dapat memiliki maksimum 2.043 token. Corpus dapat memiliki maksimum 1 juta Chunk.

Serupa dengan Document, Chunks juga mendukung hingga 20 kolom custom_metadata yang ditentukan pengguna, yang ditentukan sebagai key-value pair. Metadata kustom dapat berupa string, daftar string, atau numerik. Perhatikan bahwa daftar string dapat mendukung maksimum 10 nilai dan nilai numerik dinyatakan sebagai angka floating point di API.

Panduan ini menggunakan Open Source HtmlChunker Google.

Pembuat bagian lain yang dapat Anda gunakan meliputi LangChain atau LlamaIndex.

Serap HTML dan potong melalui HTMLChunker

!pip install google-labs-html-chunker

from google_labs_html_chunker.html_chunker import HtmlChunker

from urllib.request import urlopen

Mendapatkan DOM HTML untuk situs. Di sini, HTML dibaca secara langsung, tetapi akan lebih baik jika pasca-rendering HTML menyertakan HTML yang dimasukkan JavaScript seperti 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")

Uraikan dokumen teks menjadi beberapa bagian dan buat Chunk dari bagian-bagian ini. Langkah ini membuat objek Chunk itu sendiri dan bagian berikutnya akan menguploadnya ke 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)

Membuat potongan secara batch

Membuat potongan dalam batch. Anda dapat menentukan maksimum 100 bagian per permintaan batch.

Gunakan CreateChunk() untuk pembuatan satu bagian.

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

Sebagai alternatif, Anda dapat membuat potongan tanpa menggunakan 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)

Mencantumkan Chunk dan mendapatkan status

Gunakan metode ListChunksRequest untuk mendapatkan semua Chunk yang tersedia sebagai daftar yang diberi nomor halaman dengan batas ukuran maksimum 100 Chunk per halaman, yang diurutkan dalam urutan menaik Chunk.create_time. Jika Anda tidak menentukan batas, maksimum 10 Chunk akan ditampilkan.

Berikan next_page_token yang ditampilkan dalam respons ListChunksRequest sebagai argumen ke permintaan berikutnya untuk mengambil halaman berikutnya. Perhatikan bahwa saat melakukan penomoran halaman, semua parameter lain yang diberikan untuk ListChunks harus sesuai dengan panggilan yang menyediakan token halaman.

Semua Chunk menampilkan state. Gunakan ini untuk memeriksa status Chunks sebelum membuat kueri Corpus. Status Chunk mencakup - UNSPECIFIED, PENDING_PROCESSING, ACTIVE, dan FAILED. Anda hanya dapat membuat kueri 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}')

Mengambil dokumen lain

Tambahkan Document lain melalui HtmlChunker dan tambahkan filter.

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

Membuat kueri korpus

Gunakan metode QueryCorpusRequest untuk melakukan penelusuran semantik guna mendapatkan bagian yang relevan.

  • results_count: Menentukan jumlah bagian yang akan ditampilkan. Jumlah maksimumnya adalah 100. Jika tidak ditentukan, API akan menampilkan maksimum 10 Chunk.
  • metadata_filters: Filter menurut chunk_metadata atau document_metadata. Setiap MetadataFilter harus sesuai dengan kunci unik. Beberapa objek MetadataFilter digabungkan dengan AND logis. Kondisi filter metadata yang serupa digabungkan dengan OR logis. Beberapa contohnya:
(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} }]
  }]

Perhatikan bahwa hanya nilai numerik yang mendukung "AND" untuk kunci yang sama. Nilai string hanya mendukung "OR" untuk kunci yang sama.

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

Tanya Jawab yang Diatribusikan

Gunakan metode GenerateAnswer untuk melakukan Pertanyaan-Jawaban Beratribut pada dokumen, korpus, atau serangkaian bagian.

Penjawaban Pertanyaan dengan Atribusi (AQA) mengacu pada menjawab pertanyaan yang didasarkan pada konteks tertentu dan memberikan atribusi, sekaligus meminimalkan halusinasi.

GenerateAnswer memberikan beberapa keunggulan dibandingkan menggunakan LLM yang tidak disetel, jika AQA diinginkan:

  • Model yang mendasarinya telah dilatih untuk hanya menampilkan jawaban yang didasarkan pada konteks yang diberikan.
  • Bagian ini mengidentifikasi atribusi (segmen dari konteks yang diberikan yang berkontribusi pada jawaban). Atribusi memungkinkan pengguna memverifikasi jawaban.
  • Model ini memperkirakan answerable_probability untuk pasangan (pertanyaan, konteks) tertentu, yang lebih lanjut memungkinkan Anda mengalihkan perilaku produk bergantung pada kemungkinan jawaban yang ditampilkan akan berdasar dan benar.

answerable_probability dan masalah “Saya tidak tahu”

Dalam beberapa kasus, respons terbaik untuk pertanyaan sebenarnya adalah “Saya tidak tahu”. Misalnya, jika konteks yang diberikan tidak berisi jawaban atas pertanyaan, pertanyaan tersebut dianggap “tidak dapat dijawab”.

Model AQA sangat mahir dalam mengenali kasus tersebut. Model ini bahkan dapat membedakan antara tingkat kemampuan menjawab dan ketidakmampuan menjawab.

Namun, GenerateAnswer API memberikan wewenang pengambilan keputusan akhir kepada Anda dengan:

  • Selalu berusaha menampilkan jawaban dasar - meski jawaban tersebut kemungkinan tidak beralasan dan benar.
  • Menampilkan nilai answerable_probability - Estimasi model tentang probabilitas bahwa jawabannya berdasar dan benar.

answerable_probability rendah dapat dijelaskan oleh 1 atau beberapa faktor berikut:

  • Model tidak yakin bahwa jawabannya benar.
  • Model tidak yakin bahwa jawabannya didasarkan pada bagian yang dikutip; Jawabannya mungkin berasal dari pengetahuan dunia. Misalnya: question="1+1=?", passages=["2+2=4”]answer=2, answerable_probability=0.02
  • Model memberikan informasi yang relevan yang tidak sepenuhnya menjawab pertanyaan. Contoh: 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"
  • Tidak ada pertanyaan yang diajukan dengan benar di GenerateAnswerRequest.

Karena answerable_probability yang rendah menunjukkan bahwa GenerateAnswerResponse.answer kemungkinan salah atau tidak berdasar, sebaiknya proses respons lebih lanjut dengan memeriksa answerable_probability.

Jika answerable_probability rendah, beberapa klien mungkin ingin:

  • Tampilkan pesan dengan efek "tidak dapat menjawab pertanyaan tersebut" kepada pengguna akhir.
  • Kembali ke LLM tujuan umum yang menjawab pertanyaan dari pengetahuan dunia. Batas dan sifat penggantian tersebut akan bergantung pada masing-masing kasus penggunaan. Nilai answerable_probability <= 0,5 adalah nilai minimum awal yang baik.

Tips Bermanfaat AQA

Untuk mengetahui spesifikasi API lengkap, lihat Referensi API GenerateAnswerRequest.

  • Panjang bagian: Sebaiknya gunakan maksimal 300 token per bagian.
  • Pengurutan bagian:
  • Keterbatasan: Model AQA dikhususkan untuk proses menjawab pertanyaan. Untuk kasus penggunaan lainnya seperti penulisan kreatif, peringkasan, dll., harap panggil model tujuan umum melalui GenerateContent.
    • Chat: Jika input pengguna diketahui sebagai pertanyaan yang dapat dijawab dari konteks tertentu, AQA dapat menjawab kueri chat. Namun, jika input pengguna dapat berupa jenis entri apa pun, model tujuan umum mungkin merupakan pilihan yang lebih baik.
  • Suhu:
    • Umumnya, suhu yang relatif rendah (~0,2) direkomendasikan untuk AQA yang akurat.
    • Jika kasus penggunaan Anda mengandalkan output deterministik, tetapkan 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)

Opsi Lainnya: AQA Menggunakan Bagian Inline

Atau, Anda dapat menggunakan endpoint AQA secara langsung, tanpa menggunakan Semantic Retriever API dengan meneruskan 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)

Membagikan korpus

Anda dapat memilih untuk membagikan korpus kepada orang lain menggunakan CreatePermissionRequest API.

Batasan:

  • Ada 2 peran untuk berbagi: READER dan EDITOR.
    • READER dapat membuat kueri korpus.
    • WRITER memiliki izin pembaca dan juga dapat mengedit serta membagikan korpus.
  • Korpus dapat bersifat publik dengan memberikan EVERYONE sebagai akses baca 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)

Menghapus korpus

Gunakan DeleteCorpusRequest untuk menghapus korpus pengguna serta semua Document &Chunk terkait.

Perhatikan bahwa korpus yang tidak kosong akan menampilkan error tanpa menentukan flag force=True. Jika Anda menetapkan force=True, semua Chunk dan objek yang terkait dengan Document ini juga akan dihapus.

Jika force=False (default) dan Document berisi Chunk, error FAILED_PRECONDITION akan ditampilkan.

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

Ringkasan dan bacaan lebih lanjut

Panduan ini memperkenalkan API Pengambil Semantik dan Pertanyaan & Jawaban Beratribut (AQA) dari Generative Language API dan menunjukkan cara menggunakannya untuk melakukan pengambilan informasi semantik pada data teks kustom Anda. Perhatikan bahwa API ini juga berfungsi dengan framework data LlamaIndex. Lihat tutorial untuk mempelajari lebih lanjut.

Lihat juga dokumen API untuk mempelajari lebih lanjut fungsi lain yang tersedia.

Lampiran: Menyiapkan OAuth dengan kredensial pengguna

Ikuti langkah-langkah di bawah dari Panduan Memulai OAuth untuk menyiapkan autentikasi OAuth.

  1. Konfigurasikan layar izin OAuth.

  2. Mengizinkan kredensial untuk aplikasi desktop. Untuk menjalankan notebook ini di Colab, ganti nama file kredensial Anda (biasanya client_secret_*.json) menjadi client_secret.json saja. Kemudian, upload file menggunakan ikon file di sidebar kiri, lalu ikon upload, seperti yang ditunjukkan pada screenshot di bawah.

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

Lakukan inisialisasi pada library klien dan jalankan ulang notebook mulai dari Membuat korpus.

import google.ai.generativelanguage as glm

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