В эпоху цифровой перегрузки информацией извлечение действенной информации из больших наборов данных становится более важным, чем когда-либо. Недавно я отправился в путешествие по использованию технологии дополненной генерации данных (RAG) для решения серьезной задачи — предоставления точных ответов на основе обширной коллекции заметок со встреч. В этом блоге рассматриваются препятствия, решения и достижения, которые превратили мою систему запросов и ответов на основе RAG в надежный инструмент для извлечения информации из неструктурированных данных встреч.
Постановка задачи: проблемы при ответе на запросы с помощью RAG
Одной из основных задач было создание системы, способной обрабатывать сложные запросы, специфичные для конкретных целей, в огромном хранилище протоколов совещаний. Традиционные модели RAG-запрос-ответ часто возвращали нерелевантную или неполную информацию и не могли уловить намерения пользователя. Неструктурированный характер данных встреч в сочетании с различными типами запросов потребовал более совершенного решения.
Первоначальный подход: закладываем основу для эффективного ответа на запросы
Я начал с базовой модели RAG, предназначенной для объединения поиска и генерации ответов. Были использованы два первоначальных метода:
Разбивка на части: разбиение больших документов на более мелкие сегменты по границам предложений улучшило поиск за счет сужения области поиска.
Встраивание и хранение векторов: после разделения на фрагменты каждый сегмент был встроен и сохранен в базе данных векторов, что обеспечивает эффективный поиск.
Однако эта настройка имела ограничения. Первоначальный подход к фрагментированию часто приводил к получению нерелевантной информации, а сгенерированным ответам не хватало точности и соответствия цели каждого запроса.
Проблемы при ответе на крупномасштабные запросы RAG
Эти проблемы подчеркнули необходимость в более продвинутом подходе для повышения точности ответов на запросы RAG.
Расширенные методы RAG для повышения точности запросов (решение)
Для решения этих проблем я применил несколько передовых методологий, итеративно совершенствуя систему:
Семантическое разделение
В отличие от традиционного разбиения на части, семантическое разбиение на части отдает приоритет смыслу внутри каждого сегмента, повышая релевантность за счет согласования полученной информации с целью запроса.
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
Расширенное индексирование и оптимизированный векторный поиск
Улучшение механизма индексации и уточнение параметров векторного поиска сделали поиск более быстрым и точным, особенно для больших наборов данных.
Результаты: ключевые достижения в области ответов на запросы RAG
Внедрение этих методов привело к значительным улучшениям:
Основные выводы и извлеченные уроки
В ходе этого путешествия я выявил несколько основных идей:
Заключение: будущие перспективы систем на основе RAG
Улучшение моделей RAG с помощью передовых технологий превратило простую систему поиска в мощный инструмент для ответа на сложные, детализированные запросы. Заглядывая в будущее, я стремлюсь реализовать возможности обучения в режиме реального времени, позволяющие системе динамически адаптироваться к новым данным. Этот опыт углубил мои технические навыки и подчеркнул важность гибкости, семантической направленности и итеративного улучшения систем поиска данных.
Заключительные мысли: руководство по внедрению передовых систем RAG
Делясь своим опытом решения проблем RAG, я надеюсь предложить руководство по реализации подобных решений. Стратегические методы в сочетании с итеративным уточнением не только решили насущные проблемы, но и заложили прочную основу для будущих достижений в системах запросов и ответов.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3