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:
- Aktifkan Generative Language API.
Buat Akun Layanan dengan mengikuti dokumentasi.
- Setelah membuat akun layanan, buat kunci akun layanan.
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 variabelservice_account_file_name
pada kode di bawah.
- Ganti nama file yang diupload menjadi
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. Jikaname
kosong saat pembuatan, nama unik akan dibuat dengan panjang maksimum 40 karakter dengan awalan daridisplay_name
dan akhiran acak 12 karakter.display_name
: Nama tampilan yang dapat dibaca manusia untukCorpus
. 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 daridisplay_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 10Chunk
.metadata_filters
: Filter menurutchunk_metadata
ataudocument_metadata
. SetiapMetadataFilter
harus sesuai dengan kunci unik. Beberapa objekMetadataFilter
digabungkan denganAND
logis. Kondisi filter metadata yang serupa digabungkan denganOR
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:
- Jika Anda memberikan
GenerateAnswerRequest.inline_passages
, bagian harus diurutkan secara menurun menurut relevansi dengan kueri. Jika batas panjang konteks model terlampaui, bagian terakhir (yang paling tidak relevan) akan dihilangkan. - Jika Anda memberikan
GenerateAnswerRequest.semantic_retriever
, penyortiran relevansi akan dilakukan secara otomatis untuk Anda.
- Jika Anda memberikan
- 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
danEDITOR
.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 bacauser_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.
Mengizinkan kredensial untuk aplikasi desktop. Untuk menjalankan notebook ini di Colab, ganti nama file kredensial Anda (biasanya
client_secret_*.json
) menjadiclient_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()