«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Освоение ответов на запросы с помощью RAG: преодоление ключевых проблем при обработке крупномасштабных данных совещаний

Освоение ответов на запросы с помощью RAG: преодоление ключевых проблем при обработке крупномасштабных данных совещаний

Опубликовано 14 января 2025 г.
Просматривать:193

В эпоху цифровой перегрузки информацией извлечение действенной информации из больших наборов данных становится более важным, чем когда-либо. Недавно я отправился в путешествие по использованию технологии дополненной генерации данных (RAG) для решения серьезной задачи — предоставления точных ответов на основе обширной коллекции заметок со встреч. В этом блоге рассматриваются препятствия, решения и достижения, которые превратили мою систему запросов и ответов на основе RAG в надежный инструмент для извлечения информации из неструктурированных данных встреч.

Постановка задачи: проблемы при ответе на запросы с помощью RAG
Одной из основных задач было создание системы, способной обрабатывать сложные запросы, специфичные для конкретных целей, в огромном хранилище протоколов совещаний. Традиционные модели RAG-запрос-ответ часто возвращали нерелевантную или неполную информацию и не могли уловить намерения пользователя. Неструктурированный характер данных встреч в сочетании с различными типами запросов потребовал более совершенного решения.

Первоначальный подход: закладываем основу для эффективного ответа на запросы
Я начал с базовой модели RAG, предназначенной для объединения поиска и генерации ответов. Были использованы два первоначальных метода:

  1. Разбивка на части: разбиение больших документов на более мелкие сегменты по границам предложений улучшило поиск за счет сужения области поиска.

  2. Встраивание и хранение векторов: после разделения на фрагменты каждый сегмент был встроен и сохранен в базе данных векторов, что обеспечивает эффективный поиск.

Однако эта настройка имела ограничения. Первоначальный подход к фрагментированию часто приводил к получению нерелевантной информации, а сгенерированным ответам не хватало точности и соответствия цели каждого запроса.

Проблемы при ответе на крупномасштабные запросы RAG

  • Обработка сложных запросов: некоторые сложные вопросы требовали более глубокого семантического понимания, выходящего за рамки базового семантического поиска.
  • Контекстуальные несоответствия: полученные фрагменты часто были контекстуально похожи, но недостаточно точны, чтобы удовлетворить требования запроса.
  • Ограничения на точность поиска: извлечение небольшого набора документов (например, от пяти до десяти) часто приводило к ограниченным результатам, которые не имели релевантности.

Эти проблемы подчеркнули необходимость в более продвинутом подходе для повышения точности ответов на запросы RAG.

Расширенные методы RAG для повышения точности запросов (решение)
Для решения этих проблем я применил несколько передовых методологий, итеративно совершенствуя систему:
Семантическое разделение
В отличие от традиционного разбиения на части, семантическое разбиение на части отдает приоритет смыслу внутри каждого сегмента, повышая релевантность за счет согласования полученной информации с целью запроса.

Mastering Query Answering with RAG: Overcoming Key Challenges in Large-Scale Meeting Data

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)

Мультизапрос и объединение RAG
Для сложных вопросов система генерирует несколько подзапросов. Затем 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

Mastering Query Answering with RAG: Overcoming Key Challenges in Large-Scale Meeting Data

Расширенное индексирование и оптимизированный векторный поиск
Улучшение механизма индексации и уточнение параметров векторного поиска сделали поиск более быстрым и точным, особенно для больших наборов данных.

Результаты: ключевые достижения в области ответов на запросы RAG
Внедрение этих методов привело к значительным улучшениям:

  • Повышенная точность извлечения: такие методы, как семантическое разбиение на части и извлечение с максимальной маржой, усовершенствовали извлечение данных, гарантируя возврат только наиболее релевантных фрагментов.
  • Повышенная релевантность: лямбда-оценка эффективно расставляет приоритеты для соответствующих результатов, точно согласовывая ответы с намерением запроса.
  • Улучшенная обработка сложных запросов: генерация нескольких запросов и RAG Fusion позволили системе управлять сложными вопросами, предоставляя исчерпывающие ответы.
  • Большая надежность системы: эти усовершенствования превратили систему из базовой модели в сложный и надежный инструмент для ответов на запросы для крупномасштабных неструктурированных данных совещаний.

Основные выводы и извлеченные уроки
В ходе этого путешествия я выявил несколько основных идей:

  1. Главное значение имеет адаптивность: эффективные решения редко появляются с первой попытки; итеративное улучшение и гибкость имеют важное значение.
  2. Многоуровневые методологии повышают надежность: интеграция нескольких подходов — семантического разделения, извлечения максимальной прибыли, лямбда-оценки — позволила создать более надежную и эффективную систему.
  3. Тщательная обработка запросов: генерация нескольких запросов и RAG Fusion подчеркнули важность решения вопросов с разных точек зрения.
  4. Сосредоточение внимания на семантике: акцент на значении данных, а не только на структуре, значительно повысил точность поиска.

Заключение: будущие перспективы систем на основе RAG
Улучшение моделей RAG с помощью передовых технологий превратило простую систему поиска в мощный инструмент для ответа на сложные, детализированные запросы. Заглядывая в будущее, я стремлюсь реализовать возможности обучения в режиме реального времени, позволяющие системе динамически адаптироваться к новым данным. Этот опыт углубил мои технические навыки и подчеркнул важность гибкости, семантической направленности и итеративного улучшения систем поиска данных.

Заключительные мысли: руководство по внедрению передовых систем RAG
Делясь своим опытом решения проблем RAG, я надеюсь предложить руководство по реализации подобных решений. Стратегические методы в сочетании с итеративным уточнением не только решили насущные проблемы, но и заложили прочную основу для будущих достижений в системах запросов и ответов.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/cognilium_ai/mastering-query-answering-with-rag-overcoming-key-challenges-in-large-scale-meeting-data-33ji?1 При наличии каких-либо нарушений , пожалуйста, свяжитесь с Study_golang @163.comdelete
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3