Lihat di ai.google.dev | Coba notebook Colab | Lihat notebook di GitHub |
Ringkasan
Model Bahasa Besar (LLM) dapat mempelajari kemampuan baru tanpa dilatih langsung. Namun, LLM sudah diketahui bisa "berhalusinasi" ketika ditugaskan untuk menjawab pertanyaan yang belum dilatih. Hal ini sebagian karena LLM tidak mengetahui event setelah pelatihan. Selain itu, sangat sulit untuk melacak sumber dari mana LLM mengambil respons mereka. 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 informasi dapat berupa korpora dokumen, database, atau API Anda sendiri.
Notebook ini akan memandu Anda dalam alur kerja untuk meningkatkan respons LLM dengan menambah pengetahuannya menggunakan korpora teks eksternal, dan melakukan pengambilan informasi semantik guna menjawab pertanyaan menggunakan Semantic Retriever dan Attributed Question & API Penjawaban (AQA) 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. Autentikasi dengan OAuth dengan akun layanan atau melalui kredensial pengguna Anda.
Panduan memulai ini menggunakan pendekatan autentikasi sederhana yang ditujukan untuk lingkungan pengujian, dan pembuatan 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 korpora teks kustom per project. Anda dapat menentukan salah satu kolom berikut saat menentukan korpora:
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 secara terprogram Corpus
yang Anda buat di atas. Nilai parameter name
mengacu pada nama lengkap resource Corpus
dan ditetapkan dalam 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 maksimal 40 karakter (alfanumerik atau tanda hubung saja). ID tidak boleh diawali atau diakhiri dengan tanda hubung. Jika nama tersebut kosong saat pembuatan, nama unik akan diambil daridisplay_name
dengan 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 pasangan nilai kunci. 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.
# 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 dalam 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)
Serap & 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 maksimal 2043 token. Corpus
dapat memiliki maksimum 1 juta Chunk
.
Serupa dengan Document
, Chunks
juga mendukung maksimal 20 kolom custom_metadata
yang ditentukan pengguna, yang ditentukan sebagai pasangan nilai kunci. 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 HTMLChunker Open Source Google.
Potongan besar 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
Dapatkan DOM HTML untuk situs web. Di sini, HTML dibaca
secara langsung, tetapi
lebih baik mendapatkan HTML pasca-rendering untuk menyertakan HTML yang dimasukkan JavaScript
misalnya 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 akan membuat objek Chunk
itu sendiri dan bagian berikutnya 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 potongan 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 bagi permintaan berikutnya untuk mengambil halaman berikutnya. Perhatikan bahwa saat memberi nomor halaman, semua parameter lain yang diberikan ke ListChunks
harus cocok 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 mengajukan 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}')
Serap 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
yang logis. Kondisi filter metadata yang serupa digabungkan denganOR
yang 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. {i>String<i} nilai tersebut 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 Tanya Jawab Beratribusi pada dokumen, korpus, atau sekumpulan bagian.
Attributed Question-Answering (AQA) mengacu pada menjawab pertanyaan yang didasarkan pada konteks tertentu dan memberikan atribusi, sekaligus meminimalkan halusinasi.
GenerateAnswer
memberikan beberapa keuntungan dibandingkan menggunakan LLM yang tidak disesuaikan, 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.
- Fitur ini memperkirakan
answerable_probability
untuk pasangan (pertanyaan, konteks) tertentu, yang makin memberdayakan Anda untuk mengalihkan perilaku produk, bergantung pada seberapa besar kemungkinan jawaban yang ditampilkan didasarkan dan benar.
answerable_probability
dan masalah “Saya tidak tahu”
Dalam beberapa kasus, jawaban terbaik terhadap pertanyaan tersebut adalah “Saya tidak tahu”. Misalnya, jika konteks yang diberikan tidak berisi jawaban atas suatu pertanyaan, maka pertanyaan tersebut dianggap “tidak dapat dijawab”.
Model AQA sangat mahir dalam mengenali kasus semacam itu. Bahkan, alat ini dapat membedakan tingkat kemampuan yang dapat dijawab dan tidak dapat dijawab.
Namun, GenerateAnswer
API memberikan kendali penuh atas pengambilan keputusan di tangan Anda dengan:
- Selalu berusaha menampilkan jawaban dasar - meski jawaban tersebut kemungkinan tidak beralasan dan benar.
- Menampilkan nilai
answerable_probability
- Perkiraan model tentang probabilitas bahwa jawaban tersebut didasarkan 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 diperoleh dari pengetahuan dunia. Misalnya:
question="1+1=?", passages=["2+2=4”]
→answer=2, answerable_probability=0.02
- Model memberikan informasi 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 disusun dengan baik di GenerateAnswerRequest.
Karena answerable_probability
yang rendah menunjukkan bahwa GenerateAnswerResponse.answer mungkin salah atau tidak didasarkan, sangat disarankan untuk memproses respons lebih lanjut dengan memeriksa answerable_probability
.
Jika answerable_probability
rendah, beberapa klien mungkin ingin:
- Menampilkan pesan sebagai 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 kasus penggunaan individual. Nilai
answerable_probability
<= 0,5 adalah nilai minimum awal yang baik.
Tips Bermanfaat AQA
Untuk spesifikasi API lengkap, lihat Referensi API GenerateAnswerRequest
.
- Panjang bagian: Maksimal 300 token per bagian.
- Penyortiran bagian:
- Jika Anda memberikan
GenerateAnswerRequest.inline_passages
, bagian harus diurutkan secara menurun sesuai urutan 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, perangkuman, dll., panggil model tujuan umum melalui GenerateContent.
- Chat: Jika input pengguna diketahui sebagai pertanyaan yang mungkin dapat dijawab dari konteks tertentu, AQA dapat menjawab kueri chat. Tetapi jika input pengguna bisa berupa jenis entri apa pun, model dengan 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 bergantung pada output determenistik, 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.
{i>Constraints<i} (Batasan):
- Ada 2 peran untuk berbagi:
READER
danEDITOR
.READER
dapat mengkueri korpus.WRITER
memiliki izin pembaca dan juga dapat mengedit serta membagikan korpus.
- Korpus dapat bersifat publik dengan memberi
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)
Hapus korpus
Gunakan DeleteCorpusRequest
untuk menghapus korpus pengguna dan semua Document
terkait & Chunk
.
Perhatikan bahwa korpora yang tidak kosong akan menampilkan error tanpa menentukan tanda 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 Pengambil Semantik dan Pertanyaan yang Diatribusikan & API Penjawaban (AQA) dari Generative Language API dan menunjukkan cara menggunakannya untuk melakukan pengambilan informasi semantik pada data teks kustom Anda. Perlu diperhatikan 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.
Otorisasi kredensial untuk aplikasi desktop. Untuk menjalankan notebook ini di Colab, ganti nama file kredensial Anda (biasanya
client_secret_*.json
) terlebih dahulu menjadiclient_secret.json
. Kemudian upload file dengan 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 library klien dan jalankan ulang notebook mulai dari Create a corpus.
import google.ai.generativelanguage as glm
generative_service_client = glm.GenerativeServiceClient()
retriever_service_client = glm.RetrieverServiceClient()
permission_service_client = glm.PermissionServiceClient()