Dalam era digital sarat maklumat, mengekstrak cerapan yang boleh diambil tindakan daripada set data yang besar adalah lebih penting berbanding sebelum ini. Baru-baru ini, saya memulakan perjalanan untuk memanfaatkan Retrieval-Augmented Generation (RAG) untuk menangani cabaran utama — menyampaikan jawapan tepat daripada koleksi nota mesyuarat yang banyak. Blog ini meneroka halangan, penyelesaian dan pencapaian yang menjadikan sistem menjawab pertanyaan berasaskan RAG saya menjadi alat yang teguh untuk mengekstrak cerapan daripada data mesyuarat tidak berstruktur.
Pernyataan Masalah: Cabaran dalam Menjawab Pertanyaan dengan RAG
Salah satu cabaran utama ialah membina sistem yang mampu memproses pertanyaan khusus yang kompleks dan khusus dalam repositori besar nota mesyuarat. Model menjawab pertanyaan RAG tradisional sering mengembalikan maklumat yang tidak relevan atau tidak lengkap, gagal menangkap niat pengguna. Sifat data mesyuarat yang tidak berstruktur digabungkan dengan jenis pertanyaan yang pelbagai memerlukan penyelesaian yang lebih halus.
Pendekatan Awal: Meletakkan Asas untuk Menjawab Pertanyaan yang Berkesan
Saya bermula dengan model RAG asas yang direka untuk menggabungkan perolehan semula dan penjanaan tindak balas. Dua teknik awal yang digunakan ialah:
Chunking: Memecahkan dokumen besar kepada segmen yang lebih kecil mengikut sempadan ayat mempertingkatkan perolehan semula dengan mengecilkan skop carian.
Pembenaman dan Penyimpanan Vektor: Selepas pemotongan, setiap segmen dibenamkan dan disimpan dalam pangkalan data vektor, membolehkan carian yang cekap.
Walau bagaimanapun, persediaan ini mempunyai had. Pendekatan chunking awal selalunya membawa kepada mendapatkan semula maklumat yang tidak berkaitan dan jawapan yang dihasilkan tidak mempunyai ketepatan dan penjajaran dengan niat setiap pertanyaan.
Cabaran dalam Menjawab Pertanyaan RAG Skala Besar
Cabaran ini menekankan keperluan untuk pendekatan yang lebih maju untuk meningkatkan ketepatan dalam menjawab pertanyaan RAG.
Teknik RAG Terperinci untuk Ketepatan Pertanyaan Dipertingkat (Penyelesaian)
Untuk menangani isu ini, saya menggunakan beberapa metodologi lanjutan, memperhalusi sistem secara berulang:
Chunking Semantik
Tidak seperti chunking tradisional, Semantic Chunking mengutamakan makna dalam setiap segmen, meningkatkan perkaitan dengan menyelaraskan maklumat yang diperoleh dengan niat pertanyaan.
from langchain_experimental.text_splitter import SemanticChunker from langchain_openai.embeddings import OpenAIEmbeddings from langchain.schema import Document # Initialize OpenAI Embeddings with API key openai_api_key = "" embedder = OpenAIEmbeddings(openai_api_key=openai_api_key) text_splitter = SemanticChunker(embedder) def prepare_docs_for_indexing(videos): all_docs = [] for video in videos: video_id = video.get('video_id') title = video.get('video_name') transcript_info = video.get('details', {}).get('transcript_info', {}) summary = video.get('details', {}).get('summary') created_at = transcript_info.get('created_at') # Getting the created_at timestamp # Get the full transcription text transcription_text = transcript_info.get('transcription_text', '') # Create documents using semantic chunking docs = text_splitter.create_documents([transcription_text]) for doc in docs: # Add metadata to each document doc.metadata = { "created_at": created_at, "title": title, "video_id": video_id, "summary": summary } all_docs.append(doc) return all_docs docs = prepare_docs_for_indexing(videos) # Output the created documents for doc in docs: print("____________") print(doc.page_content)
Pendapatan Margin Maksimum
Kaedah ini meningkatkan ketepatan perolehan semula dengan membezakan antara data yang berkaitan dan tidak relevan, memastikan bahawa hanya ketulan data yang paling sepadan diambil.
Pemarkahan Lambda
Menggunakan Pemarkahan Lambda, saya boleh menilai hasil berdasarkan perkaitan, mengutamakan respons yang sejajar lebih rapat dengan niat pertanyaan untuk kualiti jawapan yang lebih baik.
from langchain_community.vectorstores import OpenSearchVectorSearch from langchain_openai import OpenAIEmbeddings embeddings = OpenAIEmbeddings() docsearch = OpenSearchVectorSearch.from_documents( docs, embeddings, opensearch_url="http://localhost:9200" ) query = "your query" docs = docsearch.max_marginal_relevance_search(query, k=2, fetch_k=10, lambda_param=0.25)
Berbilang Pertanyaan dan Gabungan RAG
Untuk soalan yang kompleks, sistem menjana berbilang sub-pertanyaan. RAG Fusion kemudian menyepadukan jawapan yang pelbagai ke dalam satu tindak balas yang padu, meningkatkan kualiti tindak balas dan mengurangkan ralat.
def generate_multi_queries(question: str): # Template to generate multiple queries template = """You are an AI language model assistant. Your task is to generate five different versions of the given user question to retrieve relevant documents from a vector database. By generating multiple perspectives on the user question, your goal is to help the user overcome some of the limitations of the distance-based similarity search. Provide these alternative questions separated by newlines. Original question: {question}""" # Creating a prompt template for query generation prompt_perspectives = ChatPromptTemplate.from_template(template) # Generate the queries using ChatOpenAI and output parser generate_queries = ( prompt_perspectives | ChatOpenAI(temperature=0, openai_api_key=openai_api_key) | StrOutputParser() | (lambda x: x.split("\n")) ) # Invoke the chain to generate queries multi_queries = generate_queries.invoke({"question": question}) return multi_queries
def reciprocal_rank_fusion(results: list[list], k=60): """Applies Reciprocal Rank Fusion (RRF) to fuse ranked document lists.""" fused_scores = {} for docs in results: for rank, doc in enumerate(docs): doc_str = dumps(doc) # Convert to a serializable format if doc_str not in fused_scores: fused_scores[doc_str] = 0 fused_scores[doc_str] += 1 / (rank + k) # RRF formula # Sort documents by the fused score reranked_results = [ (loads(doc), score) for doc, score in sorted(fused_scores.items(), key=lambda x: x[1], reverse=True) ] return reranked_result
Pengindeksan Dipertingkat dan Carian Vektor Dioptimumkan
Memperbaik mekanisme pengindeksan dan memperhalusi parameter carian vektor menjadikan carian lebih cepat dan tepat, terutamanya untuk set data yang besar.
Keputusan: Pencapaian Utama dalam Menjawab Pertanyaan RAG
Melaksanakan teknik ini membawa kepada peningkatan yang ketara:
Pengambilan Utama dan Pengajaran yang Diperoleh
Melalui perjalanan ini, saya mengenal pasti beberapa cerapan teras:
Kesimpulan: Prospek Masa Depan untuk Sistem Berasaskan RAG
Mempertingkatkan model RAG dengan teknik lanjutan mengubah sistem perolehan semula yang mudah menjadi alat yang berkuasa untuk menjawab pertanyaan yang kompleks dan bernuansa. Melihat ke hadapan, saya menyasarkan untuk menggabungkan keupayaan pembelajaran masa nyata, membolehkan sistem menyesuaikan diri secara dinamik kepada data baharu. Pengalaman ini memperdalam kemahiran teknikal saya dan menyerlahkan kepentingan fleksibiliti, fokus semantik dan penambahbaikan berulang dalam sistem perolehan data.
Pemikiran Akhir: Panduan untuk Melaksanakan Sistem RAG Lanjutan
Dengan berkongsi pengalaman saya dalam mengatasi cabaran RAG, saya berharap dapat menawarkan panduan untuk melaksanakan penyelesaian yang serupa. Teknik strategik, digabungkan dengan penghalusan berulang, bukan sahaja menyelesaikan isu segera tetapi juga meletakkan asas yang kukuh untuk kemajuan masa depan dalam sistem menjawab pertanyaan.
Atas ialah kandungan terperinci Menguasai Menjawab Pertanyaan dengan RAG: Mengatasi Cabaran Utama dalam Data Mesyuarat Berskala Besar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!