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:
- Generative Language API'yi etkinleştirin.
Belgeleri inceleyerek hizmet hesabını oluşturun.
- Hizmet hesabını oluşturduktan sonra bir hizmet hesabı anahtarı oluşturun.
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 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)
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şsadisplay_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şsadisplay_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 10Chunk
döndürür.metadata_filters
:chunk_metadata
veyadocument_metadata
ölçütüne göre filtreleyin. HerMetadataFilter
'ün benzersiz bir anahtara karşılık gelmesi gerekir. Birden fazlaMetadataFilter
nesnesi mantıksalAND
'lerle birleştirilir. Benzer meta veri filtre koşulları mantıksalOR
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:
GenerateAnswerRequest.inline_passages
değerini sağlarsanız pasajlar, sorgu ile alaka düzeyine göre azalan düzende sıralanır. Modelin bağlam uzunluğu sınırı aşılırsa son (en az alakalı) 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, ö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
veEDITOR
.READER
, söz konusu veri kümesini sorgulayabilir.WRITER
, okuyucu izinlerine sahiptir ve ayrıca veri kümesini düzenleyip paylaşabilir.
EVERYONE
içinuser_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.
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, 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()