برنامه نویسی

تسلط بر پاسخ پرس و جو با RAG: غلبه بر چالش های کلیدی در داده های جلسه در مقیاس بزرگ

Summarize this content to 400 words in Persian Lang
در عصر دیجیتالی پربار اطلاعات، استخراج بینش‌های عملی از مجموعه داده‌های بزرگ بسیار مهم‌تر از همیشه است. اخیراً، من سفری را برای استفاده از Retrieval-Augmented Generation (RAG) برای مقابله با یک چالش بزرگ آغاز کردم – ارائه پاسخ های دقیق از مجموعه گسترده ای از یادداشت های جلسه. این وبلاگ موانع، راه‌حل‌ها و دستاوردهایی را بررسی می‌کند که سیستم پاسخ‌گویی پرس و جو مبتنی بر RAG من را به ابزاری قوی برای استخراج اطلاعات از داده‌های بدون ساختار جلسه تبدیل کرده است.

بیان مشکل: چالش‌ها در پاسخ به پرسش با RAGیکی از چالش های اصلی، ساختن سیستمی بود که قادر به پردازش پرس و جوهای پیچیده و مختص به هدف در یک مخزن عظیم از یادداشت های جلسه بود. مدل‌های سنتی پاسخ‌دهی به پرس و جو RAG اغلب اطلاعات نامربوط یا ناقص را برمی‌گرداندند، و نتوانستند هدف کاربر را به تصویر بکشند. ماهیت ساختار نیافته داده های جلسه همراه با انواع پرس و جوهای متنوع، راه حل دقیق تری را ایجاب می کند.

رویکرد اولیه: پایه گذاری برای پاسخگویی مؤثر به پرس و جومن با یک مدل پایه RAG که برای ترکیب بازیابی و تولید پاسخ طراحی شده بود شروع کردم. دو تکنیک اولیه مورد استفاده عبارت بودند از:

تکه تکه شدن: شکستن اسناد بزرگ به بخش های کوچکتر بر اساس مرزهای جمله، بازیابی را با محدود کردن دامنه جستجو بهبود بخشید.
جاسازی و ذخیره سازی برداری: پس از تکه تکه کردن، هر بخش در یک پایگاه داده برداری جاسازی و ذخیره شد و امکان جستجوی کارآمد را فراهم کرد.

با این حال، این تنظیم محدودیت هایی داشت. رویکرد انشعاب اولیه اغلب منجر به بازیابی اطلاعات نامربوط می شد و پاسخ های تولید شده فاقد دقت و همسویی با هدف هر پرس و جو بود.

چالش‌ها در پاسخگویی به پرسش RAG در مقیاس بزرگ

رسیدگی به پرس و جوهای پیچیده: برخی از سؤالات پیچیده نیاز به درک معنایی عمیق تری فراتر از جستجوی معنایی اساسی دارند.
عدم تطابق متنی: تکه های بازیابی شده اغلب از نظر زمینه مشابه بودند اما به اندازه کافی دقیق نبودند تا نیازهای پرس و جو را برآورده کنند.
محدودیت‌های دقت بازیابی: بازیابی مجموعه کوچکی از اسناد (مثلاً پنج تا ده) اغلب منجر به نتایج محدودی می‌شود که فاقد ارتباط هستند.

این چالش‌ها بر نیاز به یک رویکرد پیشرفته‌تر برای بهبود دقت در پاسخ‌گویی به پرس و جو RAG تأکید کرد.

تکنیک های پیشرفته RAG برای دقت جستجوی پیشرفته (راه حل)برای پرداختن به این مسائل، چندین روش پیشرفته را به کار بردم و به طور مکرر سیستم را اصلاح کردم:قطعه بندی معناییبر خلاف تقسیم بندی سنتی، Semantic Chunking معنا را در هر بخش اولویت بندی می کند، و ارتباط را با تراز کردن اطلاعات بازیابی شده با هدف پرس و جو افزایش می دهد.

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)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حداکثر بازیابی حاشیهاین روش با تمایز بین داده‌های مرتبط و نامربوط، دقت بازیابی را بهبود بخشید، و اطمینان حاصل کرد که تنها تکه‌های داده با بهترین تطابق بازیابی می‌شوند.

امتیاز لامبدابا استفاده از امتیازدهی لامبدا، می‌توانم نتایج را بر اساس ارتباط رتبه‌بندی کنم، و پاسخ‌هایی را که با هدف پرس و جو هماهنگ‌تر هستند برای کیفیت بهتر پاسخ، اولویت‌بندی کنم.

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)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Multi-Query و RAG Fusionبرای سؤالات پیچیده، سیستم چندین سؤال فرعی ایجاد می کند. سپس RAG Fusion پاسخ‌های متنوع را در یک پاسخ منسجم و منسجم ادغام می‌کند و کیفیت پاسخ را بهبود می‌بخشد و خطا را کاهش می‌دهد.

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

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نمایه سازی پیشرفته و جستجوی برداری بهینه شدهبهبود مکانیسم نمایه‌سازی و اصلاح پارامترهای جستجوی برداری، بازیابی را سریع‌تر و دقیق‌تر کرد، به‌ویژه برای مجموعه‌های داده بزرگ.

نتایج: دستاوردهای کلیدی در پاسخ به پرسش RAGاجرای این تکنیک ها به پیشرفت های قابل توجهی منجر شد:

افزایش دقت بازیابی: تکنیک‌هایی مانند Semantic Chunking و Maximum Margin Retrieval بازیابی داده‌ها را اصلاح کردند و تضمین می‌کنند که فقط مرتبط‌ترین تکه‌ها برگردانده می‌شوند.
ارتباط افزایش یافته: امتیاز لامبدا به طور موثر نتایج مربوطه را اولویت بندی می کند، و پاسخ ها را با هدف پرس و جو هماهنگ می کند.
مدیریت بهبود یافته پرس و جوهای پیچیده: تولید چند پرس و جو و RAG Fusion سیستم را قادر می سازد تا سوالات پیچیده را مدیریت کند و پاسخ های جامعی ارائه دهد.
استحکام بیشتر سیستم: این اصلاحات سیستم را از یک مدل پایه به یک ابزار پیچیده و قابل اعتماد پاسخگوی پرس و جو برای داده های جلسات بدون ساختار و مقیاس بزرگ ارتقا داد.

نکات کلیدی و درس های آموخته شدهاز طریق این سفر، چندین بینش اصلی را شناسایی کردم:

سازگاری کلید است: راه حل های موثر به ندرت در اولین تلاش ظاهر می شوند. بهبود مکرر و انعطاف پذیری ضروری است.
روش‌های لایه‌ای استحکام را بهبود می‌بخشند: یکپارچه‌سازی چندین رویکرد – تقسیم معنایی، بازیابی حداکثر حاشیه، امتیازدهی لامبدا – سیستم قوی‌تر و مؤثرتری ایجاد کرد.
مدیریت کامل پرس و جو: تولید چند پرس و جو و RAG Fusion اهمیت پرداختن به سوالات از منظرهای متعدد را برجسته می کند.
تمرکز بر معناشناسی: تأکید بر معنا در داده ها به جای ساختار به تنهایی، دقت بازیابی را به طور قابل توجهی بهبود بخشید.

نتیجه گیری: چشم انداز آینده برای سیستم های مبتنی بر RAGبهبود مدل‌های RAG با تکنیک‌های پیشرفته، یک سیستم بازیابی ساده را به ابزاری قدرتمند برای پاسخ‌گویی به پرسش‌های پیچیده و ظریف تبدیل کرد. با نگاهی به آینده، هدف من این است که قابلیت‌های یادگیری بلادرنگ را ترکیب کنم، که به سیستم اجازه می‌دهد به صورت پویا با داده‌های جدید سازگار شود. این تجربه مهارت های فنی من را عمیق تر کرد و اهمیت انعطاف پذیری، تمرکز معنایی و بهبود مکرر در سیستم های بازیابی داده ها را برجسته کرد.

افکار نهایی: راهنمای پیاده سازی سیستم های پیشرفته RAGبا به اشتراک گذاشتن تجربه خود در غلبه بر چالش های RAG، امیدوارم بتوانم راهنمای پیاده سازی راه حل های مشابه را ارائه دهم. تکنیک‌های استراتژیک، همراه با پالایش تکراری، نه تنها مشکلات فوری را حل می‌کنند، بلکه پایه‌ای قوی برای پیشرفت‌های آینده در سیستم‌های پاسخ‌گوی پرس و جو ایجاد می‌کنند.

در عصر دیجیتالی پربار اطلاعات، استخراج بینش‌های عملی از مجموعه داده‌های بزرگ بسیار مهم‌تر از همیشه است. اخیراً، من سفری را برای استفاده از Retrieval-Augmented Generation (RAG) برای مقابله با یک چالش بزرگ آغاز کردم – ارائه پاسخ های دقیق از مجموعه گسترده ای از یادداشت های جلسه. این وبلاگ موانع، راه‌حل‌ها و دستاوردهایی را بررسی می‌کند که سیستم پاسخ‌گویی پرس و جو مبتنی بر RAG من را به ابزاری قوی برای استخراج اطلاعات از داده‌های بدون ساختار جلسه تبدیل کرده است.

بیان مشکل: چالش‌ها در پاسخ به پرسش با RAG
یکی از چالش های اصلی، ساختن سیستمی بود که قادر به پردازش پرس و جوهای پیچیده و مختص به هدف در یک مخزن عظیم از یادداشت های جلسه بود. مدل‌های سنتی پاسخ‌دهی به پرس و جو RAG اغلب اطلاعات نامربوط یا ناقص را برمی‌گرداندند، و نتوانستند هدف کاربر را به تصویر بکشند. ماهیت ساختار نیافته داده های جلسه همراه با انواع پرس و جوهای متنوع، راه حل دقیق تری را ایجاب می کند.

رویکرد اولیه: پایه گذاری برای پاسخگویی مؤثر به پرس و جو
من با یک مدل پایه RAG که برای ترکیب بازیابی و تولید پاسخ طراحی شده بود شروع کردم. دو تکنیک اولیه مورد استفاده عبارت بودند از:

  1. تکه تکه شدن: شکستن اسناد بزرگ به بخش های کوچکتر بر اساس مرزهای جمله، بازیابی را با محدود کردن دامنه جستجو بهبود بخشید.

  2. جاسازی و ذخیره سازی برداری: پس از تکه تکه کردن، هر بخش در یک پایگاه داده برداری جاسازی و ذخیره شد و امکان جستجوی کارآمد را فراهم کرد.

با این حال، این تنظیم محدودیت هایی داشت. رویکرد انشعاب اولیه اغلب منجر به بازیابی اطلاعات نامربوط می شد و پاسخ های تولید شده فاقد دقت و همسویی با هدف هر پرس و جو بود.

چالش‌ها در پاسخگویی به پرسش RAG در مقیاس بزرگ

  • رسیدگی به پرس و جوهای پیچیده: برخی از سؤالات پیچیده نیاز به درک معنایی عمیق تری فراتر از جستجوی معنایی اساسی دارند.
  • عدم تطابق متنی: تکه های بازیابی شده اغلب از نظر زمینه مشابه بودند اما به اندازه کافی دقیق نبودند تا نیازهای پرس و جو را برآورده کنند.
  • محدودیت‌های دقت بازیابی: بازیابی مجموعه کوچکی از اسناد (مثلاً پنج تا ده) اغلب منجر به نتایج محدودی می‌شود که فاقد ارتباط هستند.

این چالش‌ها بر نیاز به یک رویکرد پیشرفته‌تر برای بهبود دقت در پاسخ‌گویی به پرس و جو RAG تأکید کرد.

تکنیک های پیشرفته RAG برای دقت جستجوی پیشرفته (راه حل)
برای پرداختن به این مسائل، چندین روش پیشرفته را به کار بردم و به طور مکرر سیستم را اصلاح کردم:
قطعه بندی معنایی
بر خلاف تقسیم بندی سنتی، Semantic Chunking معنا را در هر بخش اولویت بندی می کند، و ارتباط را با تراز کردن اطلاعات بازیابی شده با هدف پرس و جو افزایش می دهد.

توضیحات تصویر

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)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حداکثر بازیابی حاشیه
این روش با تمایز بین داده‌های مرتبط و نامربوط، دقت بازیابی را بهبود بخشید، و اطمینان حاصل کرد که تنها تکه‌های داده با بهترین تطابق بازیابی می‌شوند.

امتیاز لامبدا
با استفاده از امتیازدهی لامبدا، می‌توانم نتایج را بر اساس ارتباط رتبه‌بندی کنم، و پاسخ‌هایی را که با هدف پرس و جو هماهنگ‌تر هستند برای کیفیت بهتر پاسخ، اولویت‌بندی کنم.

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)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Multi-Query و RAG Fusion
برای سؤالات پیچیده، سیستم چندین سؤال فرعی ایجاد می کند. سپس RAG Fusion پاسخ‌های متنوع را در یک پاسخ منسجم و منسجم ادغام می‌کند و کیفیت پاسخ را بهبود می‌بخشد و خطا را کاهش می‌دهد.

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
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیحات تصویر

نمایه سازی پیشرفته و جستجوی برداری بهینه شده
بهبود مکانیسم نمایه‌سازی و اصلاح پارامترهای جستجوی برداری، بازیابی را سریع‌تر و دقیق‌تر کرد، به‌ویژه برای مجموعه‌های داده بزرگ.

نتایج: دستاوردهای کلیدی در پاسخ به پرسش RAG
اجرای این تکنیک ها به پیشرفت های قابل توجهی منجر شد:

  • افزایش دقت بازیابی: تکنیک‌هایی مانند Semantic Chunking و Maximum Margin Retrieval بازیابی داده‌ها را اصلاح کردند و تضمین می‌کنند که فقط مرتبط‌ترین تکه‌ها برگردانده می‌شوند.
  • ارتباط افزایش یافته: امتیاز لامبدا به طور موثر نتایج مربوطه را اولویت بندی می کند، و پاسخ ها را با هدف پرس و جو هماهنگ می کند.
  • مدیریت بهبود یافته پرس و جوهای پیچیده: تولید چند پرس و جو و RAG Fusion سیستم را قادر می سازد تا سوالات پیچیده را مدیریت کند و پاسخ های جامعی ارائه دهد.
  • استحکام بیشتر سیستم: این اصلاحات سیستم را از یک مدل پایه به یک ابزار پیچیده و قابل اعتماد پاسخگوی پرس و جو برای داده های جلسات بدون ساختار و مقیاس بزرگ ارتقا داد.

نکات کلیدی و درس های آموخته شده
از طریق این سفر، چندین بینش اصلی را شناسایی کردم:

  1. سازگاری کلید است: راه حل های موثر به ندرت در اولین تلاش ظاهر می شوند. بهبود مکرر و انعطاف پذیری ضروری است.
  2. روش‌های لایه‌ای استحکام را بهبود می‌بخشند: یکپارچه‌سازی چندین رویکرد – تقسیم معنایی، بازیابی حداکثر حاشیه، امتیازدهی لامبدا – سیستم قوی‌تر و مؤثرتری ایجاد کرد.
  3. مدیریت کامل پرس و جو: تولید چند پرس و جو و RAG Fusion اهمیت پرداختن به سوالات از منظرهای متعدد را برجسته می کند.
  4. تمرکز بر معناشناسی: تأکید بر معنا در داده ها به جای ساختار به تنهایی، دقت بازیابی را به طور قابل توجهی بهبود بخشید.

نتیجه گیری: چشم انداز آینده برای سیستم های مبتنی بر RAG
بهبود مدل‌های RAG با تکنیک‌های پیشرفته، یک سیستم بازیابی ساده را به ابزاری قدرتمند برای پاسخ‌گویی به پرسش‌های پیچیده و ظریف تبدیل کرد. با نگاهی به آینده، هدف من این است که قابلیت‌های یادگیری بلادرنگ را ترکیب کنم، که به سیستم اجازه می‌دهد به صورت پویا با داده‌های جدید سازگار شود. این تجربه مهارت های فنی من را عمیق تر کرد و اهمیت انعطاف پذیری، تمرکز معنایی و بهبود مکرر در سیستم های بازیابی داده ها را برجسته کرد.

افکار نهایی: راهنمای پیاده سازی سیستم های پیشرفته RAG
با به اشتراک گذاشتن تجربه خود در غلبه بر چالش های RAG، امیدوارم بتوانم راهنمای پیاده سازی راه حل های مشابه را ارائه دهم. تکنیک‌های استراتژیک، همراه با پالایش تکراری، نه تنها مشکلات فوری را حل می‌کنند، بلکه پایه‌ای قوی برای پیشرفت‌های آینده در سیستم‌های پاسخ‌گوی پرس و جو ایجاد می‌کنند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا