Anlamsal alma özelliğini kullanmaya başlama

ai.google.dev'de göster Colab not defteri denemesi Not defterini GitHub'da görüntüleme

Genel Bakış

Büyük dil modelleri (LLM) doğrudan eğitilmeden yeni yetenekler öğrenebilir. Ancak LLM'lerin, eğitilmedikleri sorulara yanıt verme görevi verildiğinde "halüsinasyon" gördüğü bilinmektedir. Bunun nedeni kısmen LLM'lerin eğitimden sonra etkinliklerden haberdar olmamasıdır. Ayrıca, LLM'lerin yanıtlarını aldığı kaynakları izlemek de çok zordur. Güvenilir, ölçeklenebilir uygulamalar için LLM'nin gerçeklere dayalı yanıtlar vermesi ve bilgi kaynaklarından alıntı yapabilmesi önemlidir.

Bu kısıtlamaların üstesinden gelmek için kullanılan yaygın bir yaklaşım, bir LLM'ye gönderilen istemi bir Bilgi Alma (IR) mekanizması aracılığıyla harici bir bilgi tabanından alınan alakalı verilerle destekleyen Almayla Artırılmış Üretim (RAG) olarak adlandırılır. Bilgi tabanı, kendi doküman, veritabanı veya API'lerinizden oluşabilir.

Bu not defteri, LLM'nin yanıtını iyileştirmek için sizi bir iş akışında yönlendirir. Bu iş akışında, LLM'nin bilgisini harici metin veri kümeleriyle genişleterek ve soruları yanıtlamak için Generative Language API'nin Semantik Alıcı ve İlişkilendirilmiş Soru ve Yanıtlama (AQA) API'lerini kullanarak semantik bilgi alma işlemi gerçekleştirirsiniz.

Kurulum

Generative Language API'yi içe aktarma

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

Kimliği doğrula

Semantic Retriever API, kendi verileriniz üzerinde anlamsal arama yapmanıza olanak tanır. Bu, verileriniz olduğu için API anahtarlarından daha katı erişim denetimleri gerektirir. Hizmet hesapları ile veya kullanıcı kimlik bilgileriniz aracılığıyla OAuth ile kimlik doğrulaması yapın.

Bu hızlı başlangıç kılavuzunda, test ortamı için tasarlanmış basitleştirilmiş bir kimlik doğrulama yaklaşımı kullanılmaktadır. Hizmet hesabı kurulumlarının genellikle daha kolay başlaması da bu yaklaşımdan kaynaklanır. Üretim ortamında, uygulamanıza uygun erişim kimlik bilgilerini seçmeden önce kimlik doğrulama ve yetkilendirme hakkında bilgi edinin.

OAuth'u hizmet hesaplarını kullanarak ayarlama

Hizmet hesaplarını kullanarak OAuth kurulumu için aşağıdaki adımları uygulayın:

  1. Generative Language API'yi etkinleştirin.

  1. Belgeleri inceleyerek hizmet hesabını oluşturun.

    • Hizmet hesabını oluşturduktan sonra bir hizmet hesabı anahtarı oluşturun.

  1. Aşağıdaki ekran görüntüsünde gösterildiği gibi, sol kenar çubuğundaki dosya simgesini ve ardından yükleme simgesini kullanarak hizmet hesabı dosyanızı yükleyin.

    • Yüklenen dosyayı service_account_key.json olarak yeniden adlandırın veya aşağıdaki kodda service_account_file_name değişkenini değiştirin.

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

Hizmet hesabı kimlik bilgilerini kullanarak istemci kitaplığını başlatın.

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)

Varlık kümesi oluşturma

Semantic Retriever API'si proje başına 5 adede kadar özel metin derlemesi tanımlamanıza olanak sağlar. Topluluğunuzu tanımlarken aşağıdaki alanlardan birini belirtebilirsiniz:

  • name: Corpus kaynak adı (kimlik). En fazla 40 alfanümerik karakter içermelidir. name oluşturulurken boşsa display_name'dan bir ön ek ve 12 karakterlik rastgele bir son ek içeren, en fazla 40 karakter uzunluğunda benzersiz bir ad oluşturulur.
  • display_name: Corpus için kullanıcılar tarafından okunabilen görünen ad. Alfanümerik karakterler, boşluklar ve tireler dahil olmak üzere en fazla 512 karakter içermelidir.
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
}

Oluşturulan korpus

Yukarıda oluşturduğunuz Corpus öğesine programatik olarak erişmek için GetCorpusRequest yöntemini kullanın. name parametresinin değeri, Corpus kaynağının tam adını ifade eder ve yukarıdaki hücrede corpus_resource_name olarak ayarlanır. Beklenen biçim 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)

Doküman oluştur

Corpus en fazla 10.000 Document içerebilir. Belgelerinizi tanımlarken aşağıdaki alanlardan birini belirtebilirsiniz:

  • name: Document kaynak adı (kimliği). En fazla 40 karakter (yalnızca alfanümerik veya kısa çizgi) içermelidir. Kimlik kısa çizgiyle başlayamaz veya bitemez. Oluşturulma sırasında ad boşsa display_name'den 12 karakterlik rastgele bir ek ile birlikte benzersiz bir ad türetilir.
  • display_name: Kullanıcılar tarafından okunabilir görünen ad. Alfanümerik karakterler, boşluklar ve kısa çizgiler dahil olmak üzere en fazla 512 karakter içermelidir.

Document'ler, anahtar/değer çiftleri olarak belirtilen, kullanıcı tarafından belirtilen en fazla 20 custom_metadata alanını da destekler. Özel meta veriler dize, dize listeleri veya sayısal olabilir. Dize listelerinin en fazla 10 değer destekleyebileceğini ve sayısal değerlerin API'de kayan noktalı sayılar olarak temsil edildiğini unutmayın.

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

Oluşturulan dokümanı alma

Yukarıda oluşturduğunuz dokümana programatik olarak erişmek için GetDocumentRequest yöntemini kullanın. name parametresinin değeri, dokümanın tam kaynak adını ifade eder ve yukarıdaki hücrede document_resource_name olarak ayarlanır. Beklenen biçim 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)

Belgeyi Besleme ve Parçalara Bölme

Anlamsal getirme sırasında vektör veritabanı tarafından döndürülen içeriğin alaka düzeyini artırmak için, dokümanı aktarırken büyük dokümanları daha küçük parçalara veya parçalara bölün.

Chunk, vektör gösterimi ve depolama amacıyla bağımsız bir birim olarak ele alınan Document'un alt bölümüdür. Bir Chunk en fazla 2043 jeton içerebilir. Bir Corpus en fazla 1 milyon Chunk içerebilir.

Document'lere benzer şekilde Chunks, anahtar/değer çiftleri olarak belirtilen en fazla 20 kullanıcı tanımlı custom_metadata alanını da destekler. Özel meta veriler dize, dize listeleri veya sayısal olabilir. Dize listelerinin en fazla 10 değer destekleyebileceğini ve sayısal değerlerin API'de kayan noktalı sayılar olarak temsil edildiğini unutmayın.

Bu kılavuzda Google'ın Açık Kaynak HtmlChunker aracı kullanılmaktadır.

Kullanabileceğiniz diğer parçalayıcılar arasında LangChain veya LlamaIndex bulunur.

HTMLChunker aracılığıyla HTML ve parçayı alma

!pip install google-labs-html-chunker

from google_labs_html_chunker.html_chunker import HtmlChunker

from urllib.request import urlopen

Bir web sitesinin HTML DOM'unu alın. Burada HTML doğrudan okunur ancak HTML'nin oluşturulduktan sonra document.documentElement.innerHTML gibi JavaScript eklenmiş HTML içermesi daha iyi olur.

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

Metin dokümanlarını pasajlara ayırın ve bu pasajlardan Chunk oluşturun. Bu adımda Chunk nesneleri oluşturulur ve sonraki bölümde bu nesneler Semantic Retriever API'ye yüklenir.

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

Parçaları toplu olarak oluşturun

Parçaları toplu olarak oluşturun. Her toplu istek için en fazla 100 parça belirtebilirsiniz.

Tek bir parça oluşturmak için CreateChunk() kullanın.

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

Alternatif olarak, HtmlChunker'ı kullanmadan da parçalar oluşturabilirsiniz.

# 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 öğelerini listeleme ve durum bilgisi alma

Kullanılabilir tüm Chunk'leri, sayfa başına maksimum boyut sınırı 100 Chunk olan, Chunk.create_time'a göre artan düzende sıralanmış sayfalandırılmış bir liste halinde almak için ListChunksRequest yöntemini kullanın. Sınır belirtmezseniz en fazla 10 Chunk döndürülür.

Sonraki sayfayı almak için ListChunksRequest yanıtında döndürülen next_page_token değerini bir sonraki isteğinin bağımsız değişkeni olarak sağlayın. Sayfalara ayırma işlemi sırasında ListChunks öğesine sağlanan diğer tüm parametrelerin, sayfa jetonunu sağlayan çağrıyla eşleşmesi gerektiğini unutmayın.

Tüm Chunk işlevleri bir state döndürür. Bir Corpus'yi sorgulamadan önce Chunks durumunu kontrol etmek için bunu kullanın. Chunk eyaletleri UNSPECIFIED, PENDING_PROCESSING, ACTIVE ve FAILED'dir. Yalnızca ACTIVE Chunk'leri sorgulayabilirsiniz.

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

Başka bir dokümanı besle

HtmlChunker aracılığıyla başka bir Document ekleyin ve filtre ekleyin.

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

Kitaplığı sorgulama

Alakalı pasajları elde etmek üzere semantik arama yapmak için QueryCorpusRequest yöntemini kullanın.

  • results_count: Döndürülecek pasajların sayısını belirtin. Maksimum değer 100'dür. Belirtilmemesi durumunda API en fazla 10 Chunk döndürür.
  • metadata_filters: chunk_metadata veya document_metadata ölçütüne göre filtreleyin. Her MetadataFilter'ün benzersiz bir anahtara karşılık gelmesi gerekir. Birden fazla MetadataFilter nesnesi mantıksal AND'lerle birleştirilir. Benzer meta veri filtre koşulları mantıksal OR ile birleştirilir. Bazı örnekler:
(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} }]
  }]

Aynı anahtar için yalnızca sayısal değerlerin "VE" operatörünü desteklediğini unutmayın. Dize değerleri, aynı anahtar için yalnızca "OR" anahtar kelimesini destekler.

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

İlişkilendirilmiş Soru Cevap

Belgeniz, korpusunuz veya bir pasaj grubu üzerinde ilişkilendirilmiş soru yanıtlama işlemini gerçekleştirmek için GenerateAnswer yöntemini kullanın.

İlişkilendirilmiş soru yanıtlama (AQA), halüsinasyonu en aza indirirken belirli bir bağlama dayalı soruları yanıtlamayı ve ilişkilendirmeler sağlamayı ifade eder.

GenerateAnswer, AQA'nın istendiği durumlarda ayarlanmamış bir LLM kullanmaya kıyasla çeşitli avantajlar sağlar:

  • Temel model, yalnızca sağlanan bağlama dayalı yanıtlar döndürecek şekilde eğitilmiştir.
  • İlişkilendirmeleri (sağlanan bağlamın yanıta katkıda bulunan segmentleri) tanımlar. İlişkilendirmeler, kullanıcının yanıtı doğrulamasını sağlar.
  • Belirli bir (soru, bağlam) çifti için answerable_probability değerini tahmin eder. Bu sayede, döndürülen yanıtın ne kadar gerçekçi ve doğru olma olasılığına bağlı olarak ürün davranışını yönlendirebilirsiniz.

answerable_probability ve "Bilmiyorum" sorunu

Bazı durumlarda, soruya verilecek en iyi yanıt "bilmiyorum"dur. Örneğin, sağlanan bağlam, sorunun cevabını içermiyorsa soru "yanıtlanamaz" olarak kabul edilir.

AQA modeli bu tür durumları tanımada son derece yeteneklidir. Hatta cevaplanabilirlik ile cevaplanabilirlik dereceleri arasında ayrım yapabilir.

Ancak GenerateAnswer API, nihai karar verme yetkisini size vererek şunları sağlar:

  • Yanıtın doğru ve gerçek olması olasılığı düşük olsa bile her zaman gerçek bir yanıt döndürmeye çalışın.
  • Bir değer döndürme answerable_probability: Modelin, yanıtın temellendirilmiş ve doğru olma olasılığıyla ilgili tahmini.

Düşük answerable_probability, aşağıdaki faktörlerden biri veya daha fazlasıyla açıklanabilir:

  • Model, yanıtının doğru olduğundan emin değil.
  • Model, yanıtının alıntılanan pasajlara dayalı olduğundan emin değil; Yanıt, dünya bilgisinden alınmış olabilir. Örneğin: question="1+1=?", passages=["2+2=4”]answer=2, answerable_probability=0.02
  • Model, soruyu tam olarak yanıtlamayan alakalı bilgiler sağladı. Örnek: 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'te iyi biçimli bir soru sorulmadı.

Düşük bir answerable_probability değeri GenerateAnswer.answer.answer'ın büyük olasılıkla yanlış veya temele dayalı olmadığını belirttiğinden yanıtın daha ayrıntılı bir şekilde işlenmesini (answerable_probability) incelemeniz önemle tavsiye edilir.

answerable_probability düşük olduğunda bazı müşteriler şunları yapmak isteyebilir:

  • Son kullanıcıya "bu soruyu yanıtlayamadık" şeklinde bir mesaj gösterin.
  • Soruyu dünya bilgisinden yanıtlayan genel amaçlı bir LLM'ye geçin. Bu tür yedeklerin eşiği ve yapısı, kullanım alanlarına göre değişir. answerable_probability <= 0,5 değeri iyi bir başlangıç eşiğidir.

AQA Faydalı İpuçları

API spesifikasyonlarının tamamı için GenerateAnswerRequest API Referansı başlıklı makaleyi inceleyin.

  • Passage uzunluğu: Passage başına en fazla 300 jeton kullanılması önerilir.
  • Geçişleri sıralama:
  • Sınırlamalar: AQA modeli, soru yanıtlama için özelleştirilir. Yaratıcı yazma, özetleme vb. gibi diğer kullanım alanları için lütfen GenerateContent aracılığıyla genel amaçlı bir model çağırın.
    • Sohbet: Kullanıcı girişinin belirli bir bağlamdan yanıtlanabilecek bir soru olduğu biliniyorsa, AQA sohbet sorgularını yanıtlayabilir. Ancak, kullanıcı girişi herhangi bir giriş türündeyse genel amaçlı bir model daha iyi bir seçim olabilir.
  • Sıcaklık:
    • Doğru HKİ için genellikle nispeten düşük bir (~0, 2) sıcaklık önerilir.
    • Kullanım alanınız belirli çıktılara dayanıyorsa temperature=0 değerini ayarlayın.
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)

Daha Fazla Seçenek: Satır İçi Geçişleri Kullanan AQA

Alternatif olarak, inline_passages parametresini ileterek Semantic Retriever API'yi kullanmadan doğrudan AQA uç noktasını kullanabilirsiniz.

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)

Kümeyi paylaşma

CreatePermissionRequest API'yi kullanarak korpusları başkalarıyla paylaşmayı seçebilirsiniz.

Kısıtlamalar:

  • Paylaşım için 2 rol vardır: READER ve EDITOR.
    • READER, söz konusu veri kümesini sorgulayabilir.
    • WRITER, okuyucu izinlerine sahiptir ve ayrıca veri kümesini düzenleyip paylaşabilir.
  • EVERYONE için user_type okuma erişimi vererek bir korpus herkese açık hale getirilebilir.
# 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)

Kitaplığı sil

Bir kullanıcı topluluğunu ve ilişkili tüm Document ve Chunk öğelerini silmek için DeleteCorpusRequest öğesini kullanın.

Boş olmayan dil veri kümelerinin force=True işareti belirtilmeden hata vereceğini unutmayın. force=True öğesini ayarlarsanız bu Document ile ilgili tüm Chunk öğeleri ve nesneler de silinir.

force=False (varsayılan) ve Document herhangi bir Chunk içeriyorsa FAILED_PRECONDITION hatası döndürülür.

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

Özet ve ek okuma

Bu kılavuzda, Generative Language API'nin Semantic Retriever ve Attributed Question & Answering (AQA) API'leri tanıtılmış ve özel metin verileriniz üzerinde anlamsal bilgi alma işlemi gerçekleştirmek için bunları nasıl kullanabileceğiniz gösterilmiştir. Bu API'nin LlamaIndex veri çerçevesiyle de çalıştığını unutmayın. Daha fazla bilgi edinmek için eğitimi inceleyin.

Kullanılabilen diğer işlevler hakkında daha fazla bilgi edinmek için API dokümanlarına da bakın.

Ek: OAuth'u kullanıcı kimlik bilgileriyle ayarlama

OAuth kimlik doğrulamasını ayarlamak için OAuth Hızlı Başlangıç bölümündeki aşağıdaki adımları uygulayın.

  1. OAuth izin ekranını yapılandırın.

  2. Masaüstü uygulaması için kimlik bilgilerini yetkilendirin. Bu not defterini Colab'de çalıştırmak için önce kimlik bilgisi dosyanızı (genellikle client_secret_*.json) yalnızca client_secret.json olarak yeniden adlandırın. Ardından, aşağıdaki ekran görüntüsünde gösterildiği gibi sol kenar çubuğundaki dosya simgesini ve ardından yükleme simgesini kullanarak dosyayı yükleyin.

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

İstemci kitaplığını başlatın ve Corpus oluşturma bölümünden başlayarak not defterini yeniden çalıştırın.

import google.ai.generativelanguage as glm

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