En la era digital de la sobrecarga de información, extraer información útil de grandes conjuntos de datos es más crucial que nunca. Recientemente, me embarqué en un viaje para aprovechar la generación aumentada de recuperación (RAG) para abordar un desafío importante: brindar respuestas precisas a partir de una amplia colección de notas de reuniones. Este blog explora los obstáculos, las soluciones y los logros que convirtieron mi sistema de respuesta a consultas basado en RAG en una herramienta sólida para extraer información a partir de datos no estructurados de reuniones.
Declaración del problema: Desafíos en la respuesta de consultas con RAG
Uno de los principales desafíos fue construir un sistema capaz de procesar consultas complejas y con intenciones específicas dentro de un depósito masivo de notas de reuniones. Los modelos tradicionales de respuesta a consultas de RAG con frecuencia devolvían información irrelevante o incompleta y no lograban capturar la intención del usuario. La naturaleza no estructurada de los datos de las reuniones combinada con diversos tipos de consultas requería una solución más refinada.
Enfoque inicial: sentar las bases para una respuesta eficaz a las consultas
Comencé con un modelo RAG fundamental diseñado para combinar recuperación y generación de respuestas. Dos técnicas iniciales utilizadas fueron:
Fragmentación: dividir documentos grandes en segmentos más pequeños según los límites de las oraciones mejoró la recuperación al reducir el alcance de la búsqueda.
Incrustación y almacenamiento vectorial: después de la fragmentación, cada segmento se incrustó y almacenó en una base de datos vectorial, lo que permitió búsquedas eficientes.
Sin embargo, esta configuración tenía limitaciones. El enfoque de fragmentación inicial a menudo conducía a la recuperación de información irrelevante y las respuestas generadas carecían de precisión y alineación con la intención de cada consulta.
Desafíos en la respuesta de consultas RAG a gran escala
Estos desafíos subrayaron la necesidad de un enfoque más avanzado para mejorar la precisión en la respuesta de consultas RAG.
Técnicas RAG avanzadas para mejorar la precisión de las consultas (solución)
Para abordar estos problemas, apliqué varias metodologías avanzadas, refinando el sistema de forma iterativa:
fragmentación semántica
A diferencia de la fragmentación tradicional, la fragmentación semántica prioriza el significado dentro de cada segmento, mejorando la relevancia al alinear la información recuperada con la intención de la 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)
Recuperación de margen máximo
Este método mejoró la precisión de la recuperación al diferenciar entre datos relevantes e irrelevantes, asegurando que solo se recuperaran los fragmentos de datos que mejor coincidieran.
Puntuación Lambda
Con Lambda Scoring, pude clasificar los resultados según su relevancia, priorizando las respuestas que se alineaban más estrechamente con la intención de la consulta para obtener una mejor calidad de las respuestas.
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 y RAG Fusion
Para preguntas complejas, el sistema genera múltiples subconsultas. Luego, RAG Fusion integra diversas respuestas en una respuesta única y coherente, mejorando la calidad de la respuesta y reduciendo el error.
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
Indización mejorada y búsqueda de vectores optimizada
La mejora del mecanismo de indexación y el perfeccionamiento de los parámetros de búsqueda de vectores hicieron que la recuperación fuera más rápida y precisa, especialmente para conjuntos de datos grandes.
Resultados: logros clave en la respuesta de consultas RAG
La implementación de estas técnicas generó mejoras significativas:
Conclusiones clave y lecciones aprendidas
A lo largo de este viaje, identifiqué varias ideas fundamentales:
Conclusión: Perspectivas futuras para los sistemas basados en RAG
La mejora de los modelos RAG con técnicas avanzadas transformó un sistema de recuperación simple en una herramienta poderosa para responder consultas complejas y matizadas. De cara al futuro, mi objetivo es incorporar capacidades de aprendizaje en tiempo real, permitiendo que el sistema se adapte dinámicamente a nuevos datos. Esta experiencia profundizó mis habilidades técnicas y destacó la importancia de la flexibilidad, el enfoque semántico y la mejora iterativa en los sistemas de recuperación de datos.
Pensamientos finales: una guía para implementar sistemas RAG avanzados
Al compartir mi experiencia en la superación de los desafíos de RAG, espero ofrecer una guía para implementar soluciones similares. Las técnicas estratégicas, combinadas con un refinamiento iterativo, no solo resolvieron problemas inmediatos sino que también sentaron una base sólida para futuros avances en los sistemas de respuesta a consultas.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3