All projects
2024.09Software & InfrastructureNew Build

Internal Document Assistant

An AI assistant that answers from internal documents and shows its sources with each answer.

WebServer & Infra
Internal Document Assistant
Screen reconstructed from delivered work. Contains no client data.
Timeline
About 5 months
Team size
4 people
Platforms
Web · Server
Deployment
On-premises, internal network

Background

The client wanted to search internal policies and technical documents, but a security policy prohibited uploading documents to external LLM services. They needed a way to answer questions directly without documents ever leaving the company.

Scope

  • Internal document indexing and ingestion
  • Natural-language question answering
  • Display of source documents behind each answer
  • Reflecting document updates
  • Query history management

Technical decisions

What we chose, and why it fit

Built a language model that runs inside the internal network instead of an external LLM

Keeping documents from leaving the company was the core requirement. Placing the model on internal infrastructure let both queries and documents stay within company boundaries.

Used a RAG structure to present source documents alongside answers

If the model only generated an answer, there was no way to verify it was correct. We had it first retrieve relevant documents from a vector database and answer based on those, so users could check the source text alongside the answer.

Engineering challenges

Problem

Internal documents were revised continually, and if the index wasn't updated, the system risked answering based on regulations that had already been superseded.

Approach

We built a pipeline that re-indexed only the revised document in the vector database when a revision occurred, and recorded document versions so we could confirm whether the document behind an answer was the latest version.

Result

Even when a regulation changed, it was reflected in answers within the next indexing cycle, and we could trace which document version an answer was based on.

Problem

When a question was ambiguous or multiple relevant documents existed, the model sometimes mixed in content that wasn't actually supported by any source.

Approach

We cross-checked the retrieved documents against the answer content, and flagged the answer whenever it included content not present in the source documents.

Result

Users could now tell when an answer was insufficiently supported, reducing the risk of citing it without checking.

Handover and operations

We delivered a document registration and re-indexing method along with a model operations guide to internal admins. We handed over the source code and internal-network deployment configuration, and supported model tuning and document expansion under separate maintenance.

Stack

LLMRAGVector DBPython