![]() | ![]() | ![]() |
نمای کلی
مدلهای زبان بزرگ (LLM) میتوانند تواناییهای جدید را بدون اینکه مستقیماً روی آنها آموزش ببینند، بیاموزند. با این حال، LLM ها زمانی که وظیفه ارائه پاسخ برای سوالاتی که در مورد آنها آموزش ندیده اند، "توهم" می کنند. این تا حدی به این دلیل است که LLM ها از رویدادهای بعد از آموزش بی اطلاع هستند. همچنین ردیابی منابعی که LLM ها پاسخ های خود را از آنها می گیرند بسیار دشوار است. برای کاربردهای قابل اعتماد و مقیاسپذیر، مهم است که یک LLM پاسخهایی را ارائه دهد که بر اساس حقایق باشد و بتواند منابع اطلاعاتی خود را استناد کند.
یک رویکرد متداول که برای غلبه بر این محدودیتها استفاده میشود، Retrieval Augmented Generation (RAG) نامیده میشود که درخواست ارسال شده به LLM را با دادههای مربوطه بازیابی شده از یک پایگاه دانش خارجی از طریق مکانیزم بازیابی اطلاعات (IR) تقویت میکند. پایگاه دانش می تواند مجموعه اسناد، پایگاه های داده یا API های خود شما باشد.
این نوت بوک شما را از طریق یک گردش کار راهنمایی می کند تا پاسخ یک LLM را با تقویت دانش آن با مجموعه های متنی خارجی و انجام بازیابی اطلاعات معنایی برای پاسخ دادن به سؤالات با استفاده از Semantic Retriever و APIهای پرسش و پاسخ منتسب (AQA) از API زبان تولیدی، بهبود بخشد.
راه اندازی
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 با استفاده از حساب های سرویس، مراحل زیر را دنبال کنید:
- API زبان تولیدی را فعال کنید.
با دنبال کردن مستندات ، حساب سرویس ایجاد کنید.
- پس از ایجاد حساب سرویس، یک کلید حساب سرویس ایجاد کنید.
فایل حساب سرویس خود را با استفاده از نماد فایل در نوار کناری سمت چپ، سپس نماد آپلود، همانطور که در تصویر زیر نشان داده شده است، آپلود کنید.
- نام فایل آپلود شده را به
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
در هنگام ایجاد خالی باشد، یک نام منحصر به فرد با حداکثر طول 40 کاراکتر با پیشوندی ازdisplay_name
و یک پسوند تصادفی 12 کاراکتری ایجاد میشود. -
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
می تواند تا 10000 Document
داشته باشد. هنگام تعریف اسناد خود می توانید یکی از فیلدهای زیر را مشخص کنید:
-
name
: نام منبعDocument
(ID). باید فقط حداکثر 40 کاراکتر (فقط حروف عددی یا خط تیره) داشته باشد. شناسه نمی تواند با خط تیره شروع یا پایان یابد. اگر نام در هنگام ایجاد خالی باشد، یک نام منحصر به فرد ازdisplay_name
به همراه یک پسوند تصادفی 12 کاراکتری مشتق می شود. -
display_name
: نام نمایشی قابل خواندن توسط انسان. باید فقط حداکثر 512 کاراکتر از جمله حروف عددی، فاصله و خط تیره داشته باشد.
Document
همچنین از 20 فیلد custom_metadata
مشخص شده توسط کاربر، که به عنوان جفت کلید-مقدار مشخص شده اند، پشتیبانی می کند. ابرداده سفارشی می تواند رشته، لیست رشته ها یا عددی باشد. توجه داشته باشید که لیست رشته ها می توانند حداکثر 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
می تواند حداکثر 2043 توکن داشته باشد. یک Corpus
حداکثر می تواند 1 میلیون Chunk
داشته باشد.
مشابه Document
s، Chunks
همچنین از 20 فیلد custom_metadata
مشخص شده توسط کاربر، که به عنوان جفت کلید-مقدار مشخص شده اند، پشتیبانی می کند. ابرداده سفارشی می تواند رشته، لیست رشته ها یا عددی باشد. توجه داشته باشید که لیست رشته ها می توانند حداکثر 10 مقدار را پشتیبانی کنند و مقادیر عددی به صورت اعداد ممیز شناور در API نمایش داده می شوند.
این راهنما از HtmlChunker منبع باز Google استفاده می کند.
سایر chunkers که می توانید استفاده کنید عبارتند از LangChain یا LlamaIndex .
HTML و قطعه را از طریق HtmlChunker وارد کنید
!pip install google-labs-html-chunker
from google_labs_html_chunker.html_chunker import HtmlChunker
from urllib.request import urlopen
دریافت HTML DOM برای یک وب سایت. در اینجا، HTML مستقیما خوانده می شود، اما بهتر است HTML پس از رندرینگ شامل HTML تزریق شده با جاوا اسکریپت مانند 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")
سند متنی را به قسمتهایی تقسیم کنید و از این قسمتها 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
s را فهرست کرده و حالت را دریافت کنید
از روش ListChunksRequest
استفاده کنید تا تمام Chunk
موجود را به صورت فهرست صفحه بندی شده با حداکثر اندازه 100 Chunk
در هر صفحه به دست آورید که به ترتیب صعودی Chunk.create_time
مرتب شده اند. اگر محدودیتی را تعیین نکنید، حداکثر 10 Chunk
برگردانده می شود.
next_page_token
بازگردانده شده در پاسخ ListChunksRequest
را به عنوان آرگومان برای درخواست بعدی برای بازیابی صفحه بعدی ارائه دهید. توجه داشته باشید که هنگام صفحه بندی، تمام پارامترهای دیگر ارائه شده به ListChunks
باید با فراخوانی که توکن صفحه را ارائه می کند مطابقت داشته باشد.
همه Chunk
ها state
برمی گردانند. از این برای بررسی وضعیت Chunks
قبل از پرس و جو از یک Corpus
استفاده کنید. حالت های Chunk
شامل - UNSPECIFIED
، PENDING_PROCESSING
، ACTIVE
، و FAILED
. شما فقط می توانید ACTIVE
Chunk
s را پرس و جو کنید.
# 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}')
یک سند دیگر را بلعید
Document
دیگری را از طریق HtmlChunker اضافه کنید و فیلترها را اضافه کنید.
# 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 حداکثر 10Chunk
s را برمی گرداند. -
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
چندین مزیت را نسبت به استفاده از یک LLM تنظیم نشده، در مواردی که AQA مورد نظر است، ارائه می دهد:
- مدل زیربنایی طوری آموزش داده شده است که فقط پاسخ هایی را ارائه دهد که در زمینه ارائه شده پایه گذاری شده اند.
- اسنادها (بخش هایی از زمینه ارائه شده که به پاسخ کمک کردند) را شناسایی می کند. Attributions کاربر را قادر می سازد تا پاسخ را تأیید کند.
-
answerable_probability
برای یک جفت داده شده (سؤال، زمینه) تخمین میزند، که به شما این امکان را میدهد تا رفتار محصول را بسته به اینکه چقدر احتمال دارد پاسخ برگشتی منطقی و صحیح باشد، تغییر دهید.
answerable_probability
و مشکل "نمی دانم".
در برخی موارد، بهترین پاسخ به این سوال در واقع «نمیدانم» است. به عنوان مثال، اگر متن ارائه شده حاوی پاسخ سؤال نباشد، سؤال «بی پاسخ» در نظر گرفته می شود.
مدل AQA در تشخیص چنین مواردی مهارت بالایی دارد. حتی می تواند بین درجات پاسخگویی و عدم پاسخگویی تمایز قائل شود.
با این حال، GenerateAnswer
API قدرت تصمیم گیری نهایی را در دستان شما قرار می دهد:
- همیشه تلاش برای برگرداندن یک پاسخ مبتنی بر پایه - حتی زمانی که آن پاسخ نسبتاً بعید است که پایه و درست باشد.
- برگرداندن یک مقدار
answerable_probability
- تخمین مدل از احتمال منطقی و صحیح بودن پاسخ.
answerable_probability
کم ممکن است با 1 یا چند عامل زیر توضیح داده شود:
- مدل مطمئن نیست که پاسخ آن صحیح است.
- مدل مطمئن نیست که پاسخ آن در عبارات ذکر شده است. پاسخ ممکن است در عوض از دانش جهانی گرفته شود. به عنوان مثال:
question="1+1=?", passages=["2+2=4”]
→answer=2, answerable_probability=0.02
- مدل اطلاعات مرتبطی را ارائه کرد که به طور کامل به سؤال پاسخ نداد. Example:
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 مراجعه کنید.
- طول گذر : حداکثر 300 توکن در هر گذر توصیه می شود.
- مرتب سازی معابر :
- اگر
GenerateAnswerRequest.inline_passages
را ارائه کنید، متن ها باید به ترتیب کاهش مرتبط با پرس و جو مرتب شوند. اگر از محدودیت طول بافت مدل تجاوز شود، آخرین (کمترین ارتباط) قسمت ها حذف خواهند شد. - اگر
GenerateAnswerRequest.semantic_retriever
را ارائه دهید، مرتبسازی ارتباط بهطور خودکار برای شما انجام میشود.
- اگر
- محدودیت ها : مدل AQA برای پاسخگویی به سؤالات تخصصی است. برای موارد استفاده دیگر مانند نوشتن خلاقانه، خلاصهنویسی و غیره، لطفاً از طریق GenerateContent با یک مدل همه منظوره تماس بگیرید.
- چت : اگر ورودی کاربر به عنوان سؤالی است که ممکن است از یک زمینه خاص قابل پاسخ باشد، AQA می تواند به سؤالات چت پاسخ دهد. اما اگر ورودی کاربر ممکن است هر نوع ورودی باشد، یک مدل همه منظوره ممکن است انتخاب بهتری باشد.
- دما :
- به طور کلی، دمای نسبتاً پایین (~0.2) برای AQA دقیق توصیه می شود.
- اگر مورد استفاده شما به خروجی های قطعی متکی است، دما را = 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 با استفاده از مسیرهای درون خطی
همچنین، میتوانید مستقیماً از نقطه پایانی AQA بدون استفاده از Semantic Retriever API با عبور 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)
مجموعه را به اشتراک بگذارید
میتوانید با استفاده از CreatePermissionRequest
API، مجموعه را با دیگران به اشتراک بگذارید.
محدودیت ها:
- 2 نقش برای اشتراک گذاری وجود دارد:
READER
وEDITOR
.- یک
READER
می تواند مجموعه را پرس و جو کند. - یک
WRITER
دارای مجوزهای خواننده است و علاوه بر این می تواند مجموعه را ویرایش و به اشتراک بگذارد.
- یک
- یک مجموعه میتواند با اعطای دسترسی خواندن
EVERYONE
به عنوان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)
مجموعه را حذف کنید
از DeleteCorpusRequest
برای حذف یک مجموعه کاربر و همه Document
و Chunk
مرتبط استفاده کنید.
توجه داشته باشید که بدنههای خالی بدون تعیین force=True
flag خطا میکنند. اگر force=True
را تنظیم کنید، هر Chunk
و اشیاء مربوط به این Document
نیز حذف خواهد شد.
اگر force=False
(پیشفرض) و Document
حاوی هر Chunk
باشد، یک خطای 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)
خلاصه و ادامه مطلب
این راهنما، APIهای بازیابی معنایی و پرسش و پاسخ منتسب (AQA) را از API زبان تولیدی معرفی کرد و نشان داد که چگونه میتوانید از آن برای انجام بازیابی اطلاعات معنایی روی دادههای متن سفارشی خود استفاده کنید. توجه داشته باشید که این API با چارچوب داده LlamaIndex نیز کار می کند. برای کسب اطلاعات بیشتر به آموزش مراجعه کنید.
همچنین برای کسب اطلاعات بیشتر در مورد سایر عملکردهای موجود به اسناد API مراجعه کنید.
ضمیمه: راه اندازی OAuth با اعتبار کاربری
مراحل زیر را از OAuth Quickstart برای تنظیم احراز هویت OAuth دنبال کنید.
اعتبارنامه ها را برای یک برنامه دسکتاپ تأیید کنید . برای اجرای این نوت بوک در Colab، ابتدا نام فایل اعتبار خود را (معمولا
client_secret_*.json
) به justclient_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"
کتابخانه مشتری را راهاندازی کنید و نوتبوک را با شروع از Create a corpus دوباره اجرا کنید.
import google.ai.generativelanguage as glm
generative_service_client = glm.GenerativeServiceClient()
retriever_service_client = glm.RetrieverServiceClient()
permission_service_client = glm.PermissionServiceClient()