El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. de la serie DocSummarizer, y es también el punto culminante del El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.. Nosotros'combinamos todo en una aplicación web deployable .
🚨🚨 ARTÍCULO DE PREVIEW 🚨🚨 Estando trabajando en algunos kinks y agregando característicasM SK2 Pero el núcleo está hecho y funciona bien. Espera las actualizaciones durante las próximas semanasMSC4 Será en lucidRAGMST5comMst6 YoM st7Añadré screenshots aquí una vez que termine de diseñarMSt8
El objetivo de construir una infraestructura RAG es utilizarla para algo real.
En las últimas semanas, hemos construido:,, ' y :
Ahora los conectamos a través de El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. - una aplicación web independiente para responder a preguntas de varios documentos con visualización de gráficos de conocimiento.
El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. | El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole. GitHub
Upload Documents. Pregunta. Obtenga respuestas con citaciones y un gráfico de conocimientos que muestra cómo se conectan los conceptos .
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
En ningún momento se utilizan LLMs para agrupar, insertar, extracción de entidadesM SK2 o almacenar - sólo para sintetizar las respuestas sobre las extraídasMska4 citaciónM Ska5 pruebas respaldadasMSKA6
La búsqueda por vector solo se descubre para determinados tipos de consulta:
| Tipo de consulta | Problema de búsqueda por vector PSK2 Solución de grafía VSK3 |------------|----------------------|----------------| El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos desglosados por sexo, edad y origen étnico. El Grupo de Trabajo tal vez desee tomar nota del informe del Secretario General sobre la aplicación de las recomendaciones contenidas en el párrafo 6 supra. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
lucidRAG utiliza ambos vectores: para la precisiónM SK1 gráficos para el contexto. Las consultas de gráficos son de profundidadMSC3limitada MST4max MST5 hopsM ST6 y esbozada a los documentos extraídos para evitar una transbordación sin límites en grandes corporaMst7
La aplicación layers tres proyectos que ya hemos construido', orchestrado a través de El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.
lucidRAG
├── Controllers/Api/ # REST endpoints
├── Services/ # Business logic
│ ├── DocumentProcessingService # Wraps DocSummarizer
│ ├── EntityGraphService # Wraps GraphRAG
│ └── Background/ # Async queue processing (StyloFlow waves)
└── Views/ # HTMX + Alpine.js UI
Por qué StyloFlow? En lugar de pipelines codificados, cada etapa de procesamiento es una M SK1vese" que emite señalesMSC3 Las ondas se ejecutan cuando sus condiciones de desencadeo coinciden con las mismas , posibilitando la ejecución paralela |( |Inserción | + |Extracción de entidades | МSK7 |Divisionalización condicional | ( |Escalar sólo cuando sea necesario |), | y gestión automatizada de concurrencia | StyloFlow:Signal-Orquestración del flujo de trabajo controlado El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
Cuando cargas un documento, va a pasar por tres etapas:
El punto final de descarga valida el archivo, compute un hash de contenido para deduplicación, y lo cola para procesamiento de fondoM SK2
public async Task<Guid> QueueDocumentAsync(Stream fileStream, string fileName)
{
// Compute hash to detect duplicates
var contentHash = ComputeHash(fileStream);
var existing = await _db.Documents
.FirstOrDefaultAsync(d => d.ContentHash == contentHash);
if (existing != null)
return existing.Id; // Already processed
El punto de vista clave: hachémos primero, guardaremos más tardeM SK2 Esto evita perder el tiempo de procesamiento en las descargas duplicadas .
// Save to disk, create DB record
var docId = Guid.NewGuid();
await SaveFileToDiskAsync(fileStream, docId, fileName);
// Queue for background processing
await _queue.EnqueueAsync(new DocumentProcessingJob(docId, filePath));
return docId;
}
El procesador de fondo recoge documentos en fila y los ejecuta a través del DocSummarizer:
var result = await _summarizer.SummarizeFileAsync(job.FilePath, progressChannel);
Esta línea única hace mucho trabajo (ver Por lo tanto, el Grupo de Trabajo tal vez desee considerar la posibilidad de incluir en su programa provisional un tema titulado “Informe del Comité Especial encargado de investigar las prácticas israelíes que afecten a los derechos humanos del pueblo palestino y otros habitantes árabes ocupados”.):
Después de chunking, extraemos entidades utilizando el enfoque heurístico GraphRAG'
var segments = await _vectorStore.GetDocumentSegmentsAsync(documentId);
var entityResult = await _entityGraph.ExtractAndStoreEntitiesAsync(documentId, segments);
Esto utiliza la puntuación IDF y señales estructurales en lugar de per-chunk LLM llamadas - ver El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole.
Una implementación naiva usaría colas indefinidas, riesgos de salida-deM SK2escaños de memoria durante inundaciones de uploadMSC3 Usamos canales delimitados con limitaciones explícitas de capacidad :
private readonly Channel<DocumentProcessingJob> _queue =
Channel.CreateBounded<DocumentProcessingJob>(new BoundedChannelOptions(100)
{
FullMode = BoundedChannelFullMode.Wait
});
Cuando la fila se llena, Wait mode bloquea nuevos escritos hasta que se abra el espacio. Añademos un desvío de tiempo para que los usuarios obtengan un error claro en lugar de quedarse pechados:
using var timeoutCts = CancellationTokenSource.CreateLinkedTokenSource(ct);
timeoutCts.CancelAfter(TimeSpan.FromMinutes(5));
try {
await _queue.Writer.WriteAsync(job, timeoutCts.Token);
} catch (OperationCanceledException) when (!ct.IsCancellationRequested) {
throw new InvalidOperationException("Queue full. Try again later.");
}
Los documentos grandes pueden necesitar minutos para procesar. Pero un documento bloqueado no debe bloquear toda la filaM SK2 Cada documento tiene su propio tiempo de salida:
while (!stoppingToken.IsCancellationRequested)
{
var job = await _queue.DequeueAsync(stoppingToken);
// 30-minute timeout per document
using var timeoutCts = CancellationTokenSource.CreateLinkedTokenSource(stoppingToken);
timeoutCts.CancelAfter(TimeSpan.FromMinutes(30));
try {
await ProcessDocumentAsync(job, timeoutCts.Token);
} catch (OperationCanceledException) when (!stoppingToken.IsCancellationRequested) {
await MarkDocumentFailedAsync(job.DocumentId, "Processing timed out");
}
}
El símbolo vinculado garantiza que siga respetando el cierre de la aplicación al añadir el límite per-document.
Cada documento de procesamiento recibe un canal de progreso para las actualizaciones SSE. Pero si un usuario cerrará su navegador a mediados de la horaM SK1upload, ese canal se convierte en orfanato . Seguimos los tiempos de creación y limpiamos periódicamenteMSC4
private readonly ConcurrentDictionary<Guid, ProgressChannelEntry> _progressChannels = new();
public int CleanupAbandonedChannels()
{
var cutoff = DateTimeOffset.UtcNow - TimeSpan.FromHours(1);
var cleaned = 0;
foreach (var kvp in _progressChannels.Where(x => x.Value.CreatedAt < cutoff))
{
if (_progressChannels.TryRemove(kvp.Key, out var entry))
{
entry.Channel.Writer.TryComplete();
cleaned++;
}
}
return cleaned;
}
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. PeriodicTimer llama esto cada 15 minutos en el procesador de fondo
Utilizamos dos bases de datos para diferentes fines:
El Grupo de Trabajo tal vez desee tomar nota del informe del Secretario General sobre la aplicación de las recomendaciones contenidas en el párrafo 6 supra. archiva metadatos del documento - lo que existe, estado de procesamientoM SK2 relacionesMSC3 Este dato es duradero y consultable .
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. stores vectors and the entity graph. It 's ephemeral - you can rebuild it from source documentsM SK3 Esta separación significa que la corrupción de almacenamiento de vectores noMSC4t los perde su inventario de documentosMNK5
// Metadata in PostgreSQL
public class DocumentEntity
{
public Guid Id { get; set; }
public string Name { get; set; }
public string ContentHash { get; set; }
public DocumentStatus Status { get; set; }
}
// Vectors in DuckDB (managed by DocSummarizer)
// Entities in DuckDB (managed by GraphRAG)
Las preguntas fluyen a través de la red de búsqueda agentica:
[HttpPost]
public async Task<IActionResult> ChatAsync([FromBody] ChatRequest request)
{
// 1. Get or create conversation for memory
var conversation = await GetOrCreateConversationAsync(request.ConversationId);
// 2. Search with hybrid retrieval
var searchResult = await _search.SearchAsync(request.Query, new SearchOptions
{
TopK = 10,
IncludeGraphData = request.IncludeGraphData
});
El servicio de búsqueda maneja la descomposición de la consulta si es necesario, luego sintetiza una respuesta:
// 3. Generate answer with LLM
var answer = await _summarizer.SummarizeAsync(
request.Query,
searchResult.Segments,
new SummarizeOptions { IncludeCitations = true });
// 4. Save to conversation history
await SaveToConversationAsync(conversation.Id, request.Query, answer);
return Ok(new ChatResponse
{
Answer = answer.Text,
Sources = answer.Citations,
GraphData = searchResult.GraphData
});
}
La UI es una sola página con documentos a la izquierda, chat a la derecha:
┌──────────────────┬─────────────────────────────────────┐
│ 📁 Documents │ 💬 Chat │
│ ───────────── │ [Answer] [Evidence] [Graph] │
│ [+ Upload] │ │
│ 📄 api-docs.pdf │ Q: How does auth work? │
│ 📝 readme.md │ A: JWT tokens stored... [1][2] │
│ ───────────── │ │
│ 🕸️ Graph: 168 │ ┌─────────────────────────────┐ │
│ │ │ Ask about your documents... │ │
└──────────────────┴──┴─────────────────────────────┴───┘
Alpine.js gestiona el estadoM SK1 HTMX maneja las actualizaciones de la lista de documentos:
function ragApp() {
return {
messages: [],
isTyping: false,
async sendMessage() {
const query = this.currentMessage.trim();
this.messages.push({ role: 'user', content: query });
this.isTyping = true;
const result = await fetch('/api/chat', {
method: 'POST',
body: JSON.stringify({ query })
}).then(r => r.json());
this.messages.push({
role: 'assistant',
content: result.answer,
sources: result.sources
});
this.isTyping = false;
}
};
}
Para despliegues públicos como lucidrag.com, modo de demostración desactiva las descargas y utiliza pre--contento cargadoM SK3 el modo de prueba existe para hacer que los despliegamientos públicos sean seguros , deterministaMST5 y barato sin ningún tipo especialMSC6 rutas de código caseMst7
public class DemoModeConfig
{
public bool Enabled { get; set; } = false;
public string ContentPath { get; set; } = "./demo-content";
public string BannerMessage { get; set; } = "Demo Mode: Pre-loaded RAG articles";
}
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. DemoContentSeeder el servicio de fondo observa el directorio del contenido y procesa cualquier archivo que se haya descargado:
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
if (!_config.DemoMode.Enabled) return;
await SeedExistingContentAsync();
StartFileWatcher(_config.DemoMode.ContentPath);
}
Esto le permite actualizar el contenido de demostración copiando sencillamente los archivos - no es necesario reiniciar
dotnet run --project Mostlylucid.RagDocuments -- --standalone
Utiliza SQLite + DuckDB locally. Open http://localhost:5080.
services:
lucidrag:
build: .
ports: ["5080:8080"]
depends_on: [postgres, ollama]
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. |-----------|--------|---------| El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. | embeddings ONNX | DocSummarizer ≥| Local, no API claves | El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. | Interfaz Web | Nueva | HTMX + Alpine.js M|
No hay costes API. para indexar - las inserciones son ONNXM SK1 las entidades son heurísticas. usted sólo paga por la síntesis LLM en el momento de la consulta , y esto funciona con Ollama localMSC4
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.