Na era digital de sobrecarga de informações, extrair insights acionáveis de grandes conjuntos de dados é mais crucial do que nunca. Recentemente, embarquei em uma jornada para aproveitar a Geração Aumentada de Recuperação (RAG) para enfrentar um grande desafio: fornecer respostas precisas a partir de uma vasta coleção de notas de reuniões. Este blog explora os obstáculos, soluções e conquistas que transformaram meu sistema de resposta a consultas baseado em RAG em uma ferramenta robusta para extrair insights de dados de reuniões não estruturados.
Declaração do problema: Desafios no atendimento de consultas com RAG
Um dos principais desafios foi construir um sistema capaz de processar consultas complexas e específicas em um enorme repositório de notas de reuniões. Os modelos tradicionais de resposta a consultas RAG frequentemente retornavam informações irrelevantes ou incompletas, falhando em capturar a intenção do usuário. A natureza não estruturada dos dados da reunião, combinada com diversos tipos de consulta, exigiu uma solução mais refinada.
Abordagem inicial: estabelecendo as bases para respostas eficazes a consultas
Comecei com um modelo RAG básico projetado para combinar recuperação e geração de resposta. Duas técnicas iniciais utilizadas foram:
Chunking: dividir documentos grandes em segmentos menores por limites de frase melhorou a recuperação ao restringir o escopo da pesquisa.
Incorporação e armazenamento vetorial: Após o chunking, cada segmento foi incorporado e armazenado em um banco de dados vetorial, permitindo pesquisas eficientes.
No entanto, essa configuração tinha limitações. A abordagem inicial de agrupamento muitas vezes levava à recuperação de informações irrelevantes e as respostas geradas careciam de precisão e alinhamento com a intenção de cada consulta.
Desafios no atendimento de consultas RAG em grande escala
Esses desafios ressaltaram a necessidade de uma abordagem mais avançada para melhorar a precisão no atendimento de consultas RAG.
Técnicas avançadas de RAG para maior precisão de consulta (solução)
Para resolver esses problemas, apliquei diversas metodologias avançadas, refinando o sistema de forma iterativa:
Semantic Chunking
Ao contrário do chunking tradicional, o Chunking Semântico prioriza o significado dentro de cada segmento, aumentando a relevância ao alinhar as informações recuperadas com a intenção da consulta.
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)
Recuperação de margem máxima
Este método melhorou a precisão da recuperação ao diferenciar entre dados relevantes e irrelevantes, garantindo que apenas os blocos de dados com melhor correspondência fossem recuperados.
Pontuação Lambda
Usando a pontuação Lambda, pude classificar os resultados com base na relevância, priorizando respostas que se alinhassem mais estreitamente com a intenção da consulta para obter melhor qualidade de resposta.
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)
Multiconsulta e RAG Fusion
Para questões complexas, o sistema gera múltiplas subconsultas. O RAG Fusion então integra diversas respostas em uma resposta única e coesa, melhorando a qualidade da resposta e reduzindo erros.
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
Indexação aprimorada e pesquisa vetorial otimizada
Melhorar o mecanismo de indexação e refinar os parâmetros de pesquisa vetorial tornou a recuperação mais rápida e precisa, especialmente para grandes conjuntos de dados.
Resultados: Principais conquistas no atendimento de consultas RAG
A implementação dessas técnicas levou a melhorias significativas:
Principais conclusões e lições aprendidas
Ao longo desta jornada, identifiquei vários insights importantes:
Conclusão: Perspectivas Futuras para Sistemas Baseados em RAG
O aprimoramento dos modelos RAG com técnicas avançadas transformou um sistema de recuperação simples em uma ferramenta poderosa para responder a consultas complexas e diferenciadas. Olhando para o futuro, pretendo incorporar capacidades de aprendizagem em tempo real, permitindo que o sistema se adapte dinamicamente a novos dados. Esta experiência aprofundou minhas habilidades técnicas e destacou a importância da flexibilidade, foco semântico e melhoria iterativa em sistemas de recuperação de dados.
Considerações finais: um guia para implementação de sistemas RAG avançados
Ao partilhar a minha experiência na superação dos desafios do RAG, espero oferecer um guia para a implementação de soluções semelhantes. Técnicas estratégicas, combinadas com refinamento iterativo, não apenas resolveram problemas imediatos, mas também estabeleceram uma base sólida para avanços futuros em sistemas de resposta a consultas.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3