<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Operations on GENIE.AI</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/</link><description>Recent content in Operations on GENIE.AI</description><generator>Hugo</generator><language>en</language><atom:link href="https://genie-ai-7e342b.opensource.unicc.org/docs/operations/index.xml" rel="self" type="application/rss+xml"/><item><title>Backup &amp; Restore</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/backup-restore/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/backup-restore/</guid><description>&lt;p&gt;The two things you must be able to restore after a failure are &lt;strong&gt;the knowledge
base&lt;/strong&gt; (ArangoDB — chunks, embeddings, graph, labels) and &lt;strong&gt;the gateway
configuration&lt;/strong&gt; (Kong routes and plugins). GENIE.AI ships scripts for both.&lt;/p&gt;
&lt;h2 id="arangodb-backup"&gt;ArangoDB backup&lt;/h2&gt;
&lt;p&gt;The backup script (&lt;code&gt;components/arangodb/dump.sh&lt;/code&gt;) dumps every database using
&lt;code&gt;arangodump&lt;/code&gt; inside the &lt;code&gt;arangodb/arangodb:3.12&lt;/code&gt; container, into a timestamped
directory:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/root/arango_backups/&amp;lt;YYYYMMDDHHMMSS&amp;gt;/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It requires the &lt;code&gt;arango-vector-db&lt;/code&gt; container running on the &lt;code&gt;chatqna_default&lt;/code&gt;
network. Run it from a Swarm node that can reach the database container.&lt;/p&gt;</description></item><item><title>Updates</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/updates/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/updates/</guid><description>&lt;p&gt;GENIE.AI has three kinds of update, with different blast radii. The critical
thing to know is &lt;strong&gt;which updates force a knowledge-base re-ingestion&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="the-re-ingestion-rule"&gt;The re-ingestion rule&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Change&lt;/th&gt;
 &lt;th&gt;Re-ingest required?&lt;/th&gt;
 &lt;th&gt;Why&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;LLM&lt;/strong&gt; (&lt;code&gt;VLLM_LLM_MODEL_ID&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The LLM reads chunks at query time; it does not change stored data. Restart vLLM.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Reranker&lt;/strong&gt; (&lt;code&gt;RERANKER_MODEL_ID&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Reranking is a query-time re-score. Restart the reranker / TEI.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Translation&lt;/strong&gt; (&lt;code&gt;VLLM_TRANSLATION_MODEL_ID&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Translation is query-time. Restart the translation service.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Embedding model&lt;/strong&gt; (&lt;code&gt;EMBEDDING_MODEL_ID&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Existing chunk vectors are in the old model&amp;rsquo;s space. Re-ingest everything.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Labelling taxonomy&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Recommended&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Labels are stored on chunks at ingest time; a changed taxonomy needs re-labelling.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Chunking / dataprep logic&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Chunk boundaries and content change.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Changing the embedding model is the expensive update.&lt;/strong&gt; Plan a full re-ingest
(see &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/knowledge-base/"&gt;Knowledge base&lt;/a&gt;) when you change
&lt;code&gt;EMBEDDING_MODEL_ID&lt;/code&gt;. Everything else is a service restart.&lt;/p&gt;</description></item><item><title>Scaling</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/scaling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/scaling/</guid><description>&lt;p&gt;GENIE.AI runs on Docker Swarm, so horizontal scaling is a &lt;code&gt;docker service scale&lt;/code&gt;
command. Vertical scaling — especially GPU memory — is a configuration change per
service. The two are independent and solve different problems.&lt;/p&gt;
&lt;h2 id="horizontal-scaling-replicas"&gt;Horizontal scaling (replicas)&lt;/h2&gt;
&lt;p&gt;Scale a stateless service to more replicas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker service scale genieai_&amp;lt;service&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;replicas&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Services that scale well (stateless, query-time):&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Service&lt;/th&gt;
 &lt;th&gt;Scales?&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Backend (BFF)&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;Stateless behind Kong.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ChatQnA&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;Stateless orchestrator.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Retriever&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;Stateless; shares the same ArangoDB.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Reranker / TEI&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;Stateless.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;vLLM&lt;/td&gt;
 &lt;td&gt;With care&lt;/td&gt;
 &lt;td&gt;Each replica needs its own GPU memory budget; see below.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Dataprep&lt;/td&gt;
 &lt;td&gt;Yes (ingest)&lt;/td&gt;
 &lt;td&gt;More replicas = more parallel ingestion throughput.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ArangoDB&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;No (single-node)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The bundled ArangoDB is single-node; do not scale it. Add resources, not replicas.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ArangoDB is the bottleneck you cannot replica your way out of.&lt;/strong&gt; The
single-node database handles the whole retrieval load. If retrieval latency
climbs under load, first check the database&amp;rsquo;s resources and query performance
(see the &lt;em&gt;VictoriaMetrics&lt;/em&gt; dashboard), not the retriever count.&lt;/p&gt;</description></item><item><title>Troubleshooting</title><link>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://genie-ai-7e342b.opensource.unicc.org/docs/operations/troubleshooting/</guid><description>&lt;p&gt;This page lists the problems operators hit most often, the first place to look,
and where the deeper notes live. For install-time problems, see the
troubleshooting sections of the &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/deployment/"&gt;deployment guides&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="general-principle-trace-then-logs-then-code"&gt;General principle: trace, then logs, then code&lt;/h2&gt;
&lt;p&gt;For any &amp;ldquo;why did this answer come out wrong / slow / empty&amp;rdquo; question, the fastest
path is the &lt;strong&gt;trace&lt;/strong&gt;, not the logs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find the query&amp;rsquo;s trace in the &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/observability/dashboards/"&gt;Trace explorer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Walk the RAG stage spans to see which stage is slow or returns nothing.&lt;/li&gt;
&lt;li&gt;Pivot to the &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/observability/dashboards/"&gt;service logs&lt;/a&gt;
for that stage&amp;rsquo;s error detail.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;See &lt;a href="https://genie-ai-7e342b.opensource.unicc.org/docs/observability/"&gt;Observability&lt;/a&gt; for how.&lt;/p&gt;</description></item></channel></rss>