با بازیابی معنایی شروع کنید

مشاهده در ai.google.dev در Google Colab اجرا شود مشاهده منبع در GitHub

بررسی اجمالی

مدل‌های زبان بزرگ (LLM) می‌توانند توانایی‌های جدید را بدون اینکه مستقیماً روی آن‌ها آموزش ببینند، بیاموزند. با این حال، LLM ها زمانی که وظیفه ارائه پاسخ برای سوالاتی که در مورد آنها آموزش ندیده اند، "توهم" می کنند. این تا حدی به این دلیل است که LLM ها از رویدادهای بعد از آموزش بی اطلاع هستند. همچنین ردیابی منابعی که LLM ها پاسخ های خود را از آنها می گیرند بسیار دشوار است. برای کاربردهای قابل اعتماد و مقیاس‌پذیر، مهم است که یک LLM پاسخ‌هایی را ارائه دهد که بر اساس حقایق باشد و بتواند منابع اطلاعاتی خود را استناد کند.

یک رویکرد متداول که برای غلبه بر این محدودیت‌ها استفاده می‌شود، Retrieval Augmented Generation (RAG) نامیده می‌شود که درخواست ارسال شده به LLM را با داده‌های مربوطه بازیابی شده از یک پایگاه دانش خارجی از طریق مکانیزم بازیابی اطلاعات (IR) تقویت می‌کند. پایگاه دانش می تواند مجموعه اسناد، پایگاه های داده یا API های خود شما باشد.

این نوت بوک شما را در جریان کاری راهنمایی می کند تا پاسخ LLM را با تقویت دانش آن با مجموعه های متنی خارجی و انجام بازیابی اطلاعات معنایی برای پاسخ به سؤالات با استفاده از Semantic Retriever و AQA 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 با استفاده از حساب های سرویس، مراحل زیر را دنبال کنید:

  1. API زبان تولیدی را فعال کنید.

  1. با دنبال کردن مستندات ، حساب سرویس ایجاد کنید.

    • پس از ایجاد حساب سرویس، یک کلید حساب سرویس ایجاد کنید.

  1. فایل حساب سرویس خود را با استفاده از نماد فایل در نوار کناری سمت چپ، سپس نماد آپلود، همانطور که در تصویر زیر نشان داده شده است، آپلود کنید.

    • نام فایل آپلود شده را به service_account_key.json تغییر دهید یا متغیر service_account_file_name را در کد زیر تغییر دهید.

pip install -U google-auth-oauthlib
service_account_file_name = 'service_account_key.json'

from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file(service_account_file_name)

scoped_credentials = credentials.with_scopes(
    ['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/generative-language.retriever'])

با استفاده از اعتبار حساب سرویس، کتابخانه مشتری را راه‌اندازی کنید.

import google.ai.generativelanguage as glm
generative_service_client = glm.GenerativeServiceClient(credentials=scoped_credentials)
retriever_service_client = glm.RetrieverServiceClient(credentials=scoped_credentials)
permission_service_client = glm.PermissionServiceClient(credentials=scoped_credentials)

یک پیکره ایجاد کنید

Semantic Retriever API به شما امکان می دهد تا 5 مجموعه متن سفارشی را در هر پروژه تعریف کنید. هنگام تعریف مجموعه خود می توانید یکی از فیلدهای زیر را مشخص کنید:

  • name : نام منبع Corpus (ID). باید فقط حداکثر 40 کاراکتر الفبایی داشته باشد. اگر name در هنگام ایجاد خالی باشد، یک نام منحصر به فرد با حداکثر طول 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 داشته باشد.

مشابه DocumentChunks همچنین از 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 حداکثر 10 Chunk 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 دنبال کنید.

  1. صفحه رضایت OAuth را پیکربندی کنید .

  2. اعتبارنامه ها را برای یک برنامه دسکتاپ تأیید کنید . برای اجرای این نوت بوک در Colab، ابتدا نام فایل اعتبار خود را (معمولا client_secret_*.json ) به just client_secret.json تغییر دهید. سپس فایل را با استفاده از نماد فایل در نوار کناری سمت چپ و سپس نماد آپلود، همانطور که در تصویر زیر نشان داده شده است، آپلود کنید.

# Replace TODO-your-project-name with the project used in the OAuth Quickstart
project_name = "TODO-your-project-name" #  @param {type:"string"}
# Replace TODO-your-email@gmail.com with the email added as a test user in the OAuth Quickstart
email = "TODO-your-email@gmail.com" #  @param {type:"string"}
# Rename the uploaded file to `client_secret.json` OR
# Change the variable `client_file_name` in the code below.
client_file_name = "client_secret.json"

# IMPORTANT: Follow the instructions from the output - you must copy the command
# to your terminal and copy the output after authentication back here.
!gcloud config set project $project_name
!gcloud config set account $email

# NOTE: The simplified project setup in this tutorial triggers a "Google hasn't verified this app." dialog.
# This is normal, click "Advanced" -> "Go to [app name] (unsafe)"
!gcloud auth application-default login --no-browser --client-id-file=$client_file_name --scopes="https://www.googleapis.com/auth/generative-language.retriever,https://www.googleapis.com/auth/cloud-platform"

کتابخانه مشتری را راه‌اندازی کنید و نوت‌بوک را با شروع از Create a corpus دوباره اجرا کنید.

import google.ai.generativelanguage as glm

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