Setelah Anda membuat penyematan untuk gugus Anda, langkah selanjutnya adalah menghasilkan indeks dalam database vektor dan bereksperimen untuk menentukan pencarian optimal yang akan dilakukan. Saat Anda bereksperimen dengan pengambilan informasi, ada beberapa area yang perlu dipertimbangkan, termasuk opsi konfigurasi untuk indeks pencarian, jenis pencarian yang harus Anda lakukan, dan strategi reranking Anda. Artikel ini membahas tiga topik ini.
Artikel ini adalah bagian dari beberapa seri. Baca pengantar.
Indeks pencarian
Catatan
Azure AI Search adalah layanan pencarian Azure pihak pertama. Bagian ini akan menyebutkan beberapa spesifik untuk Pencarian AI. Jika Anda menggunakan penyimpanan yang berbeda, lihat dokumentasi untuk menemukan konfigurasi utama untuk layanan tersebut.
Indeks pencarian di penyimpanan Anda memiliki kolom untuk setiap bidang dalam data Anda. Penyimpanan pencarian umumnya memiliki dukungan untuk jenis data nonvektor seperti string, Boolean, bilangan bulat, tunggal, ganda, tanggalwaktu, dan koleksi seperti jenis data Koleksi(tunggal) dan vektor seperti Koleksi(tunggal). Untuk setiap kolom, Anda harus mengonfigurasi informasi seperti jenis data, apakah bidang dapat difilter, dapat diambil, dan/atau dapat dicari.
Berikut ini adalah beberapa keputusan utama yang harus Anda buat untuk konfigurasi pencarian vektor yang diterapkan ke bidang vektor:
- Algoritma pencarian vektor - Algoritma yang digunakan untuk mencari kecocokan relatif. Azure AI Search memiliki opsi algoritma brute-force yang memindai seluruh ruang vektor yang disebut KNN lengkap, dan opsi algoritma yang lebih berkinerja yang melakukan pencarian tetangga terdekat (ANN) yang disebut Hierarkis Navigable Small World (HNSW).
- metrik - Konfigurasi ini adalah metrik kesamaan yang digunakan untuk menghitung kedekatan dengan algoritma. Opsi dalam Azure AI Search adalah kosinus, dotProduct, dan Euclidean. Jika Anda menggunakan model penyematan Azure OpenAI, pilih
cosine
. - efConstruction - Parameter yang digunakan selama konstruksi indeks Hierarkis Navigable Small Worlds (HNSW) yang menetapkan jumlah tetangga terdekat yang terhubung ke vektor selama pengindeksan. Nilai efConstruction yang lebih besar menghasilkan indeks berkualitas lebih baik daripada angka yang lebih kecil. Tradeoff adalah bahwa nilai yang lebih besar membutuhkan lebih banyak waktu, penyimpanan, dan komputasi. efConstruction harus lebih tinggi untuk sejumlah besar gugus dan lebih rendah untuk sejumlah kecil gugus. Menentukan nilai optimal memerlukan eksperimen dengan data Anda dan kueri yang diharapkan.
- efSearch - Parameter yang digunakan pada waktu kueri untuk mengatur jumlah tetangga terdekat (yaitu, gugus serupa) yang digunakan selama pencarian.
- m - Jumlah tautan dua arah. Rentangnya adalah 4 hingga 10, dengan angka yang lebih rendah menghasilkan lebih sedikit kebisingan dalam hasil.
Di Azure AI Search, konfigurasi vektor dienkapsulasi dalam vectorSearch
konfigurasi. Saat mengonfigurasi kolom vektor, Anda mereferensikan konfigurasi yang sesuai untuk kolom vektor tersebut dan mengatur jumlah dimensi. Atribut dimensi kolom vektor mewakili jumlah dimensi yang dihasilkan oleh model penyematan yang Anda pilih. Misalnya, model yang dioptimalkan text-embedding-3-small
penyimpanan menghasilkan 1.536 dimensi.
Pencarian
Saat menjalankan kueri dari orkestrator permintaan terhadap penyimpanan pencarian, Anda memiliki banyak opsi untuk dipertimbangkan. Anda perlu menentukan:
- Jenis pencarian apa yang akan Anda lakukan: vektor atau kata kunci atau hibrid
- Apakah Anda akan mengkueri terhadap satu atau beberapa kolom
- Apakah Anda akan menjalankan beberapa kueri secara manual, seperti kueri kata kunci dan pencarian vektor
- Apakah kueri perlu dipecah menjadi subkueri
- Apakah pemfilteran harus digunakan dalam kueri Anda
Orkestrator prompt Anda mungkin mengambil pendekatan statis atau pendekatan dinamis yang mencampur pendekatan berdasarkan petunjuk konteks dari prompt. Bagian berikut membahas opsi ini untuk membantu Anda bereksperimen menemukan pendekatan yang tepat untuk beban kerja Anda.
Jenis pencarian
Platform pencarian umumnya mendukung pencarian teks lengkap dan vektor. Beberapa platform, seperti Azure AI Search mendukung pencarian hibrid. Untuk melihat kemampuan berbagai penawaran pencarian vektor, tinjau Memilih layanan Azure untuk pencarian vektor.
Pencarian vektor
Pencarian vektor cocok dengan kesamaan antara kueri vektorisasi (prompt) dan bidang vektor.
Penting
Anda harus melakukan operasi pembersihan yang sama dengan yang Anda lakukan pada potongan sebelum menyematkan kueri. Misalnya, jika Anda menurunkan huruf kecil setiap kata dalam potongan yang disematkan, Anda harus huruf kecil setiap kata dalam kueri sebelum menyematkan.
Catatan
Anda dapat melakukan pencarian vektor terhadap beberapa bidang vektor dalam kueri yang sama. Di Azure AI Search, secara teknis merupakan pencarian hibrid. Untuk informasi selengkapnya, lihat bagian tersebut.
embedding = embedding_model.generate_embedding(
chunk=str(pre_process.preprocess(query))
)
vector = RawVectorQuery(
k=retrieve_num_of_documents,
fields="contentVector",
vector=embedding,
)
results = client.search(
search_text=None,
vector_queries=[vector],
top=retrieve_num_of_documents,
select=["title", "content", "summary"],
)
Kode sampel melakukan pencarian vektor terhadap contentVector
bidang . Perhatikan bahwa kode yang menyematkan kueri melakukan praproses kueri terlebih dahulu. Praproses tersebut harus berupa kode yang sama yang melakukan praproses potongan sebelum penyematan. Model penyematan harus model penyematan yang sama yang menyematkan gugus.
Pencarian teks-lengkap
Pencarian teks lengkap cocok dengan teks biasa yang disimpan dalam indeks. Ini adalah praktik umum untuk mengekstrak kata kunci dari kueri dan menggunakan kata kunci yang diekstrak tersebut dalam pencarian teks lengkap terhadap satu atau beberapa kolom terindeks. Pencarian teks lengkap dapat dikonfigurasi untuk mengembalikan kecocokan di mana istilah atau semua istilah cocok.
Anda harus bereksperimen untuk menentukan bidang mana yang efektif untuk menjalankan pencarian teks lengkap. Seperti yang dibahas dalam fase Pengayaan, kata kunci, dan bidang metadata entitas adalah kandidat yang baik untuk dipertimbangkan untuk pencarian teks lengkap dalam skenario di mana konten memiliki arti semantik yang sama, tetapi entitas atau kata kunci berbeda. Bidang umum lainnya yang perlu dipertimbangkan untuk pencarian teks lengkap adalah judul, ringkasan, dan teks gugus.
formatted_search_results = []
results = client.search(
search_text=query,
top=retrieve_num_of_documents,
select=["title", "content", "summary"],
)
formatted_search_results = format_results(results)
Kode sampel melakukan pencarian teks lengkap terhadap bidang judul, konten, dan ringkasan.
Pencarian hibrid
Azure AI Search mendukung kueri Hibrid di mana kueri Anda bisa berisi satu atau beberapa pencarian teks dan satu atau beberapa pencarian vektor. Platform melakukan setiap kueri, mendapatkan hasil perantara, mererank hasil menggunakan Reciprocal Rank Fusion (RRF), dan mengembalikan hasil N teratas.
embedding = embedding_model.generate_embedding(
chunk=str(pre_process.preprocess(query))
)
vector1 = RawVectorQuery(
k=retrieve_num_of_documents,
fields="contentVector",
vector=embedding,
)
vector2 = RawVectorQuery(
k=retrieve_num_of_documents,
fields="questionVector",
vector=embedding,
)
results = client.search(
search_text=query,
vector_queries=[vector1, vector2],
top=retrieve_num_of_documents,
select=["title", "content", "summary"],
)
Kode sampel melakukan pencarian teks lengkap terhadap bidang judul, konten, dan ringkasan dan pencarian vektor terhadap bidang contentVector dan questionVector. Platform Azure AI Search menjalankan semua kueri secara paralel, melakukan rerank hasil, dan mengembalikan dokumen retrieve_num_of_documents teratas.
Beberapa manual
Anda tentu saja dapat menjalankan beberapa kueri, seperti pencarian vektor dan pencarian teks lengkap kata kunci, secara manual. Anda mengagregasi hasil dan mererank hasil secara manual dan mengembalikan hasil teratas. Berikut ini adalah kasus penggunaan untuk beberapa manual:
- Anda menggunakan platform pencarian yang tidak mendukung pencarian hibrid. Anda akan mengikuti opsi ini untuk melakukan pencarian hibrid Anda sendiri.
- Anda ingin menjalankan pencarian teks lengkap terhadap kueri yang berbeda. Misalnya, Anda dapat mengekstrak kata kunci dari kueri dan menjalankan pencarian teks lengkap terhadap bidang metadata kata kunci Anda. Anda kemudian dapat mengekstrak entitas dan menjalankan kueri terhadap bidang metadata entitas.
- Anda ingin mengontrol sendiri proses reranking.
- Kueri mengharuskan beberapa subkueri dijalankan untuk mengambil data grounding dari beberapa sumber.
Beberapa subkueri
Beberapa perintah bersifat kompleks dan memerlukan lebih dari satu kumpulan data untuk membumikan model. Misalnya, kueri "Bagaimana cara kerja mobil listrik dan bagaimana perbandingannya dengan kendaraan ICE?" kemungkinan memerlukan data grounding dari beberapa sumber.
Adalah praktik yang baik untuk menentukan apakah kueri memerlukan beberapa pencarian sebelum menjalankan pencarian apa pun. Jika Anda dianggap memerlukan beberapa subkueri, Anda dapat menjalankan beberapa kueri manual untuk semua kueri. Gunakan model bahasa besar untuk menentukan apakah beberapa subkueri diperlukan. Perintah berikut diambil dari repositori GITHub Akselerator Eksperimen RAG yang digunakan untuk mengategorikan kueri sebagai sederhana atau kompleks, dengan kompleks membutuhkan beberapa kueri:
Consider the given question to analyze and determine if it falls into one of these categories:
1. Simple, factual question
a. The question is asking for a straightforward fact or piece of information
b. The answer could likely be found stated directly in a single passage of a relevant document
c. Breaking the question down further is unlikely to be beneficial
Examples: "What year did World War 2 end?", "What is the capital of France?, "What is the features of productX?"
2. Complex, multi-part question
a. The question has multiple distinct components or is asking for information about several related topics
b. Different parts of the question would likely need to be answered by separate passages or documents
c. Breaking the question down into sub-questions for each component would allow for better results
d. The question is open-ended and likely to have a complex or nuanced answer
e. Answering it may require synthesizing information from multiple sources
f. The question may not have a single definitive answer and could warrant analysis from multiple angles
Examples: "What were the key causes, major battles, and outcomes of the American Revolutionary War?", "How do electric cars work and how do they compare to gas-powered vehicles?"
Based on this rubric, does the given question fall under category 1 (simple) or category 2 (complex)? The output should be in strict JSON format. Ensure that the generated JSON is 100 percent structurally correct, with proper nesting, comma placement, and quotation marks. There should not be any comma after last element in the JSON.
Example output:
{
"category": "simple"
}
Model bahasa besar juga dapat digunakan untuk mengekstrak subkueri dari kueri yang kompleks. Perintah berikut diambil dari repositori GITHub RAG Experiment Accelerator yang mengonversi kueri kompleks menjadi beberapa subkueri .
Your task is to take a question as input and generate maximum 3 sub-questions that cover all aspects of the original question. The output should be in strict JSON format, with the sub-questions contained in an array.
Here are the requirements:
1. Analyze the original question and identify the key aspects or components.
2. Generate sub-questions that address each aspect of the original question.
3. Ensure that the sub-questions collectively cover the entire scope of the original question.
4. Format the output as a JSON object with a single key "questions" that contains an array of the generated sub-questions.
5. Each sub-question should be a string within the "questions" array.
6. The JSON output should be valid and strictly formatted.
7. Ensure that the generated JSON is 100 percent structurally correct, with proper nesting, comma placement, and quotation marks. The JSON should be formatted with proper indentation for readability.
8. There should not be any comma after last element in the array.
Example input question:
What are the main causes of deforestation, and how can it be mitigated?
Example output:
{
"questions": [
"What are the primary human activities that contribute to deforestation?",
"How does agriculture play a role in deforestation?",
"What is the impact of logging and timber harvesting on deforestation?",
"How do urbanization and infrastructure development contribute to deforestation?",
"What are the environmental consequences of deforestation?",
"What are some effective strategies for reducing deforestation?",
"How can reforestation and afforestation help mitigate the effects of deforestation?",
"What role can governments and policies play in preventing deforestation?",
"How can individuals and communities contribute to reducing deforestation?"
]
}
Meneruskan gambar dalam kueri
Beberapa model multimodal seperti GPT-4V dan GPT-4o dapat menafsirkan gambar. Jika Anda menggunakan model ini, Anda dapat memilih apakah Anda ingin menghindari pemotongan gambar dan meneruskan gambar sebagai bagian dari perintah ke model multimodal. Anda harus bereksperimen untuk menentukan performa pendekatan ini dibandingkan dengan memotong gambar dengan dan tanpa melewati konteks tambahan. Anda juga harus membandingkan perbedaan biaya antara pendekatan dan melakukan analisis manfaat biaya.
Filter
Bidang di penyimpanan pencarian yang dikonfigurasi sebagai dapat difilter dapat digunakan untuk memfilter kueri. Pertimbangkan untuk memfilter kata kunci dan entitas untuk kueri yang menggunakan bidang tersebut untuk membantu mempersempit hasilnya. Pemfilteran memungkinkan Anda hanya mengambil data yang memenuhi kondisi tertentu dari indeks dengan menghilangkan data yang tidak relevan. Ini meningkatkan performa keseluruhan kueri dengan hasil yang lebih relevan. Seperti halnya setiap keputusan, penting untuk bereksperimen dan menguji. Kueri mungkin tidak memiliki kata kunci atau kata kunci, singkatan, atau akronim yang salah. Anda perlu mempertimbangkan kasus-kasus ini.
Reranking
Reranking memungkinkan Anda menjalankan satu atau beberapa kueri, mengagregasi hasil, dan memberi peringkat hasil tersebut. Pertimbangkan alasan berikut untuk mererank hasil pencarian Anda:
- Anda melakukan beberapa pencarian manual dan ingin menggabungkan hasilnya dan memberi peringkat.
- Pencarian vektor dan kata kunci tidak selalu akurat. Anda dapat meningkatkan jumlah dokumen yang dikembalikan dari pencarian Anda, berpotensi menyertakan beberapa hasil valid yang jika tidak akan diabaikan, dan menggunakan reranking untuk mengevaluasi hasilnya.
Anda dapat menggunakan model bahasa besar atau penyandi silang untuk melakukan reranking. Beberapa platform, seperti Azure AI Search memiliki metode kepemilikan untuk mererank hasil. Anda dapat mengevaluasi opsi ini untuk data Anda untuk menentukan apa yang paling sesuai untuk skenario Anda. Bagian berikut memberikan detail tentang metode ini.
Reranking model bahasa besar
Berikut ini adalah contoh permintaan model bahasa besar dari akselerator eksperimen RAG yang melakukan reranks hasil.
A list of documents is shown below. Each document has a number next to it along with a summary of the document. A question is also provided.
Respond with the numbers of the documents you should consult to answer the question, in order of relevance, as well as the relevance score as json string based on json format as shown in the schema section. The relevance score is a number from 1–10 based on how relevant you think the document is to the question. The relevance score can be repetitive. Don't output any additional text or explanation or metadata apart from json string. Just output the json string and strip rest every other text. Strictly remove any last comma from the nested json elements if it's present.
Don't include any documents that are not relevant to the question. There should exactly be one documents element.
Example format:
Document 1:
content of document 1
Document 2:
content of document 2
Document 3:
content of document 3
Document 4:
content of document 4
Document 5:
content of document 5
Document 6:
content of document 6
Question: user defined question
schema:
{
"documents": {
"document_1": "Relevance",
"document_2": "Relevance"
}
}
Reranking penyandi silang
Contoh berikut dari repositori GITHub RAG Experiment Accelerator menggunakan CrossEncoder yang disediakan oleh Hugging Face untuk memuat model Roberta. Kemudian iterasi atas setiap gugus dan menggunakan model untuk menghitung kesamaan, memberi mereka nilai. Kami mengurutkan hasil dan mengembalikan N teratas.
from sentence_transformers import CrossEncoder
...
model_name = 'cross-encoder/stsb-roberta-base'
model = CrossEncoder(model_name)
cross_scores_ques = model.predict(
[[user_prompt, item] for item in documents],
apply_softmax=True,
convert_to_numpy=True,
)
top_indices_ques = cross_scores_ques.argsort()[-k:][::-1]
sub_context = []
for idx in list(top_indices_ques):
sub_context.append(documents[idx])
Pangkat semantik
Azure AI Search memiliki fitur kepemilikan yang disebut peringkat semantik. Fitur ini menggunakan model pembelajaran mendalam yang diadaptasi dari Microsoft Bing yang mempromosikan hasil yang paling relevan secara semantik. Baca hal berikut untuk melihat Cara kerja pemeringkat semantik.
Panduan pencarian
Pertimbangkan panduan umum berikut saat menerapkan solusi pencarian Anda:
- Judul, ringkasan, sumber, dan konten mentah (tidak dibersihkan) adalah bidang yang baik untuk dikembalikan dari pencarian.
- Tentukan di muka apakah kueri perlu dipecah menjadi subkueri.
- Secara umum, ini adalah praktik yang baik untuk menjalankan kueri pada beberapa bidang, baik kueri vektor maupun teks. Saat menerima kueri, Anda tidak tahu apakah pencarian vektor atau pencarian teks lebih baik. Anda lebih lanjut tidak tahu bidang apa yang paling baik untuk dicari oleh pencarian vektor atau pencarian kata kunci. Anda dapat mencari di beberapa bidang, berpotensi dengan beberapa kueri, mererank hasil dan mengembalikan hasil dengan skor tertinggi.
- Kata kunci dan bidang entitas adalah kandidat yang baik untuk mempertimbangkan pemfilteran.
- Ini adalah praktik yang baik untuk menggunakan kata kunci bersama dengan pencarian vektor. Kata kunci memfilter hasil ke subset yang lebih kecil. Penyimpanan vektor bekerja melawan subset tersebut untuk menemukan kecocokan terbaik.
Evaluasi pencarian
Dalam fase persiapan, Anda seharusnya mengumpulkan kueri pengujian bersama dengan informasi dokumen pengujian. Anda bisa menggunakan informasi berikut yang Anda kumpulkan dalam fase tersebut untuk mengevaluasi hasil pencarian Anda:
- Kueri - Kueri sampel
- Konteks - Kumpulan semua teks dalam dokumen pengujian yang menangani kueri sampel
Berikut ini adalah tiga metode evaluasi pengambilan yang mapan yang dapat Anda gunakan untuk mengevaluasi solusi pencarian Anda:
- Presisi di K - Persentase item relevan yang diidentifikasi dengan benar dari total hasil pencarian. Metrik ini berfokus pada akurasi hasil pencarian Anda.
- Pengenalan di K - Pengenalan di K mengukur persentase item yang relevan di K teratas dari total item relatif yang mungkin. Metrik ini berfokus pada cakupan hasil pencarian.
- Mean Reciprocal Rank (MRR) - MRR mengukur rata-rata peringkat timbal balik dari jawaban relevan pertama dalam hasil pencarian peringkat Anda. Metrik ini berfokus pada di mana hasil relevan pertama terjadi dalam hasil pencarian.
Anda harus menguji contoh positif dan negatif. Untuk contoh positif, Anda ingin metrik sedekat mungkin dengan 1. Untuk contoh negatif, di mana data Anda seharusnya tidak dapat mengatasi kueri, Anda ingin metrik sedekat mungkin dengan 0. Anda harus menguji semua kueri pengujian dan rata-rata hasil kueri positif dan hasil kueri negatif untuk memahami performa hasil pencarian Anda secara agregat.