Arena RAG
RAG Arena es un proyecto Next.js de código abierto creado en mi mendable.ai que interactúa con LangChain para proporcionar una experiencia de chatbot RAG donde las consultas reciben múltiples respuestas. Los usuarios votan estas respuestas, que luego se desenfocan para revelar el Retriever utilizado, diferenciando los chatbots por sus métodos RAG de datos. El proyecto utiliza Supabase para las operaciones de la base de datos y presenta una tabla de clasificación en tiempo real que muestra datos de la base de datos.
Instalación
Asegúrese de tener pnpm
instalado en su sistema. Si no, instálalo a través de:
Clona el repositorio del proyecto:
git clone https://github.com/mendableai/rag-arena
Navegue al directorio del proyecto e instale las dependencias:
Configure sus variables de entorno:
# probably in: https://platform.openai.com/api-keys
OPENAI_API_KEY=
# probably in: https://supabase.com/dashboard/ project>project settings>api
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_PRIVATE_KEY=
# probably in: https://console.upstash.com/redis/
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=
PRODUCTION=false
PYTHON_MICRO_SERVER=
Inicie el servidor web de desarrollo (nextjs):
Ejecutando el servidor Python
*(si no tienes poesía, simplemente agrega una identificación usando pip install poesía)
Activando la tienda de gráficos Neo4j
Para el recuperador Graph Rag, necesitará tener creado el almacén de gráficos o dejar que el servidor ejecute automáticamente la función 'create_neo4j_graph_store' (localizada en /python_service/retrievers/neo4j_retriever.py
) descomentando las líneas:
# if not os.path.exists(storage_dir) or not os.listdir(storage_dir):
# create_neo4j_graph_store()
Esto llevará un tiempo dependiendo de los datos utilizados en data/chunks
. Al final, tendrá su directorio neo/storage
lleno con datos persistentes para el almacén de gráficos localmente.
Cargando índice por primera vez.
Necesitará que el índice esté cargado y almacenado en caché para poder utilizar Graph RAG. La función load_index()
lo hace por usted dentro de python_service/app.py
. Entonces, en su primera ejecución, puede tomar un tiempo crear el archivo .pkl en caché ubicado en python_service/index/cache
.
Ejecute el servidor flask localmente con modo de depuración
poetry run flask run --debug
Abra http://localhost:3000 con su navegador para ver el resultado.
Descripción general de la arquitectura
Sistema de ingestión
- Ruta:
app/api/ingest/route.ts
- Descripción: este módulo es responsable de incorporar artículos a una base de datos vectorial, haciéndolos recuperables para consultas futuras.
- Detalles de implementación:
- Splitter: utiliza
RecursiveCharacterTextSplitter
de LangChain para una división de texto efectiva. - Incrustaciones: aprovecha
OpenAIEmbeddings
para generar incrustaciones de documentos. - Almacenamiento: Emplea
SupabaseVectorStore
para almacenar los documentos procesados en Supabase.
Recuperador dinámico
- Ruta:
app/api/retrievers/dynamic-retriever/route.ts
- Descripción: Selecciona y utiliza dinámicamente diferentes recuperadores según la entrada del usuario para recuperar documentos relevantes.
- Características clave:
- Limitación de velocidad: implementa limitación de velocidad para gestionar la carga y garantizar un uso justo.
- Documento RAG: recupera los documentos que son más relevantes para la consulta del usuario.
- Integración de OpenAI: interactúa con la API de OpenAI para mejorar la finalización del chat, impulsada por SupabaseVectorStore para la comparación de documentos.
Sistema de votación
- Ruta:
actions/voting-system.ts
- Propósito: Supervisa la lógica detrás de la votación de las respuestas recuperadas, lo cual es crucial para el aprendizaje y adaptación del sistema.
- Funcionalidades:
- Seguimiento de votos: actualiza la cantidad de votos, las veces que se prueban y las calificaciones Elo de cada perro perdiguero.
- Ajuste Elo: ajusta las calificaciones Elo según el número promedio de veces que se han evaluado los perros perdigueros, promoviendo la equidad y la precisión.
// calculation used for the elo
function calculateEloAdjustment(timesTested: number, averageTimesTested: number): number {
if (averageTimesTested === 0) return 10;
const adjustmentFactor = timesTested / averageTimesTested;
return (1 / adjustmentFactor) * 10;
}
Esquema de base de datos
- Nombre de la tabla: Tabla de clasificación
- Contenido: contiene datos cruciales para cada recuperador, incluidos
id
, retriever
, elo
, votes
, times_tested
, full_name
, description
y link
.
Descripción general de las funciones RAG
(https://js.langchain.com/docs/modules/data_connection/retrievers/)
Esta sección describe las diversas funciones de RAG definidas en app/api/retrievers/dynamic-retriever/tools/functions.ts
, detallando su propósito e implementación dentro de la arquitectura del proyecto. Estas funciones desempeñan un papel crucial en el proceso RAG de documentos, aprovechando diferentes estrategias y tecnologías para optimizar el rendimiento y la precisión.
Tienda de vectores
- Cuándo utilizarlo: Ideal para principiantes que buscan una solución rápida y sencilla.
- Descripción: esta función aprovecha la simplicidad de crear incrustaciones para cada fragmento de texto, lo que la convierte en el punto de partida más accesible para el documento RAG.
Documento principal
- Cuándo utilizarlo: es mejor para documentos divididos en fragmentos de información más pequeños y distintos que se indexan por separado pero que deben recuperarse en su totalidad.
- Descripción: indexa varios fragmentos por documento, identificando los fragmentos más similares en el espacio de incrustación para recuperar el documento principal completo, en lugar de solo los fragmentos individuales.
Vector múltiple
- Cuándo utilizarlo: adecuado cuando se puede extraer información más relevante para la indexación que el texto mismo del documento.
- Descripción: Crea múltiples vectores para cada documento, y cada vector representa potencialmente resúmenes de texto, preguntas hipotéticas u otras formas de información resumida.
Compresión contextual
- Cuándo utilizarlo: útil cuando los documentos recuperados contienen demasiada información irrelevante, lo que distrae la atención de la respuesta principal a la consulta.
- Descripción: Agrega un paso de posprocesamiento a otro recuperador, extrayendo solo la información más pertinente de los documentos recuperados, lo que se puede lograr mediante incrustaciones o un LLM.
Ponderado en el tiempo
- Cuándo usarlo: Ideal para documentos con marcas de tiempo asociadas, con el objetivo de recuperar los documentos más recientes en función de la similitud semántica y la actualidad.
- Descripción: recupera documentos equilibrando la similitud semántica con las marcas de tiempo de los documentos, lo que garantiza que los documentos recientes tengan prioridad en el proceso RAG.
Recuperador de consultas múltiples
- Cuándo usarlo: Mejor para consultas complejas que requieren múltiples datos distintos para una respuesta integral.
- Descripción: Genera múltiples consultas a partir de una única entrada, abordando la necesidad de información sobre varios temas para responder completamente a la consulta original. Este enfoque recupera documentos para cada consulta generada, lo que garantiza una respuesta exhaustiva.
Contribuyendo
¡Las contribuciones son bienvenidas! Siga el flujo de trabajo estándar de solicitud de bifurcación y extracción. Asegúrese de cumplir con los estilos y patrones de codificación presentes en el proyecto y escriba pruebas para nuevas funciones o correcciones de errores.
Licencia
RAG Arena es de código abierto y se publica bajo la licencia MIT. Consulte el archivo de LICENCIA para obtener más información.