Skip to content

Step-by-step examples

Three recipes, from the most common to the most complete. Each one has an ingestion flow (run once, and again whenever the documents change) and a query flow (the one people use). Component and field names are the ones you see in the editor.

RecipeWhat forYou need
A. Manual assistant with Qdrant and Local RerankAnswering about manuals, policies or product sheets with the best measured quality.A Qdrant server and a language model.
B. Technical assistant with manuals and a graphAn agent that combines documents and linked records.The above and a Neo4j database.
C. FAQ with verificationAn assistant that would rather say “I don’t know” than make things up, with no servers.Only a language model.

A. Manual assistant with Qdrant and Local Rerank

What you get. An agent that answers from your manuals with the combination that worked best in our measurements: contextual chunks and reranking. Vectors and reranking are computed inside NappAI, with no per-use cost.

Ingestion flow

Components: Storage Files, Contextual Text Splitter, a language model (for example DeepSeek), Qdrant and FastEmbed Embeddings (Local).

  1. Upload your manuals to a folder in your storage, for example manuals/.
  2. Add Storage Files with Operation Get File, the file in File or File Path, and Content Text.
  3. Connect its output to Data Inputs of Contextual Text Splitter. Set Chunk Size to 800 and Chunk Overlap to 150, and connect the model to Language Model.
  4. Connect Chunks to Ingest Data of Qdrant, with Operation Add. Fill in URL, Collection Name (for example manuals) and, if your server needs it, API Key.
  5. Connect FastEmbed Embeddings (Local) to Embedding of Qdrant, with the default model.
  6. Run the flow. Repeat with every new manual.

Query flow

Components: Chat Input, Agent, a language model, Qdrant, FastEmbed Embeddings (Local), Local Rerank and Chat Output.

  1. Add Qdrant with the same URL and Collection Name, Operation Retriever and Number of Results 20. Connect the same FastEmbed Embeddings (Local) to Embedding.
  2. Connect its Retriever output to Retriever of Local Rerank. Set Results to Keep to 5.
  3. Connect the Tool output of Local Rerank to Tools of the Agent. In the Tool tab, Tool Name search_manuals and Tool Description “Searches the manuals: errors, repairs, parts, maintenance and warranty”.
  4. Connect the model to Model, Chat Input to Input and Response to Chat Output.
  5. In System Prompt write:
You are the assistant of the company's technicians. For any question about
the machines, use the search_manuals tool.
Answer only with what you find. If it is not there, say so and do not make it up.
Answer clearly and briefly.

Try it. In the playground, ask about an error code or a part reference from your manuals and then about something that is not in them. In the run you can see which chunks Local Rerank returned each time.

If your users search a lot by code, add hybrid search: a BM25 Retriever that reads the same collection and an Ensemble Retriever with both retrievers and Weights 0.5, 0.5, whose Retriever output goes to Local Rerank. See Retrieval techniques.

B. Technical assistant with manuals and a graph

What you get. The flows from the video in What is RAG: an assistant for the technicians of a coffee-machine repair service. A single agent searches all the documentation, searches only one brand’s documents when the question names it, and queries the incident history, stored as a graph in Neo4j.

The knowledge base. 9 PDFs in a folder of your storage: the manual of each machine (Jaltec Brío 2G, Vellani Aurora 2G and 3G, Molinar M64 OD grinder), the warranty and rates, the maintenance guide, three monthly incident reports and the FAQ. The same error code means different things on each brand, which is why every chunk is stored with its brand.

”Knowledge base · ingestion” flow

ComponentKey settingsConnects to
Storage Files (list)Operation List Files on the documents folderThe second Storage Files
Storage Files (read)Operation Get File in Batch Mode, to read the files of the list one by one; Content TextData Inputs of Contextual Text Splitter
Contextual Text SplitterA fast model in Language Model, which adds to each chunk a sentence with its contextData of Metadata Tagger
Metadata TaggerMetadata Schema with the four fields belowIngest Data of Qdrant
QdrantOperation Add–
FastEmbed Embeddings (Local)Default modelEmbedding of Qdrant

How to read the files of a list one by one: Storage Files and Batch Mode.

The fields of the Metadata Tagger schema (named in Spanish, as in the video):

NameTypeWhat it holds
brandstringThe machine’s brand: Jaltec, Vellani or Molinar.
typestringThe document type: manual, warranty, report, FAQ…
monthstringThe month of a report, written as 2026-07.
codesarrayThe error codes that appear in the chunk, such as E07.

When you run it, the Tagged Data output shows every chunk with its text and its tags.

”Technical assistant · the whole RAG” flow

ComponentKey settingsConnects to
QdrantOperation Retriever, the same collectionRetrievers of Ensemble Retriever
BM25 RetrieverReads the chunks of the same collection: the Vector Store output of Qdrant in Parent document vectorstoreRetrievers of Ensemble Retriever
Ensemble RetrieverWeights 0.5, 0.5Retriever of Local Rerank
Local Rerank “Search the documentation”Results to Keep 5Tools of the Agent (Tool output)
Qdrant “Search by brand”Filter by Metadata in Dynamic mode, with Metadata Filter (JSON) in tool mode so the agent writes the filter from the questionTools of the Agent (Tool output)
Neo4j GraphRAG “Query incidents”Neo4j API credential, Operation Text2Cypher, examples in ExamplesTools of the Agent (Tool output)
FastEmbed Embeddings (Local)The same model as at ingestionEmbedding of both Qdrant nodes
DeepSeek–Model of the Agent and Language Model of Neo4j GraphRAG
Agent “Technical assistant”Instructions that tell it which tool to use for whatResponse to Chat Output

The graph links each incident to its bar, its technician and its machine. How to prepare the graph and write the Examples: GraphRAG with Neo4j. A System Prompt that works with these three tools:

You are the assistant of Bean & Co's technicians, who repair coffee machines in bars and cafés.
Use your tools:
- Search the documentation, for errors, faults, parts, maintenance, warranty and rates.
- Search by brand, when the question names a brand: the same code means different things on each one.
- Query incidents, for specific data about incidents, bars, machines and technicians.
If a question needs several, use several. Do not make anything up: if you cannot find it, say so.
Answer in English, clearly and briefly.

Try it with the video’s questions:

QuestionWhat it answers
”Which part is VL-2210…?”The PT1000 temperature probe of the Vellani Aurora.
”My Vellani Aurora shows error E07…”Blocked flowmeter, part VL-1180 and real cases. It warns that E07 means something else on the grinder.
”Which open incidents does Lucía Ortega have…?”All three, each with its bar, taken from the graph.
”How much does a new Vellani Aurora cost to buy?”It says it does not have that data, because it is neither in the documentation nor in the graph.

Each technique in its own video

C. FAQ with verification

What you get. An FAQ assistant that checks every answer and says it could not find the information when it is not in your documents. It uses FAISS, which needs no server: the index is kept in your NappAI storage.

Ingestion flow

Components: Storage Files, Recursive Character Text Splitter, FAISS and FastEmbed Embeddings (Local).

  1. Storage Files with Operation Get File, your FAQ document in File and Content Text.
  2. Connect its output to Input of Recursive Character Text Splitter, with Chunk Size 800 and Chunk Overlap 150. If each question with its answer is shorter than that, one chunk will be one question.
  3. Connect the splitter’s output to Ingest Data of FAISS, with Operation Add, Index Name shop_faq and Persist Directory faq.
  4. Connect FastEmbed Embeddings (Local) to Embedding and run.

If you prefer Chroma DB, it works the same: use Collection Name and Persist Directory instead of Index Name.

Query flow

Components: Chat Input, RAG Agent, a language model, FAISS, FastEmbed Embeddings (Local) and Chat Output.

  1. FAISS with Operation Retriever, the same Index Name and Persist Directory, and Number of Results 4. Connect FastEmbed Embeddings (Local) to Embedding.
  2. Connect its Retriever output to Retrievers of the RAG Agent.
  3. Connect the model to Model, Chat Input to Question and Response to Chat Output.
  4. Keep the accuracy options: Enable Document Relevance Grading and Enable Hallucination Check on, Enable Web Search Fallback off.
  5. In Additional Instructions write who it speaks for and what to do when it cannot find the answer:
You speak for Electrohogar Norte and address customers informally.
If the documentation does not have the answer, invite them to write to soporte@electrohogar-norte.example.
  1. If people ask chained questions, turn on Use Memory.

Try it. Ask something that is in your FAQ, then a follow-up (“and how much does it cost?”) and finally something that is not there. In the test we ran with a fictitious shop (in Spanish), “Do you have a physical store in Lisbon?” got an answer saying it could not find information about physical stores in Lisbon in the available documentation, and inviting the customer to write to support. Each answer cites its documents ([1], [2]…) and ends with the Sources (the Show Sources option, on by default).

More about each option in RAG agent.