---
title: "会話はAIで、ファイルはエンジンに触れられる：何がそれらを分離する"
seo_title: "Conversation with AI, file touched by the engine | SazAI"
description: "The talking layer and the editing layer are separate by design: the model understands, the engine executes, checked."
tags: [marketing]
---

> Almost every AI product for documents puts the model in the path of the file: it reads the material, decides what to change and hands back a new document. That works in the demo and fails in the case that matters, because a language model is excellent at interpreting and poor at guaranteeing. SazAI Corpus starts from a different split, and everything the other pages promise comes from it.

<div class="chap">

<div class="ico-col"><sz-icon style="color:var(--verb-talk)" name="sparkles" size="36"></sz-icon></div>

<h2 id="two-layers">The two layers</h2>

<h3 class="sub">One understands what you want; the other opens the file by the format's own rules</h3>

The talking layer understands the request, chooses the operation, explains the result and
answers your questions. It is made of a language model, and that is where the AI works. The
layer that touches the file is a deterministic engine: it opens the document by the rules of
its own format, finds the elements that exist, changes exactly the ones authorized and writes
the file back. That engine does not interpret intent and does not improvise.

<figure class="viz duo" role="group" aria-label="平文の要求は選択された操作になり、ファイルを書くのはエンジン">
<div class="side"><svg viewBox="0 0 90 60" aria-hidden="true"><rect x="4" y="10" width="82" height="40" rx="10" fill="none" stroke="var(--verb-talk)" stroke-width="1.5"/><line x1="16" y1="24" x2="64" y2="24" stroke="var(--gray)" stroke-width="2"/><line x1="16" y1="34" x2="48" y2="34" stroke="var(--gray)" stroke-width="1.5"/></svg><b>your request</b><span>in your own words, the way you speak</span></div>
<div class="mid"><svg viewBox="0 0 120 72" aria-hidden="true"><line x1="8" y1="36" x2="52" y2="36" stroke="var(--verb-talk)" stroke-width="1.5"/><path d="M46 30l6 6-6 6" fill="none" stroke="var(--verb-talk)" stroke-width="1.5"/><rect x="52" y="24" width="24" height="24" rx="4" fill="none" stroke="var(--verb-talk)" stroke-width="1.5"/><line x1="76" y1="36" x2="112" y2="36" stroke="var(--gray)" stroke-width="1.5"/><path d="M106 30l6 6-6 6" fill="none" stroke="var(--gray)" stroke-width="1.5"/></svg><b>a chosen operation</b><span>named, logged, with a receipt</span></div>
<div class="side"><svg viewBox="0 0 90 60" aria-hidden="true"><rect x="12" y="6" width="66" height="48" rx="4" fill="none" stroke="var(--gray)" stroke-width="1.5"/><rect x="22" y="18" width="28" height="16" rx="2" fill="none" stroke="var(--gray)" stroke-width="1.5"/><line x1="22" y1="42" x2="68" y2="42" stroke="var(--lightgray)" stroke-width="1.5"/></svg><b>the file written</b><span>by the engine, never by the model</span></div>
<figcaption>The model chooses the operation; the engine is what opens and writes the file.</figcaption>
</figure>

The practical consequence of this split is the one that decides a purchase: the worst possible
error in the AI layer is still a conversation error. If the model misreads your request, the
wrong operation runs and that shows up in the receipt, with the name of what ran and against
which version. What does not happen is the file coming back silently damaged by an
improvisation.

</div>

<div class="chap">

<div class="ico-col"><sz-icon style="color:var(--verb-talk)" name="settings" size="36"></sz-icon></div>

<h2 id="spec">The document comes out of a specification</h2>

<h3 class="sub">You say what you want; what executes is an operation on a known structure</h3>

Before any transformation, the document is read whole and broken down into the elements that
compose it: text, shapes, tables, cells, pages, relations between the parts, properties and
metadata. That map is recorded, and it is what everything else rests on. A change is not a
rewrite of the file: it is a <dfn tabindex="0" data-hint="何が変わるべきか、どの要素で、どのバージョンに対して。エンジンは仕様を実行し、あなたの意図を推測しない。">specification</dfn> executed against that map, which alters the
authorized elements, leaves the rest untouched and checks the result against the source
structure.

That is why a question about the document is answered without reprocessing anything, and why
a comparison between two versions points to divergence per unit instead of showing two texts
side by side. The whole of that reading, with what it keeps for each format, is in
[your documents](documents).

</div>

<div class="chap">

<div class="ico-col"><sz-icon style="color:var(--verb-talk)" name="check" size="36"></sz-icon></div>

<h2 id="checked-boundary">Where the model's text actually enters</h2>

<h3 class="sub">In translation the boundary is checked, and when it does not match the step fails</h3>

It is worth being specific about the one case where the model's text actually reaches the
file, which is translation. There the translated text comes back and has to be injected into
the right elements, and the boundary between what the model produced and what enters the
document is checked, not assumed. The material sent carries markers that delimit each
passage, and the number of markers that comes back is compared with the number that went out.
If it does not match, because the model dropped one, invented another or wrote something that
looks like one, the step fails.

<figure class="viz" role="group" aria-label="45スライド翻訳テストの入出力要素のカウント">
<div class="ev proof"><span class="n">633</span><span class="t"><b>Went in with 633, came out with 633</b>In a 45-slide translation test the file went in with 633 elements and came out with 633, went in with 971 shapes and came out with 971, and the engine touched exactly the 11 slides that had text. The other 34 were not altered because there was nothing in them to alter.</span></div>
<figcaption>A count is the honest way to say this; an adjective is not.</figcaption>
</figure>

The difference this makes is the usual one at this house: a model that misbehaves here does
not produce a document damaged in silence, it produces an operation that did not complete.
You find out, instead of discovering it in the meeting. The scope of this guarantee varies
with what each format allows, and the [translate](translate) page says where it holds and
where it ends.

</div>

<div class="chap">

<div class="ico-col"><sz-icon style="color:var(--verb-talk)" name="rotate" size="36"></sz-icon></div>

<h2 id="model-is-a-choice">The language model is a choice, not a dependency</h2>

<h3 class="sub">What stays the same when the model changes is the deterministic layer</h3>

The model that talks and the model that translates are different roles, chosen separately by
the merit measured in each function, and both are replaceable by configuration. An installed
client points at the model it contracted for.

This matters for a reason beyond price: a tool tied to a single AI provider ages together with
it. The deterministic layer is the one that does not move when the model changes, and it is
what the arrangement's [sovereignty](privacy) rests on. It is also why the agent does not
invent a fact about your document: it answers from what the engine recorded, and the record
either holds the information or it does not.

</div>

This is the split; what it enables are the channels through which you talk to the product, in
[interfaces](interfaces), and the set of operations the agent can execute, in
[capabilities](capabilities).
