Multilingual R&D Knowledge Assistant

Multilingual R&D Knowledge Assistant

6 language agents behind one Teams web app, sharing 5 R&D knowledge bases.

Project details

Anonymized case study
Industry

Multinational agri-business group (anonymized under NDA)

Timeline

v1 in production, continuous iteration

Tech Stack

Copilot Studio, custom Teams web app, GPT-5 Reasoning, Dataverse, SharePoint

Built with
  • Microsoft Copilot Studio
  • Teams Custom App
  • Direct Line API
  • Dataverse
  • SharePoint
  • GPT-5 Reasoning
  • Power Automate

Context

A multinational agri-business group with R&D operations across Europe, Latin America and Central Europe needed an internal knowledge assistant their process experts could query in their working language. 6 languages today: English, French, Portuguese (Brazilian), Czech, Spanish, Dutch. 5 SharePoint knowledge bases shared across all of them (plants, processes, products, equipment, raw materials).

An earlier internal attempt collapsed everything into a single Copilot Studio bot with language treated as a global variable. It demoed well and degraded under real R&D use: per-language quality drifted, transient Copilot Studio errors surfaced raw to the user, and conversation history disappeared the moment Teams closed the chat. The brief for the rebuild was to keep the multi-language reach and add what production needs.

Challenge

Native Copilot Studio is excellent for one agent on one channel. It is less excellent when you need 6 language-tuned agents that share 5 knowledge bases, retry their own errors, cache common answers, export their own conversations, and persist history outside the Teams transcript. None of those properties ship out of the box - collapsing them into a single bot trades them away.

2 harder constraints sat under that. First, per-language quality could not be sacrificed for architectural elegance: process experts in Brazil writing in Portuguese expect answers that read like a Portuguese-speaking colleague wrote them, not a translated English answer with the same generic ranking. Second, R&D leadership needed an auditable conversation record and structured feedback capture that linked feedback to the exact conversation it came from. Native Teams chat could not provide either.

Approach

6 dedicated Copilot Studio agents (one per language), all reading from the same 5 SharePoint knowledge bases, all running GPT-5 Reasoning. In front of them, a custom Teams web app that owns everything Copilot Studio cannot.

The web app is the orchestration layer:

  • Language routing. User picks their language in the app; the app calls the matching agent via Direct Line. No language detection guesswork inside the agent.
  • Automatic retry on error. Transient throttles and timeouts on the Direct Line side are retried by the web app before they ever reach the user. The agent does not have to know.
  • Response caching for cost optimization. Common queries are served from a short-TTL cache instead of paying for another reasoning pass. Tenant cost goes down without changing the agents.
  • Conversation history in Dataverse. Every turn persists, keyed per user. Conversations survive across sessions, devices, and Teams restarts - you can pick up a conversation from yesterday.
  • PDF export on demand. Any conversation can be exported as a PDF for filing in the QM system or attaching to an experiment report.
  • Structured feedback by email, with the conversation log attached. When a user flags an answer, R&D leadership receives the feedback and the full conversation that produced it. Feedback is actionable instead of decontextualized.
Architecture diagram for the Multilingual R&D Knowledge Assistant: a custom Teams web app routes user prompts via Direct Line to one of 6 dedicated Copilot Studio language agents (EN, FR, PT-BR, CS, ES, NL). All 6 agents read from the same 5 shared SharePoint knowledge bases. The web app owns retry on error, response caching, Dataverse history, PDF export, and structured email feedback.6 language agents behind one Teams web app, sharing 5 SharePoint knowledge bases.

2 design insights that did the heavy lifting:

  • Per-language agents over one-with-globals. The "single bot, language as a variable" pattern is elegant on a slide and brittle in production: prompt drift between languages, knowledge ranking that does not translate, response style that flattens to the lowest common denominator. 6 independent agents are cheaper to evolve, cheaper to A/B per language, and cheaper to govern. Adding a 7th language is one new agent and one new dropdown entry - not a refactor of the multilingual response template.
  • A custom Teams web app over Copilot Studio's native UI. Retry, caching, PDF export, Dataverse history, structured feedback - none of those belong inside a topic graph. The right place for them is a thin front-end that owns the user experience and delegates reasoning to the agents. The native Teams channel was the bottleneck; replacing it unlocked everything else.

Outcome

  • 6 language agents in production in the customer tenant, fronted by a custom Teams web app.
  • Conversation history persists across sessions via Dataverse - users resume yesterday's thread instead of starting over.
  • Retry layer absorbs transient Copilot Studio throttles invisibly; the user never sees a raw error.
  • Response caching cuts tenant-side cost on repeat questions without any change to the agents.
  • PDF export and structured email feedback adopted by R&D leadership as the primary feedback loop on the agents.
  • Architecture extensible to a 7th language with one new agent + one new web app dropdown entry, not a redesign.

What I learned

Single-bot multilingual is a slide pattern, not a production pattern

A custom Teams web app pays for itself the moment Copilot Studio's native UI is the bottleneck

Feedback without the conversation log is just venting

Want to talk about it?