Passages
Documents are split where the topic changes, not every 512 tokens. A small DistilBERT classifier reads each pair of neighbouring passages and decides whether a new topic starts. Tables are kept apart from the prose around them.
EU Horizon Europe project
Climate and policy knowledge that anyone can ask questions of, in their own language and at their own level.
01 The problem
The climate knowledge already exists. It sits in thousands of reports, papers and policy texts, most of them long, most of them PDFs, and nearly all written for people who already know the field.
They ask about the same documents and need different answers from them: in English, Italian, Portuguese or Greek, and at a reading level that suits them. That last part is a framing decision as much as a technical one.
02 The library
2,312 research papers, 165 YouTube videos and 11 climate assessment reports, along with news coverage, policy and legal texts, and national statistics.
Six spreadsheets of national environmental statistics get one summary each. Split into passages, one row at a time, they make up 62% of everything the search can find. Counted by summary, the library is mostly research and news. Counted by what retrieval actually returns, it is mostly numbers.
03 One question
“Have precipitation patterns changed in the Adamello Park since 2018?”
A question in Italian, Portuguese or Greek is translated into English first, and the answer is translated back. Everything in between works in one language.
Greetings and questions about the bot itself are answered straight away. Anything that needs the library goes on.
In a conversation, words like it and there are replaced with what they refer to, and the grammar is tidied, so the search gets a question that stands on its own.
“how it effect on the humans”
→ “How does climate change affect humans?”
Document passages, document summaries and a knowledge graph are searched in parallel. Advanced search goes wider: a step-back version of the question, a hypothetical answer passage and three paraphrases, six queries instead of one.
A second model scores every candidate passage against the question. About fifteen make it through, with near duplicates removed.
An open-weight 7B model writes the reply from those passages only, with references back to the sources. If the search finds nothing usable, the answer says so before it says anything else.
Once the answer has been sent, a separate model reads it again and scores it on seven checks. The reader never waits for this.
04 Three ways to search
Documents are split where the topic changes, not every 512 tokens. A small DistilBERT classifier reads each pair of neighbouring passages and decides whether a new topic starts. Tables are kept apart from the prose around them.
One summary per document, written differently for a research paper, a policy text, a dataset, a news story and a video. A question about where a 300-page strategy stands is better answered by its summary than by a paragraph from page 140.
Microsoft GraphRAG pulls out the entities and how they relate, then groups them into communities at three levels, from “Climate Policy” down to “Offshore Wind”. It answers the questions no single passage can.
05 Watch it work
06 Speed
Early answers took about a minute. A minute is not slow, it is broken: nobody asks a follow-up of something that slow, and follow-up questions are the whole point of talking to a library.
Model optimisation, so the writer did less of the work a retriever should do.
Serving the model through vLLM on our own cluster.
Retrieve wide, then rank properly. It made answers better as well as faster.
07 Checking the checker
Every check stores a paragraph explaining its score, and the Explain button shows it to the reader. Almost nobody reads those paragraphs. I did, for 1,197 answers.
Is each sentence supported by the passages?
Did the search find material about the question?
Does the answer address what was asked?
Does it hold together as writing?
Does it cover what it should?
Does it show depth? Written for this project.
Could it cause harm?
About one in seven pieces of evidence the judge relied on was a sentence a model had written to describe a passage, not text from the document itself. The score could not show that. The reasons could.
08 Alongside
Some of the most useful evidence in climate writing is a single paragraph: the moment a community's habits start to shift for good. An intern in our group built an analyzer that finds those paragraphs, rewrites each one to stand on its own, and rates it against five published criteria. I helped along the way; the build is theirs. Its labels travel with the passages NeuroClima retrieves.
09 The build
Every component on the request path is open source and self-hosted, on Kubernetes. A document dropped into storage wakes the pipeline on its own: it is extracted, chunked, summarised and folded into the graph without anyone running a script.
Chunking, summarisation, and vision extraction for the figures and tables that carry half the meaning in a policy report. It reads PDFs, spreadsheets, CSVs, JSON and video, which is less elegant than it sounds and more of the work than anyone expects.
GraphRAG entity and relationship extraction with hierarchical community modelling, so the system can follow how sources relate instead of treating every passage as an island.
Where most of my time went. Model optimisation, better serving, and cross-encoder re-ranking, which had the useful side effect of improving the answers rather than just hurrying them.
The Kubernetes cluster underneath: networking, ephemeral and persistent storage, vLLM serving, Ingress, database config, autoscaling. Plus a pipeline that wakes up when a document lands in MinIO and folds it into the knowledge base.
Response tracing and dashboards, so administrators can see real sessions and queries. User feedback feeds back into fine-tuning, which is the only honest way to find out whether any of the rest of it worked.
10 Screens