ai.google.dev पर देखें | Colab notebook आज़माएं | GitHub पर notebook देखें |
खास जानकारी
लार्ज लैंग्वेज मॉडल (एलएलएम), सीधे तौर पर ट्रेनिंग लिए बिना नई क्षमताएं सीख सकते हैं. हालांकि, एलएलएम ऐसे सवालों के जवाब देने के लिए "गलत जानकारी" देता है जिनके बारे में उसे ट्रेनिंग नहीं दी गई है. ऐसा इसलिए होता है, क्योंकि एलएलएम को ट्रेनिंग के बाद होने वाली गतिविधियों की जानकारी नहीं होती. साथ ही, उन सोर्स को ट्रैक करना भी बहुत मुश्किल है जिनसे एलएलएम अपने जवाब पाते हैं. भरोसेमंद और बड़े स्तर पर इस्तेमाल किए जा सकने वाले ऐप्लिकेशन के लिए, यह ज़रूरी है कि एलएलएम ऐसे जवाब दे जो तथ्यों पर आधारित हो और जानकारी के सोर्स का हवाला दे सके.
इन समस्याओं को हल करने के लिए, आम तौर पर रीट्रिवल ऑगमेंटेड जनरेशन (आरएजी) का इस्तेमाल किया जाता है. यह एलएलएम को भेजे गए प्रॉम्प्ट को, बाहरी नॉलेज बेस से इकट्ठा किए गए काम के डेटा के साथ बेहतर बनाता है. इसके लिए, जानकारी इकट्ठा करने (आईआर) के तरीके का इस्तेमाल किया जाता है. नॉलेज बेस आपके अपने कोर्स, दस्तावेज़ों, डेटाबेस या एपीआई का हो सकता है.
इस notebook में, Generative Language API के सिमैंटिक रिट्रीवर और एट्रिब्यूट किए गए सवाल और जवाब (एक्यूआई) एपीआई का इस्तेमाल करके, एलएलएम से मिले जवाब को बेहतर बनाने के वर्कफ़्लो की जानकारी दी गई है. इसके लिए, एलएलएम को एक्सटर्नल टेक्स्ट कॉर्पोरा की मदद से जानकारी दी गई है. साथ ही, सवालों के जवाब देने के लिए सिमैंटिक जानकारी भी दी गई है.
सेटअप
Generative Language API इंपोर्ट करना
# Install the Client library (Semantic Retriever is only supported for versions >0.4.0)
pip install -U google.ai.generativelanguage
प्रमाणीकृत करें
Semantic Retriever API की मदद से, अपने डेटा पर सिमेंटिक सर्च की जा सकती है. यह आपका डेटा है. इसलिए, इसे ऐक्सेस करने के लिए एपीआई कुंजियों के मुकाबले ज़्यादा सख्त कंट्रोल की ज़रूरत होती है. सेवा खातों या अपने उपयोगकर्ता क्रेडेंशियल की मदद से, OAuth की मदद से पुष्टि करें.
इस क्विकस्टार्ट में, पुष्टि करने के लिए आसान तरीके का इस्तेमाल किया गया है. यह तरीका, टेस्टिंग एनवायरमेंट के लिए बनाया गया है. आम तौर पर, सेवा खाते के सेटअप को शुरू करना आसान होता है. प्रोडक्शन एनवायरमेंट के लिए, अपने ऐप्लिकेशन के हिसाब से ऐक्सेस क्रेडेंशियल चुनने से पहले, पुष्टि करने और अनुमति देने के बारे में जानें.
सेवा खातों का इस्तेमाल करके, OAuth सेटअप करना
सेवा खातों का इस्तेमाल करके OAuth सेट अप करने के लिए, यह तरीका अपनाएं:
- Generative Language API चालू करना.
दस्तावेज़ में दिए गए निर्देशों का पालन करके, सेवा खाता बनाएं.
- सेवा खाता बनाने के बाद, सेवा खाता कुंजी जनरेट करें.
बाईं ओर मौजूद साइडबार में मौजूद फ़ाइल आइकॉन का इस्तेमाल करके, अपनी सेवा खाते की फ़ाइल अपलोड करें. इसके बाद, नीचे दिए गए स्क्रीनशॉट में दिखाए गए तरीके से, अपलोड आइकॉन का इस्तेमाल करके फ़ाइल अपलोड करें.
- अपलोड की गई फ़ाइल का नाम बदलकर
service_account_key.json
करें या नीचे दिए गए कोड में वैरिएबलservice_account_file_name
को बदलें.
- अपलोड की गई फ़ाइल का नाम बदलकर
pip install -U google-auth-oauthlib
service_account_file_name = 'service_account_key.json'
from google.oauth2 import service_account
credentials = service_account.Credentials.from_service_account_file(service_account_file_name)
scoped_credentials = credentials.with_scopes(
['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/generative-language.retriever'])
सेवा खाते के क्रेडेंशियल का इस्तेमाल करके, क्लाइंट लाइब्रेरी को शुरू करें.
import google.ai.generativelanguage as glm
generative_service_client = glm.GenerativeServiceClient(credentials=scoped_credentials)
retriever_service_client = glm.RetrieverServiceClient(credentials=scoped_credentials)
permission_service_client = glm.PermissionServiceClient(credentials=scoped_credentials)
कॉर्पस (संग्रह) बनाएं
Semantic Retriever API की मदद से, हर प्रोजेक्ट के लिए ज़्यादा से ज़्यादा पांच कस्टम टेक्स्ट कॉर्पोरेशन तय किए जा सकते हैं. अपने कॉर्पोरा को परिभाषित करते समय आप इनमें से किसी एक फ़ील्ड को निर्दिष्ट कर सकते हैं:
name
:Corpus
संसाधन का नाम (आईडी). इसमें अक्षर और अंक मिलाकर ज़्यादा से ज़्यादा 40 वर्ण होने चाहिए. अगरname
खाली है, तोdisplay_name
से प्रीफ़िक्स और 12 वर्णों का कोई रैंडम सफ़िक्स जोड़कर, ज़्यादा से ज़्यादा 40 वर्णों का यूनीक नाम जनरेट किया जाएगा.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 }
बनाया गया कॉर्पस पाना
ऊपर बनाए गए Corpus
को प्रोग्राम के हिसाब से ऐक्सेस करने के लिए, GetCorpusRequest
तरीके का इस्तेमाल करें. 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
में ज़्यादा से ज़्यादा 10,000 Document
हो सकते हैं. दस्तावेज़ों की जानकारी देते समय, इनमें से किसी एक फ़ील्ड को चुना जा सकता है:
name
:Document
रिसॉर्स का नाम (आईडी). ज़्यादा से ज़्यादा 40 वर्ण (सिर्फ़ अक्षर और अंक या डैश) होने चाहिए. आईडी की शुरुआत या आखिर में डैश नहीं हो सकता. अगर खाता बनाते समय कोई नाम नहीं दिया जाता है, तोdisplay_name
के साथ-साथ 12 वर्णों का कोई रैन्डम सफ़िक्स जोड़कर एक यूनीक नाम जनरेट किया जाएगा.display_name
: ऐसा डिसप्ले नेम जिसे कोई भी पढ़ सकता है. इसमें ज़्यादा से ज़्यादा 512 वर्ण होने चाहिए. इनमें अक्षर और अंक, स्पेस, और डैश शामिल हैं.
Document
s में, उपयोगकर्ता के तय किए गए 20 custom_metadata
फ़ील्ड भी काम करते हैं. ये फ़ील्ड, की-वैल्यू पेयर के तौर पर तय किए जाते हैं. कस्टम मेटाडेटा, स्ट्रिंग, स्ट्रिंग की सूचियां या अंक हो सकते हैं. ध्यान दें कि स्ट्रिंग की सूचियों में ज़्यादा से ज़्यादा 10 वैल्यू हो सकती हैं. साथ ही, एपीआई में संख्या वाली वैल्यू, फ़्लोटिंग-पॉइंट नंबर के तौर पर दिखाई जाती हैं.
# 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
में ज़्यादा से ज़्यादा 2,043 टोकन हो सकते हैं. Corpus
में ज़्यादा से ज़्यादा 10 लाख Chunk
हो सकते हैं.
Document
की तरह ही, Chunks
में भी ज़्यादा से ज़्यादा 20 उपयोगकर्ताओं के हिसाब से बने custom_metadata
फ़ील्ड इस्तेमाल किए जा सकते हैं. इन फ़ील्ड को की-वैल्यू पेयर के तौर पर बताया जाता है. कस्टम मेटाडेटा, स्ट्रिंग, स्ट्रिंग की सूचियां या अंकों में हो सकता है. ध्यान दें कि स्ट्रिंग की सूचियों में ज़्यादा से ज़्यादा 10 वैल्यू हो सकती हैं. साथ ही, एपीआई में संख्या वाली वैल्यू, फ़्लोटिंग-पॉइंट नंबर के तौर पर दिखाई जाती हैं.
इस गाइड में, Google के ओपन सोर्स HtmlChunker का इस्तेमाल किया गया है.
इसके अलावा, LangChain या LlamaIndex को इस्तेमाल करने वाले कई हिस्से इस्तेमाल किए जा सकते हैं.
HtmlChunker की मदद से, एचटीएमएल डालना और उसे अलग-अलग हिस्सों में बांटना
!pip install google-labs-html-chunker
from google_labs_html_chunker.html_chunker import HtmlChunker
from urllib.request import urlopen
किसी वेबसाइट के लिए एचटीएमएल डीओएम पाएं. यहां एचटीएमएल को सीधे पढ़ा जाता है. हालांकि, document.documentElement.innerHTML
जैसे JavaScript इंजेक्शन वाले एचटीएमएल को शामिल करने के लिए, एचटीएमएल को रेंडर करने के बाद पढ़ना बेहतर होगा.
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
ऑब्जेक्ट बनाता है और अगला सेक्शन उन्हें सिमैंटिक रिट्रीवर एपीआई में अपलोड करता है.
# 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
की सूची बनाएं और राज्य का नाम पाएं
ListChunksRequest
तरीके का इस्तेमाल करके, सभी उपलब्ध Chunk
को पेज की सूची के तौर पर पाएं. हर पेज पर ज़्यादा से ज़्यादा 100 Chunk
हो सकते हैं. ये Chunk.create_time
के बढ़ते क्रम में लगाए जाते हैं. अगर आपने कोई सीमा नहीं तय की है, तो ज़्यादा से ज़्यादा 10 Chunk
दिखाए जाते हैं.
अगला पेज पाने के लिए, ListChunksRequest
रिस्पॉन्स में दिखाए गए next_page_token
को अगले अनुरोध के आर्ग्युमेंट के तौर पर दें. ध्यान दें कि पेजेशन करते समय, ListChunks
के लिए दिए गए सभी अन्य पैरामीटर, उस कॉल से मेल खाने चाहिए जिसने पेज टोकन दिया था.
सभी Chunk
, state
दिखाते हैं. Corpus
की क्वेरी करने से पहले, Chunks
की स्थिति की जांच करने के लिए इसका इस्तेमाल करें. Chunk
में ये राज्य शामिल हैं - UNSPECIFIED
, PENDING_PROCESSING
, ACTIVE
, और FAILED
. सिर्फ़ ACTIVE
Chunk
के लिए क्वेरी की जा सकती है.
# 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}')
कोई दूसरा दस्तावेज़ डालना
HtmlChunker की मदद से एक और Document
जोड़ें और फ़िल्टर जोड़ें.
# 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. अगर जानकारी नहीं दी गई है, तो एपीआई ज़्यादा से ज़्यादा 10Chunk
s का अनुरोध करता है.metadata_filters
:chunk_metadata
याdocument_metadata
के हिसाब से फ़िल्टर करें. हरMetadataFilter
को किसी यूनीक कुंजी से जोड़ना ज़रूरी है. एक से ज़्यादाMetadataFilter
ऑब्जेक्ट को लॉजिकलAND
से जोड़ा जाता है. मिलते-जुलते मेटाडेटा फ़िल्टर की शर्तों को लॉजिकलOR
से जोड़ा जाता है. कुछ उदाहरण:
(year >= 2020 OR year < 2010) AND (genre = drama OR genre = action)
metadata_filter = [
{
key = "document.custom_metadata.year"
conditions = [
{int_value = 2020, operation = GREATER_EQUAL},
{int_value = 2010, operation = LESS}]
},
{
key = "document.custom_metadata.genre"
conditions = [
{string_value = "drama", operation = EQUAL},
{string_value = "action", operation = EQUAL} }]
}]
ध्यान दें कि एक ही कुंजी के लिए, सिर्फ़ अंकों वाली वैल्यू के साथ "AND" का इस्तेमाल किया जा सकता है. स्ट्रिंग वैल्यू में, एक ही कुंजी के लिए सिर्फ़ "या" का इस्तेमाल किया जा सकता है.
("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
तरीके का इस्तेमाल करें.
एट्रिब्यूट किए गए सवालों के जवाब (एक्यूआई) का मतलब है, दिए गए संदर्भ पर आधारित सवालों के जवाब देना और एट्रिब्यूशन देना. इस दौरान, ऐसी जानकारी को कम करना चाहिए जिससे भ्रम की स्थिति पैदा न हो.
GenerateAnswer
, बिना ट्यून किए गए एलएलएम का इस्तेमाल करने के मुकाबले कई फ़ायदे देता है. ऐसा तब होता है, जब एएफ़ए की ज़रूरत होती है:
- इस मॉडल को सिर्फ़ ऐसे जवाब देने के लिए ट्रेन किया गया है जो दिए गए कॉन्टेक्स्ट के हिसाब से हों.
- यह एट्रिब्यूशन (उपलब्ध कराए गए कॉन्टेक्स्ट के ऐसे सेगमेंट जो जवाब में मदद करते हैं) की पहचान करता है. एट्रिब्यूशन की मदद से, उपयोगकर्ता जवाब की पुष्टि कर पाता है.
- यह किसी दिए गए (सवाल, संदर्भ) जोड़े के लिए
answerable_probability
का अनुमान लगाता है. इससे, आपको प्रॉडक्ट के व्यवहार को बदलने में मदद मिलती है. यह बदलाव इस बात पर निर्भर करता है कि दिए गए जवाब के सही और काम के होने की संभावना कितनी है.
answerable_probability
और “मुझे नहीं पता” समस्या
कुछ मामलों में, सवाल का सबसे सही जवाब “मुझे नहीं पता” होता है. उदाहरण के लिए, अगर दिए गए कॉन्टेक्स्ट में सवाल का जवाब नहीं है, तो सवाल को “जवाब नहीं दिया जा सकता” माना जाता है.
AQA मॉडल, ऐसे मामलों की पहचान करने में काफ़ी माहिर है. यह कई स्तर पर जवाब देने की क्षमता और जवाब न देने की क्षमता के बीच का अंतर भी बता सकता है.
हालांकि, GenerateAnswer
API आपको आखिरी फ़ैसला लेने की सुविधा देता है. इसके लिए, यह:
- हमेशा सही जवाब देने की कोशिश करता है. भले ही, जवाब सही और सटीक न हो.
- कोई वैल्यू दिखाना
answerable_probability
- इस मॉडल की मदद से, इस बात की संभावना का अनुमान लगाया गया है कि जवाब सही है और तथ्यों पर आधारित है.
answerable_probability
के कम होने की एक या उससे ज़्यादा वजहें हो सकती हैं:
- मॉडल को भरोसा नहीं है कि उसका जवाब सही है.
- मॉडल को भरोसा नहीं है कि उसका जवाब, दिए गए पैसेज पर आधारित है. हो सकता है कि जवाब, दुनिया के बारे में सामान्य जानकारी से लिया गया हो. उदाहरण के लिए:
question="1+1=?", passages=["2+2=4”]
→answer=2, answerable_probability=0.02
- मॉडल ने काम की जानकारी दी, जिससे सवाल का पूरा जवाब नहीं मिला. उदाहरण:
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
कम हो, तो कुछ क्लाइंट ये काम कर सकते हैं:
- असली उपयोगकर्ता को ऐसा मैसेज दिखाएं कि "उस सवाल का जवाब नहीं दिया जा सका".
- सामान्य तौर पर इस्तेमाल होने वाले एलएलएम का इस्तेमाल करें, जो दुनिया के बारे में जानकारी से सवाल का जवाब देता है. इस तरह के फ़ॉलबैक का थ्रेशोल्ड और टाइप, अलग-अलग इस्तेमाल के उदाहरणों पर निर्भर करेगा. वैल्यू के तौर पर
answerable_probability
<= 0.5, एक अच्छी शुरुआती थ्रेशोल्ड है.
AQA से जुड़ी मददगार सलाह
एपीआई की सभी खास जानकारी के लिए, GenerateAnswerRequest
एपीआई का रेफ़रंस देखें.
- पैसेज की अवधि: हर पैसेज के लिए 300 टोकन तक रखने का सुझाव दिया जाता है.
- पैसेज को क्रम से लगाना:
- अगर आपने
GenerateAnswerRequest.inline_passages
दिया है, तो पैसेज को क्वेरी के हिसाब से घटते क्रम में लगाया जाना चाहिए. अगर कॉन्टेक्स्ट की लंबाई, मॉडल की तय सीमा से ज़्यादा हो जाती है, तो आखिरी (सबसे कम काम के) पैसेज हटा दिए जाएंगे. GenerateAnswerRequest.semantic_retriever
का इस्तेमाल करने पर, आपके लिए काम के हिसाब से क्रम से लगाने की सुविधा अपने-आप चालू हो जाएगी.
- अगर आपने
- सीमाएं: एएफ़ए मॉडल, सवालों के जवाब देने के लिए खास तौर पर बनाया गया है. क्रिएटिव लेखन, खास जानकारी देने वाली रिपोर्ट वगैरह के लिए, कृपया GenerateContent के ज़रिए सामान्य काम के लिए बने मॉडल को कॉल करें.
- चैट: अगर उपयोगकर्ता का इनपुट कोई ऐसा सवाल है जिसका जवाब किसी खास संदर्भ में दिया जा सकता है, तो AQA चैट क्वेरी का जवाब दे सकता है. हालांकि, अगर उपयोगकर्ता इनपुट किसी भी तरह का हो सकता है, तो सामान्य काम के लिए इस्तेमाल होने वाला मॉडल बेहतर विकल्प हो सकता है.
- तापमान:
- आम तौर पर, सटीक एक्यूआई के लिए, सामान्य से कम (~0.2) तापमान का सुझाव दिया जाता है.
- अगर आपका इस्तेमाल का उदाहरण, डेटरमिनिस्टिक आउटपुट पर निर्भर करता है, तो temperature=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 को इस्तेमाल करना
इसके अलावा, inline_passages
को पास करके, सीधे AQA एंडपॉइंट का इस्तेमाल किया जा सकता है. इसके लिए, आपको सेमैटिक रीट्रिवर एपीआई का इस्तेमाल नहीं करना होगा.
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
एपीआई का इस्तेमाल करके, कोरस को दूसरों के साथ शेयर किया जा सकता है.
पाबंदियां:
- शेयर करने के लिए दो भूमिकाएं होती हैं:
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)
कॉर्पस (संग्रह) मिटाएं
उपयोगकर्ताओं के ग्रुप और उससे जुड़े सभी Document
और Chunk
s को मिटाने के लिए, DeleteCorpusRequest
का इस्तेमाल करें.
ध्यान दें कि खाली नहीं होने वाले कॉर्पोरा, force=True
फ़्लैग के बिना गड़बड़ी दिखाएंगे. force=True
सेट करने पर, इस Document
से जुड़े सभी Chunk
और ऑब्जेक्ट भी मिट जाएंगे.
अगर 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)
खास जानकारी और इसके बारे में और पढ़ने के लिए
इस गाइड में, Generative Language API के सिमैंटिक रिट्रीवर और एट्रिब्यूट किए गए सवाल और जवाब वाले एपीआई के बारे में बताया गया था. साथ ही, यह भी बताया गया था कि इसका इस्तेमाल करके, कस्टम टेक्स्ट डेटा से सिमैंटिक जानकारी कैसे हासिल की जा सकती है. ध्यान दें कि यह एपीआई, LlamaIndex डेटा फ़्रेमवर्क के साथ भी काम करता है. ज़्यादा जानने के लिए, ट्यूटोरियल देखें.
उपलब्ध अन्य सुविधाओं के बारे में ज़्यादा जानने के लिए, एपीआई दस्तावेज़ भी देखें.
परिशिष्ट: उपयोगकर्ता के क्रेडेंशियल की मदद से OAuth सेट अप करना
OAuth की मदद से पुष्टि करने की सुविधा सेट अप करने के लिए, OAuth क्विकस्टार्ट में दिया गया तरीका अपनाएं.
डेस्कटॉप ऐप्लिकेशन के लिए क्रेडेंशियल को अनुमति देना. इस notebook को Colab में चलाने के लिए, पहले अपनी क्रेडेंशियल फ़ाइल (आम तौर पर
client_secret_*.json
) का नाम बदलकर सिर्फ़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"
क्लाइंट लाइब्रेरी को शुरू करें और कोरस बनाएं से शुरू करके, नोटबुक को फिर से चलाएं.
import google.ai.generativelanguage as glm
generative_service_client = glm.GenerativeServiceClient()
retriever_service_client = glm.RetrieverServiceClient()
permission_service_client = glm.PermissionServiceClient()