Xem trên ai.google.dev | Dùng thử sổ tay Colab | Xem sổ tay trên GitHub |
Tổng quan
Mô hình ngôn ngữ lớn (LLM) có thể học các khả năng mới mà không cần được huấn luyện trực tiếp về các khả năng đó. Tuy nhiên, LLM được biết là "ảo tưởng" khi được giao nhiệm vụ đưa ra câu trả lời cho những câu hỏi mà chúng chưa được huấn luyện. Điều này một phần là do các LLM không biết về các sự kiện sau khi được huấn luyện. Cũng rất khó để theo dõi nguồn mà LLM lấy câu trả lời. Đối với các ứng dụng đáng tin cậy và có thể mở rộng, điều quan trọng là LLM phải cung cấp câu trả lời dựa trên thực tế và có thể trích dẫn nguồn thông tin của câu trả lời đó.
Một phương pháp phổ biến mà chúng tôi dùng để khắc phục những hạn chế này là Tạo ra tăng cường truy xuất (RAG), giúp tăng cường câu lệnh được gửi đến một mô hình ngôn ngữ lớn (LLM) với dữ liệu liên quan được truy xuất từ cơ sở kiến thức bên ngoài thông qua cơ chế Truy xuất thông tin (IR). Cơ sở kiến thức có thể là tập hợp tài liệu, cơ sở dữ liệu hoặc API của riêng bạn.
Sổ tay này hướng dẫn bạn quy trình làm việc để cải thiện câu trả lời của một LLM (mô hình ngôn ngữ lớn) bằng cách nâng cao kiến thức của LLM bằng cách sử dụng các tập sao lục văn bản bên ngoài, đồng thời thực hiện việc truy xuất thông tin ngữ nghĩa để trả lời câu hỏi bằng Semantic Retriever và API Hỏi và đáp được phân bổ (AQA) của Generative Language API.
Thiết lập
Nhập Generative Language API
# Install the Client library (Semantic Retriever is only supported for versions >0.4.0)
pip install -U google.ai.generativelanguage
Xác thực
Semantic Retriever API cho phép bạn thực hiện tìm kiếm ngữ nghĩa trên dữ liệu của riêng mình. Vì đó là dữ liệu của bạn, nên bạn cần có các biện pháp kiểm soát quyền truy cập nghiêm ngặt hơn so với khoá API. Xác thực bằng OAuth bằng tài khoản dịch vụ hoặc thông qua thông tin đăng nhập của người dùng.
Bước bắt đầu nhanh này sử dụng phương pháp xác thực đơn giản dành cho môi trường thử nghiệm và việc thiết lập tài khoản dịch vụ thường dễ bắt đầu hơn. Đối với môi trường phát hành chính thức, hãy tìm hiểu về quy trình xác thực và uỷ quyền trước khi chọn thông tin xác thực truy cập phù hợp với ứng dụng của bạn.
Thiết lập OAuth bằng tài khoản dịch vụ
Hãy làm theo các bước dưới đây để thiết lập OAuth bằng tài khoản dịch vụ:
Tạo Tài khoản dịch vụ theo tài liệu.
- Sau khi tạo tài khoản dịch vụ, hãy tạo một khoá tài khoản dịch vụ.
Tải tệp tài khoản dịch vụ của bạn lên bằng cách sử dụng biểu tượng tệp ở thanh bên trái, sau đó chọn biểu tượng tải lên (như trong ảnh chụp màn hình dưới đây).
- Đổi tên tệp đã tải lên thành
service_account_key.json
hoặc thay đổi biếnservice_account_file_name
trong mã bên dưới.
- Đổi tên tệp đã tải lên thành
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'])
Khởi tạo thư viện ứng dụng bằng thông tin xác thực tài khoản dịch vụ.
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)
Tạo một tập hợp văn bản
Semantic Retriever API cho phép bạn xác định tối đa 5 tập hợp văn bản tuỳ chỉnh cho mỗi dự án. Bạn có thể chỉ định một trong các trường sau đây khi xác định kho ngữ liệu:
name
: Tên tài nguyên (mã nhận dạng)Corpus
. Chỉ được chứa tối đa 40 ký tự bao gồm chữ và số. Nếuname
trống khi tạo, hệ thống sẽ tạo một tên duy nhất có độ dài tối đa là 40 ký tự, với tiền tố làdisplay_name
và hậu tố ngẫu nhiên gồm 12 ký tự.display_name
: Tên hiển thị mà con người có thể đọc được choCorpus
. Chỉ được chứa tối đa 512 ký tự, bao gồm cả chữ và số, dấu cách và dấu gạch ngang.
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 }
Nhận tập hợp văn bản đã tạo
Sử dụng phương thức GetCorpusRequest
để truy cập Corpus
bạn đã tạo ở trên theo phương thức lập trình. Giá trị của tham số name
tham chiếu đến tên tài nguyên đầy đủ của Corpus
và được đặt trong ô ở trên là corpus_resource_name
. Định dạng dự kiến là 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)
Tạo một tài liệu
Corpus
có thể chứa tối đa 10.000 Document
. Bạn có thể chỉ định một trong các trường sau đây khi xác định tài liệu:
name
: Tên (mã nhận dạng) tài nguyênDocument
. Chỉ được chứa tối đa 40 ký tự (chỉ chữ và số hoặc dấu gạch ngang). Mã nhận dạng không được bắt đầu hoặc kết thúc bằng dấu gạch ngang. Nếu tên trống khi tạo, thì tên duy nhất sẽ được lấy từdisplay_name
cùng với một hậu tố ngẫu nhiên gồm 12 ký tự.display_name
: Tên hiển thị mà con người có thể đọc được. Chỉ được chứa tối đa 512 ký tự, bao gồm cả chữ và số, dấu cách và dấu gạch ngang.
Document
cũng hỗ trợ tối đa 20 trường custom_metadata
do người dùng chỉ định, được chỉ định dưới dạng cặp khoá-giá trị. Siêu dữ liệu tuỳ chỉnh có thể là chuỗi, danh sách chuỗi hoặc số. Xin lưu ý rằng danh sách chuỗi có thể hỗ trợ tối đa 10 giá trị và các giá trị số được biểu thị dưới dạng số dấu phẩy động trong API.
# Create a document with a custom display name.
example_document = glm.Document(display_name="Introducing Project IDX, An Experiment to Improve Full-stack, Multiplatform App Development")
# Add metadata.
# Metadata also supports numeric values not specified here
document_metadata = [
glm.CustomMetadata(key="url", string_value="https://developers.googleblog.com/2023/08/introducing-project-idx-experiment-to-improve-full-stack-multiplatform-app-development.html")]
example_document.custom_metadata.extend(document_metadata)
# Make the request
# corpus_resource_name is a variable set in the "Create a corpus" section.
create_document_request = glm.CreateDocumentRequest(parent=corpus_resource_name, document=example_document)
create_document_response = retriever_service_client.create_document(create_document_request)
# Set the `document_resource_name` for subsequent sections.
document_resource_name = create_document_response.name
print(create_document_response)
Tải tài liệu đã tạo
Sử dụng phương thức GetDocumentRequest
để truy cập theo phương thức lập trình vào tài liệu bạn đã tạo ở trên. Giá trị của tham số name
đề cập đến tên tài nguyên đầy đủ của tài liệu và được đặt trong ô ở trên là document_resource_name
. Định dạng hợp lệ là 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)
Nhập và phân đoạn tài liệu
Để cải thiện mức độ liên quan của nội dung do cơ sở dữ liệu vectơ trả về trong quá trình truy xuất ngữ nghĩa, hãy chia các tài liệu lớn thành các phần nhỏ hơn hoặc mảng trong khi nhập tài liệu.
Chunk
là một phần phụ của Document
được coi là một đơn vị độc lập cho mục đích biểu thị và lưu trữ vectơ. Chunk
có thể có tối đa 2043 mã thông báo. Corpus
có thể có tối đa 1 triệu Chunk
.
Tương tự như Document
, Chunks
cũng hỗ trợ tối đa 20 trường custom_metadata
do người dùng chỉ định, được chỉ định làm cặp khoá-giá trị. Siêu dữ liệu tuỳ chỉnh có thể là chuỗi, danh sách chuỗi hoặc số. Lưu ý rằng danh sách chuỗi có thể hỗ trợ tối đa 10 giá trị và giá trị số được biểu thị dưới dạng số dấu phẩy động trong API.
Hướng dẫn này sử dụng HtmlChunker nguồn mở của Google.
Bạn có thể sử dụng các phân đoạn khác như LangChain hoặc LlamaIndex.
Nhập HTML và phân đoạn qua htmlChunker
!pip install google-labs-html-chunker
from google_labs_html_chunker.html_chunker import HtmlChunker
from urllib.request import urlopen
Tải HTML DOM cho trang web. Tại đây, HTML được đọc trực tiếp, nhưng tốt hơn là bạn nên đưa HTML sau khi kết xuất vào HTML được chèn JavaScript, chẳng hạn như document.documentElement.innerHTML
.
with(urlopen("https://developers.googleblog.com/2023/08/introducing-project-idx-experiment-to-improve-full-stack-multiplatform-app-development.html")) as f:
html = f.read().decode("utf-8")
Chia tài liệu văn bản thành các đoạn và tạo Chunk
từ các đoạn này. Bước này sẽ tự tạo các đối tượng Chunk
và phần tiếp theo sẽ tải các đối tượng đó lên API Trình truy xuất ngữ nghĩa.
# 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)
Tạo hàng loạt các đoạn
Tạo các đoạn theo lô. Bạn có thể chỉ định tối đa 100 phần cho mỗi yêu cầu hàng loạt.
Sử dụng CreateChunk()
để tạo một đoạ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)
Ngoài ra, bạn có thể tạo các phân đoạn mà không cần sử dụng 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)
Liệt kê Chunk
và nhận trạng thái
Sử dụng phương thức ListChunksRequest
để lấy tất cả Chunk
có sẵn dưới dạng danh sách phân trang với giới hạn kích thước tối đa là 100 Chunk
trên mỗi trang, được sắp xếp theo thứ tự tăng dần của Chunk.create_time
. Nếu bạn không chỉ định giới hạn, hàm sẽ trả về tối đa 10 Chunk
.
Cung cấp next_page_token
được trả về trong phản hồi ListChunksRequest
làm đối số cho yêu cầu tiếp theo để truy xuất trang tiếp theo. Xin lưu ý rằng khi phân trang, tất cả các tham số khác được cung cấp cho ListChunks
phải khớp với lệnh gọi đã cung cấp mã thông báo trang.
Tất cả Chunk
đều trả về state
. Hãy dùng hàm này để kiểm tra trạng thái của Chunks
trước khi truy vấn Corpus
. Các trạng thái Chunk
bao gồm: UNSPECIFIED
, PENDING_PROCESSING
, ACTIVE
và FAILED
. Bạn chỉ có thể truy vấn 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}')
Nhập một tài liệu khác
Thêm một Document
khác thông qua HtmlChunker và thêm bộ lọc.
# 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)
Truy vấn tập hợp văn bản
Sử dụng phương thức QueryCorpusRequest
để thực hiện tìm kiếm ngữ nghĩa nhằm nhận được các đoạn văn bản có liên quan.
results_count
: Chỉ định số lượng đoạn văn bản cần trả về. Tối đa là 100. Nếu không chỉ định, API sẽ trả về tối đa 10Chunk
.metadata_filters
: Lọc theochunk_metadata
hoặcdocument_metadata
. MỗiMetadataFilter
cần tương ứng với một khoá duy nhất. Nhiều đối tượngMetadataFilter
được kết hợp với nhau bằng cácAND
logic. Các điều kiện bộ lọc siêu dữ liệu tương tự được kết hợp bằngOR
logic. Một số ví dụ:
(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} }]
}]
Xin lưu ý rằng chỉ giá trị số mới hỗ trợ toán tử "AND" cho cùng một khoá. Giá trị chuỗi chỉ hỗ trợ toán tử "OR" cho cùng một khoá.
("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)
Trả lời câu hỏi có phân bổ
Sử dụng phương thức GenerateAnswer
để thực hiện tính năng Trả lời câu hỏi được phân bổ trên tài liệu, kho dữ liệu hoặc một tập hợp các đoạn văn bản.
Trả lời câu hỏi có phân bổ (AQA) là việc trả lời các câu hỏi dựa trên một ngữ cảnh nhất định và cung cấp(các) thuộc tính, đồng thời giảm thiểu hiện tượng ảo giác.
GenerateAnswer
mang lại một số lợi thế so với việc sử dụng LLM chưa được điều chỉnh, trong trường hợp bạn muốn sử dụng AQA:
- Mô hình cơ bản đã được huấn luyện để chỉ trả về những câu trả lời dựa trên ngữ cảnh được cung cấp.
- Thẻ này xác định các thông tin ghi nhận sự đóng góp (các phân đoạn trong bối cảnh được cung cấp đã góp phần tạo ra câu trả lời). Thông tin phân bổ cho phép người dùng xác minh câu trả lời.
- Hàm này ước tính
answerable_probability
cho một cặp (câu hỏi, ngữ cảnh) nhất định, giúp bạn điều hướng hành vi của sản phẩm tuỳ thuộc vào khả năng câu trả lời được trả về là chính xác và có cơ sở.
answerable_probability
và vấn đề "Tôi không biết"
Trong một số trường hợp, câu trả lời tốt nhất cho câu hỏi thực sự là "Tôi không biết". Ví dụ: nếu ngữ cảnh được cung cấp không chứa câu trả lời cho câu hỏi, thì câu hỏi đó được coi là "không thể trả lời".
Mô hình AQA rất giỏi trong việc nhận dạng những trường hợp như vậy. Công cụ này thậm chí có thể phân biệt mức độ có thể trả lời và không thể trả lời.
Tuy nhiên, API GenerateAnswer
sẽ trao cho bạn quyền quyết định cuối cùng bằng cách:
- Luôn cố gắng trả về một câu trả lời có cơ sở – ngay cả khi câu trả lời đó có khả năng tương đối thấp là có cơ sở và chính xác.
- Trả về giá trị
answerable_probability
– Ước tính của mô hình về xác suất câu trả lời có cơ sở và chính xác.
answerable_probability
thấp có thể là do một hoặc nhiều yếu tố sau:
- Mô hình không tự tin rằng câu trả lời của mình là chính xác.
- Mô hình không tự tin rằng câu trả lời của nó dựa trên các đoạn trích được trích dẫn; Câu trả lời có thể bắt nguồn từ kiến thức thế giới. Ví dụ:
question="1+1=?", passages=["2+2=4”]
→answer=2, answerable_probability=0.02
- Mô hình đã cung cấp thông tin có liên quan nhưng chưa trả lời đầy đủ câu hỏi. Ví dụ:
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"
- Không có câu hỏi nào được định dạng đúng cách trong GenerateAnswerRequest.
Vì answerable_probability
thấp cho biết rằng GenerateAnswerResponse.answer có thể không chính xác hoặc không có căn cứ, bạn nên xử lý thêm phản hồi bằng cách kiểm tra answerable_probability
.
Khi answerable_probability
thấp, một số ứng dụng khách có thể muốn:
- Hiển thị thông báo "không thể trả lời câu hỏi đó" cho người dùng cuối.
- Quay lại một LLM dùng cho nhiều mục đích để trả lời câu hỏi từ kiến thức thế giới. Ngưỡng và bản chất của các phương án dự phòng đó sẽ phụ thuộc vào từng trường hợp sử dụng. Giá trị
answerable_probability
<= 0,5 là ngưỡng khởi đầu phù hợp.
Mẹo hữu ích về AQA
Để biết thông số kỹ thuật đầy đủ của API, hãy tham khảo Tài liệu tham khảo API GenerateAnswerRequest
.
- Độ dài đoạn văn bản: Bạn nên sử dụng tối đa 300 mã thông báo cho mỗi đoạn văn bản.
- Sắp xếp thông điệp:
- Nếu bạn cung cấp
GenerateAnswerRequest.inline_passages
, các đoạn văn phải được sắp xếp theo thứ tự giảm dần mức độ liên quan đối với cụm từ tìm kiếm. Nếu vượt quá giới hạn độ dài ngữ cảnh của mô hình, các đoạn cuối cùng (ít liên quan nhất) sẽ bị bỏ qua. - Nếu bạn cung cấp
GenerateAnswerRequest.semantic_retriever
, thì hệ thống sẽ tự động sắp xếp theo mức độ liên quan.
- Nếu bạn cung cấp
- Hạn chế: Mô hình AQA chuyên về việc trả lời câu hỏi. Đối với các trường hợp sử dụng khác như viết nội dung sáng tạo, tóm tắt nội dung, v.v., vui lòng gọi một mô hình mục đích chung thông qua GenerateContent.
- Trò chuyện: Nếu hoạt động trò chuyện của người dùng được xác định là một câu hỏi có thể trả lời được từ một ngữ cảnh nhất định, thì AQA có thể trả lời các truy vấn trò chuyện. Tuy nhiên, nếu dữ liệu đầu vào của người dùng có thể là bất kỳ loại mục nhập nào, thì mô hình dùng cho nhiều mục đích có thể là lựa chọn phù hợp hơn.
- Nhiệt độ:
- Nói chung, nhiệt độ tương đối thấp (~ 0,2) để AQA chính xác.
- Nếu trường hợp sử dụng của bạn dựa vào kết quả xác định, hãy đặt 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)
Các lựa chọn khác: AQA sử dụng đoạn văn cùng dòng
Ngoài ra, bạn có thể trực tiếp sử dụng điểm cuối AQA mà không cần sử dụng API Trình truy xuất ngữ nghĩa bằng cách truyền inline_passages
.
user_query = "What is AQA from Google?"
user_query_content = glm.Content(parts=[glm.Part(text=user_query)])
answer_style = "VERBOSE" # or ABSTRACTIVE, EXTRACTIVE
MODEL_NAME = "models/aqa"
# Create the grounding inline passages
grounding_passages = glm.GroundingPassages()
passage_a = glm.Content(parts=[glm.Part(text="Attributed Question and Answering (AQA) refers to answering questions grounded to a given corpus and providing citation")])
grounding_passages.passages.append(glm.GroundingPassage(content=passage_a, id="001"))
passage_b = glm.Content(parts=[glm.Part(text="An LLM is not designed to generate content grounded in a set of passages. Although instructing an LLM to answer questions only based on a set of passages reduces hallucination, hallucination still often occurs when LLMs generate responses unsupported by facts provided by passages")])
grounding_passages.passages.append(glm.GroundingPassage(content=passage_b, id="002"))
passage_c = glm.Content(parts=[glm.Part(text="Hallucination is one of the biggest problems in Large Language Models (LLM) development. Large Language Models (LLMs) could produce responses that are fictitious and incorrect, which significantly impacts the usefulness and trustworthiness of applications built with language models.")])
grounding_passages.passages.append(glm.GroundingPassage(content=passage_c, id="003"))
# Create the request
req = glm.GenerateAnswerRequest(model=MODEL_NAME,
contents=[user_query_content],
inline_passages=grounding_passages,
answer_style=answer_style)
aqa_response = generative_service_client.generate_answer(req)
print(aqa_response)
Chia sẻ tập hợp văn bản
Bạn có thể chọn chia sẻ tập hợp từ vựng với người khác bằng API CreatePermissionRequest
.
Giới hạn:
- Có 2 vai trò để chia sẻ:
READER
vàEDITOR
.READER
có thể truy vấn tập sao lục.WRITER
có các quyền của người đọc và ngoài ra có thể chỉnh sửa và chia sẻ tập hợp văn bản.
- Bạn có thể công khai một tập hợp bằng cách cấp cho
EVERYONE
quyền đọcuser_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)
Xoá tập hợp văn bản
Sử dụng DeleteCorpusRequest
để xoá một kho người dùng và tất cả Document
và Chunk
được liên kết.
Xin lưu ý rằng các tập hợp từ không trống sẽ gửi lỗi nếu bạn không chỉ định cờ force=True
. Nếu bạn đặt force=True
, mọi Chunk
và đối tượng liên quan đến Document
này cũng sẽ bị xoá.
Nếu force=False
(mặc định) và Document
chứa Chunk
bất kỳ, thì lỗi FAILED_PRECONDITION
sẽ được trả về.
# 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)
Tóm tắt và tài liệu đọc thêm
Hướng dẫn này giới thiệu Semantic Retriever và API Câu hỏi và câu trả lời được phân bổ (AQA) của API Ngôn ngữ tạo sinh, đồng thời hướng dẫn cách sử dụng API này để truy xuất thông tin ngữ nghĩa trên dữ liệu văn bản tuỳ chỉnh. Xin lưu ý rằng API này cũng hoạt động với khung dữ liệu LlamaIndex. Hãy tham khảo hướng dẫn này để tìm hiểu thêm.
Ngoài ra, hãy tham khảo tài liệu về API để tìm hiểu thêm về các chức năng khác hiện có.
Phụ lục: Thiết lập OAuth bằng thông tin đăng nhập của người dùng
Làm theo các bước bên dưới trong phần Bắt đầu nhanh về OAuth để thiết lập quy trình xác thực OAuth.
Uỷ quyền thông tin xác thực cho một ứng dụng dành cho máy tính. Để chạy sổ tay này trong Colab, trước tiên, hãy đổi tên tệp thông tin xác thực (thường là
client_secret_*.json
) thànhclient_secret.json
. Sau đó, hãy tải tệp lên bằng cách sử dụng biểu tượng tệp trên thanh bên trái, rồi sử dụng biểu tượng tải lên như trong ảnh chụp màn hình bên dưới.
# 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"
Khởi chạy thư viện ứng dụng và chạy lại sổ tay bắt đầu từ phần Tạo một tập hợp văn bản.
import google.ai.generativelanguage as glm
generative_service_client = glm.GenerativeServiceClient()
retriever_service_client = glm.RetrieverServiceClient()
permission_service_client = glm.PermissionServiceClient()