ai.google.dev'de görüntüleyin | Colab not defterini deneyin | GitHub'da not defterini görüntüle |
Genel Bakış
Büyük dil modelleri (LLM) doğrudan eğitilmeden yeni yetenekler öğrenebilir. Ancak LLM'lerin "halüsinasyon" etkisi olduğu bilinmektedir. kendilerine eğitim almadıkları sorular için yanıt verme görevi atanmışsa. Bunun nedenlerinden biri, LLM'lerin eğitim sonrası etkinliklerin farkında olmamasıdır. LLM'lerin yanıtlarını aldıkları 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 yaygın olarak kullanılan bir yaklaşım, LLM'ye gönderilen istemi bir Bilgi Alma (IR) mekanizması aracılığıyla harici bir bilgi tabanından alınan ilgili verilerle genişleten Retrieval Augmented Generation (RAG) olarak adlandırılır. Bilgi tabanı; dokümanlarınız, veritabanlarınız veya API'lerden oluşan size ait bir koleksiyon olabilir.
Bu not defteri, bir LLM'nin yanıtını geliştirmek için iş akışında size yol gösterir. Bunun için harici metin kitaplığıyla bilgisini arttırır ve soruları Semantik Alıcı ve İlişkilendirilen Soru ve Generative Language API'nin Answering (AQA) API'leri.
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'si kendi verilerinizde anlamsal arama yapmanızı sağlar. Bunlar sizin verileriniz olduğundan, API anahtarlarına kıyasla daha sıkı erişim denetimleri gerekir. Hizmet hesapları veya kullanıcı kimlik bilgileriniz üzerinden OAuth ile kimlik doğrulayın.
Bu hızlı başlangıç kılavuzu, test ortamı için tasarlanmış basitleştirilmiş bir kimlik doğrulama yaklaşımı kullanır ve hizmet hesabı kurulumlarına başlamak genellikle daha kolaydır. Üretim ortamında, uygulamanıza uygun erişim kimlik bilgilerini seçmeden önce kimlik doğrulama ve yetkilendirme hakkında bilgi edinin.
Hizmet hesaplarını kullanarak OAuth kurulumu
Hizmet hesaplarını kullanarak OAuth kurulumu için aşağıdaki adımları uygulayın:
- Generative Language API'yi etkinleştirin.
Belgeleri uygulayarak Hizmet Hesabı'nı oluşturun.
- Hizmet hesabını oluşturduktan sonra bir hizmet hesabı anahtarı oluşturun.
Sol kenar çubuğundaki dosya simgesini ve ardından aşağıdaki ekran görüntüsünde gösterildiği gibi 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 koddaservice_account_file_name
değişkenini değiştirin.
- Yüklenen dosyayı
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)
Topluluk oluşturun
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. Oluşturma sırasındaname
boşsa en fazla 40 karakter uzunluğunda,display_name
ön ekine ve 12 karakterden oluşan rastgele bir son eke sahip benzersiz bir ad oluşturulur.display_name
:Corpus
için okunabilir 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 kitaplığı alma
Yukarıda oluşturduğunuz Corpus
öğesine programatik olarak erişmek için GetCorpusRequest
yöntemini kullanın. name
parametresinin değeri, Corpus
öğesinin tam kaynak adını ifade eder ve yukarıdaki hücrede corpus_resource_name
olarak ayarlanmıştır. Kullanılması 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. Dokümanlarınızı tanımlarken aşağıdaki alanlardan birini belirtebilirsiniz:
name
:Document
kaynak adı (kimlik). Yalnızca en fazla 40 karakter içermelidir (yalnızca alfanümerik karakterler veya tire). Kimlik şununla başlayamaz veya bitemez: tire. Oluşturma sırasında ad boş olursa 12 karakterlik rastgele bir son ek ile birliktedisplay_name
.display_name
: Kullanıcıların okuyabileceği görünen ad. Alfanümerik karakterler, boşluklar ve tireler dahil olmak üzere en fazla 512 karakter içermelidir.
Document
öğeleri, anahtar/değer çiftleri olarak belirtilen, kullanıcı tarafından belirtilen 20'ye kadar custom_metadata
alanını da destekler. Özel meta veriler dizeler, dize listeleri veya sayısal olabilir. Dize listelerinin en fazla 10 değeri destekleyebildiğini ve sayısal değerlerin API'de kayan nokta 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. Kullanılması 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)
Besle ve Dokümanı Parçalama
Anlamsal alma 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 depolaması açısından bağımsız bir birim olarak değerlendirilen bir Document
alt parçasıdır. Bir Chunk
, en fazla 2.043 jetona sahip olabilir. Bir Corpus
en fazla 1 milyon Chunk
içerebilir.
Document
özelliklerine benzer şekilde Chunks
, anahtar/değer çiftleri olarak belirtilmiş 20 adede kadar kullanıcı tanımlı custom_metadata
alanını da destekler. Özel meta veriler dizeler, dize listeleri veya sayısal olabilir. Dize listelerinin en fazla 10 değeri destekleyebildiğini ve sayısal değerlerin API'de kayan nokta sayıları olarak temsil edildiğini unutmayın.
Bu kılavuzda, Google'ın Açık Kaynak HTMLChunker programı kullanılmaktadır.
Kullanabileceğiniz diğer parçacılar arasında LangChain veya LlamaIndex yer alır.
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'sini alın. Burada HTML doğrudan okunur,
JavaScript enjekte edilen HTML'yi dahil etmek için HTML post oluşturma işlemi yapmak daha iyi olur
document.documentElement.innerHTML
gibi.
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 belgesini pasajlara ayırın ve bu pasajlardan Chunk
oluşturun. Bu adımda Chunk
nesnelerinin kendisi oluşturulur ve bir sonraki bölümde bunlar 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 halinde gruplar oluşturun. Toplu istek başına en fazla 100 parça belirtebilirsiniz.
Tek 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 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 listele ve durumu al
Kullanılabilir tüm Chunk
'leri, sayfa başına maksimum boyut sınırı 100 Chunk
olan sayfalandırılmış bir liste halinde almak için ListChunksRequest
yöntemini kullanın. Bu liste, Chunk.create_time
'a göre artan düzende sıralanır. Bir 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 sonraki isteğin bağımsız değişkeni olarak sağlayın. Sayfalara ayırırken 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
'ler bir state
döndürür. Bir Corpus
sorgulamasından önce Chunks
öğesinin durumunu kontrol etmek için bunu kullanın. Chunk
eyaletleri şunları içerir: UNSPECIFIED
, PENDING_PROCESSING
, ACTIVE
ve FAILED
. Yalnızca ACTIVE
Chunk
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 bir Document
daha ekleyin ve filtreleri 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 pasaj sayısını belirtin. Maksimum değer 100'dür. Belirtilmemişse API maksimum 10Chunk
döndürür.metadata_filters
:chunk_metadata
veyadocument_metadata
ölçütüne göre filtreleyin. HerMetadataFilter
öğenin benzersiz bir anahtara karşılık gelmesi gerekir. Birden fazlaMetadataFilter
nesne, mantıksalAND
ile birleştirildi. Benzer meta veri filtresi koşulları mantıksalOR
'lerle 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"leri desteklediğini unutmayın. İp değerleri, aynı anahtar için yalnızca "VEYA" kurallarını 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
Dokümanınız, kitaplığınız veya bir dizi pasaj üzerinde İlişkilendirilmiş Soru Cevaplama işlemi 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ıtlama ve atıflar sunma anlamına gelir.
GenerateAnswer
, AQA'nın istendiği durumlarda, ayarlanmamış bir LLM'nin kullanılmasına kıyasla çeşitli avantajlar sağlar:
- Temel model, yalnızca sağlanan bağlama dayanan 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
tahmin eder. Bu tahmin sayesinde, döndürülen cevabın güvenilir ve doğru olma olasılığına bağlı olarak ürün davranışını yönlendirmenizi sağlar.
answerable_probability
ve "Bilmiyorum" sorunu
Bazı durumlarda, soruya en iyi yanıt aslında "Bilmiyorum" olur. Örneğin, sağlanan bağlamda sorunun cevabını içermiyorsa sorunun "yanıtlanamaz" olduğu 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, şunları yaparak nihai karar verme yetkisini size verir:
- Her zaman bir yanıtın sağlam ve doğru olma ihtimali düşük olsa bile kesin bir yanıt döndürmeye çalışılır.
answerable_probability
değerini döndürme - Modelin, yanıtın güvenilir ve doğru olma olasılığına ilişkin tahmini.
Düşük bir answerable_probability
değerinin nedeni aşağıdaki faktörlerden 1 veya daha fazlası olabilir:
- Model, yanıtının doğru olduğundan emin değil.
- Model, yanıtının alıntı yapılan pasajlara dayandığından emin değil; Bu sorunun cevabı, dünya bilgisinden çıkarılabilir. Ö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ı şekilde işlenmesini (answerable_probability
) incelemeniz önemle tavsiye edilir.
answerable_probability
düşük olduğunda bazı müşteriler:
- "Bu soru yanıtlanamadı" şeklinde bir mesaj görüntüle anlamaya başladım.
- Dünyayla ilgili bilgilerden yola çıkarak bu soruyu yanıtlayan genel amaçlı bir LLM'ye geri dönün. Bu tür yedeklerin eşiği ve niteliği, bireysel kullanım alanlarına bağlıdır.
answerable_probability
değeri <= 0,5, iyi bir başlangıç eşiğidir.
AQA Faydalı İpuçları
Tüm API spesifikasyonları için GenerateAnswerRequest
API Referansı'na bakın.
- Geçiş uzunluğu: Pasaj başına en fazla 300 jeton önerilir.
- Geçişleri sıralama:
GenerateAnswerRequest.inline_passages
değerini girerseniz pasajlar, sorguyla alaka düzeyine göre azalan düzende sıralanmalıdır. Modelin bağlam uzunluğu sınırı aşılırsa son (alaka düzeyi en az olan) pasajlar atlanır.GenerateAnswerRequest.semantic_retriever
sağlarsanız alaka düzeyi sıralaması sizin için otomatik olarak yapılır.
- Sınırlamalar: AQA modeli, soru yanıtlama için özelleştirilir. Yaratıcı yazma ve özetleme gibi diğer kullanım alanları için lütfen GenerateContent aracılığıyla genel amaçlı bir modeli ç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 belirgin çıkışlara dayanıyorsa sıcaklık=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, AQA uç noktasını Semantic Retriever API'yi kullanmadan inline_passages
ileterek doğrudan 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)
Kitaplığı paylaşma
CreatePermissionRequest
API'yi kullanarak kitaplığı başkalarıyla paylaşabilirsiniz.
Kısıtlamalar:
- Paylaşım için 2 rol vardır:
READER
veEDITOR
.READER
, derlemeyi sorgulayabilir.WRITER
, okuyucunun izinlerine sahip olmanın yanı sıra topluluğu düzenleyip paylaşabilir.
- Bir kitaplık,
EVERYONE
ürününeuser_type
okuma erişimi vererek herkese açık olabilir.
# 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
'leri veDeleteCorpusRequest
Chunk
sn.
Boş olmayan derlemenin bir force=True
işareti belirtmeden 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 Semantik Toplayıcı ile İlişkilendirilen Soru ve Generative Language API'nin Answering (AQA) API'lerini ve özel metin verilerinizde semantik bilgi almak için bu API'yi nasıl kullanabileceğinizi göstermiştir. Bu API'nin LlamaIndex veri çerçevesiyle de çalıştığını unutmayın. Daha fazla bilgi edinmek için eğiticiyi inceleyin.
Kullanılabilen diğer işlevler hakkında daha fazla bilgi edinmek için API dokümanlarına da bakın.
Ek: Kullanıcı kimlik bilgileriyle OAuth kurulumu
OAuth kimlik doğrulamasını ayarlamak için OAuth Hızlı Başlangıç Kılavuzu'nda aşağıdaki adımları uygulayın.
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ızcaclient_secret.json
olarak yeniden adlandırın. Ardından, sol kenar çubuğundaki dosya simgesini ve ardından aşağıdaki ekran görüntüsünde gösterildiği gibi 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 Topluluk oluşturma adımından 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()