Datensatz laden, in der Maske rechts auf "Dokument AI"
In einer sersten Stufe kann ein Ollama Modell verwendet werden, um die Klassifizierungsaufgabe zu übernehmen:
Unter "Einstellungen" das Olama Model, Endpoint, Stadard-Archiv und Prompt setzen.
Der Prompt MUSS folgendes JSON Objekt zurückgeben, andernfalls wird das Standardarchiv gewählt. Durch die Wahl des Archivs und der Feldvorbelegung kann eine entsprechende Rekursive Archivierung gestartet werden (Document Encoder), siehe "3. Automatische Verschlagwortung innerhalb eines Archivs".
{
archive: "doc",
preset: "INBOX"
}
Beispiel:
**Incoming** means that the document text was addressed **to** the company "Dr.DOC GmbH".
**Outgoing** means that the document text was written or issued **by** the company "Dr.DOC GmbH".
The following attached **text** should be compared with the values of the "desc" property of each JSON array element. Return one element of the JSON array that best describes the attached text.
\```text
{ocr}
\```
All JSON array elements:
\```json
[
{
"desc": [ "Incoming invoice", "purchasing bill", "Eingehende Rechnung", "Eingangsrechnung" ],
"archive": "rec",
"preset": "INVOICE_IN"
},
{
"desc": [ "Outgoing invoice", "sales invoice", "Ausgehende Rechnung", "Ausgangsrechnung" ],
"archive": "rec",
"preset": "INVOICE_OUT"
},
{
"desc": [ "Tax notice", "tax return", "sales tax return", "VAT return", "trade tax", "corporate tax", "tax return", "tax assessment", "Steuer Bescheid", "Steuererklärung", "Umsatzsteuervoranmeldung", "UStVA", "Gewerbesteuer", "Körperschaftssteuer" ],
"archive": "rec",
"preset": "TAX_IN"
},
{
"desc": [ "Account statement", "bank statement", "bank receipts", "Kontoauszug", "Bank Auszug", "Bank Belege", "Zahlungsavis" ],
"archive": "rec",
"preset": "ACC_IN"
},
{
"desc": [ "Incoming contract", "purchase contract", "purchasing contract", "rental contract", "Eingehender Vertrag", "Kaufvertrag", "Mietvertrag" ],
"archive": "rec",
"preset": "CONTRACT_IN"
},
{
"desc": [ "Outgoing contract", "maintenance contract", "loan contract", "sales contract", "Ausgehender Vertrag", "Wartungsvertrag", "Darlehensvertrag" ],
"archive": "rec",
"preset": "CONTRACT_OUT"
},
{
"desc": [ "Payroll documents", "wage slip", "Pay slip", "Salary", "Lohnunterlagen", "Lohnzettel" ],
"archive": "rec",
"preset": "WAGE"
},
{
"desc": [ "In all other cases, if no matching JSON array element has been found so far", "Brief", "Kundenanfrage", "Auswertung", "BWA", "Jahresabschluss", "Bilanz", "GuV", "Notar", "Satzung", "Mitarbeiter", "Handelsregister", "Registergericht", "Anforderung", "Lastenheft" ],
"archive": "doc",
"preset": "INBOX"
}
]
\```
Example output to return:
\```json
{
"archive": "doc",
"preset": "INBOX"
}
\```
In der zweiten Stufe kann ein Ollama Modell verwendet werden, um die Meta-Daten eines Dr.DOC Datensatzes automatisch aus dem OCR Text zu laden (Extraktion) und zu formattieren.
Es soll festgelegt werden, wie, welcher Document Encoder den OCR Text verarbeiten soll. In diesem Fall soll der DrDoc.WebServer.AiTextDocumentEncoder
diese Aufgabe übernehmen.
Dafür müssen wir einige Einstellungen setzen, damit klar ist, welches KI Modell, welcher Endpoint verwendet werden soll und wie der Response vom KI Modell verarbeitet weren soll.
Wir übergeben in einem Prompt dem gewählten Modell den OCR Text mit einer entsprechenden Aufgabe. Die Antwort können wir in einem weiteren Schritt verarbeiten (rekursive Archivierung), z.B. indem der KI Response JSON Text an einen JSON Document Encoder übergeben wird (siehe 3.2.).
z.B. config/recursive/ki-er
:
Property Name | Property Value Bschreibung |
Property Value Beispiel Wert |
---|---|---|
Enabled | Aktivieren | true |
Proto_Type | DrDoc.WebServer.AiTextDocumentEncoder | DrDoc.WebServer.AiTextDocumentEncoder |
Proto_Extension | Extension *.txt |
*.txt |
Selector_ArchiveName | Archiv | z.B. doc |
Argument1 | Ollama Endpoint / Server Adresse | http://192.168.111.21:8080 |
Argument2 | Ollama Model Name | z.B. llama3 |
Argument3 | Propmpt Text. Im Text wird [ocr} mit dem OCR Text ersetzt. |
Format the following Invoice text to text/xml, EN 16931, CrossIndustryInvoice, Schema "urn:cen.eu:en16931:2017#conformant#urn:zugferd.de:2p2:extended": |
Argument4 | Optional: Format. Mögliche Werte: json oder leer.Wenn im nächsten Sschritt ein JSON Document Encoder verwendet wird, bitte json angeben. |
z.B. json |
Argument5 | Optional: Regular Expression für KI Result. Es wird der erste erfolgreiche Match verwendet. | (?<=(?:\`\`\`)(?:xml)?\r?\n)((?:.|\r|\n)+?)(?=\r?\n(?:\`\`\`)\r?\n) |
Argument6 | Request Mode. Mögliche Werte: chat oder generate |
z.B. generate |
Argument7 | Filename + Extension für rekursive Archivierung / Document Encoder, siehe "3.2. Neuen Document Encoder erstellen, für den JSON Text" |
ki.json |
Recursive | Rekursive Document Encoder | config/recursive/RE JSON |
Wenn der Response vom KI Modell ein JSON Text ist, können die Eigenschafts-Werte aus dem Objekt bestimmten Dr.DOC Feldern zugewiesen werden (Mapping). Das machen wir über Dr.DOC Feldauswahlen.
z.B. config/recursive/RE JSON
:
Property Name | Property Value Bschreibung |
Property Value Beispiel Wert |
---|---|---|
Enabled | Aktivieren | true |
Proto_Extension | Extension *.json |
*.json |
Selector_ArchiveName | Name des Archivs | rec |
MapFieldSelectionName | Feldauswahl Bezeichner für das Mapping | DD_JSON |
MapFieldSelectionType | Feldauswahl Typ für das Mapping | IMPORT_ASCII |
PUBLIC
anDD_JSON
Beispiel 1: Alle Array Elemente in Tabellenspalte übertragen:
JSON:
{ Property1: [ { SubProperty: "value 1" }, { SubProperty: "value 2" }, ] }
Feldauswahl:
Property1/*/SubProperty
Beispiel 2: Artikelanzahl holen und "1" eingeben, falls nichts gefunden wurde
JSON:
{ Items: [ { Quantity: "" }, { Quantity: "3" }, ] }
Feldauswahl:
Items/*/Quantity"1"?
Beispiel 3: Umsatzsteuersatz holen und "%" hinten als Suffix anfügen
JSON:
{ Items: [ { VatTaxRate: "19.0" }, { VatTaxRate: "7.0" }, ] }
Feldauswahl:
Items/*/VatTaxRate"%"
Beispiel 4: Bezeichner "Name" oder alternativ Nummer "ID" laden
JSON:
{ ID: "123" }
Feldauswahl:
Name|ID
Ollama ist ein Tool für die lokale Ausführung großer neuronaler Netzmodelle / LLMs. Der Ollama Endpoint kann ein anderer Server sein als der, auf dem Dr.DOC installiert ist (OLLAMA_HOST
). Es ist eine Ausführung des Ollama Servers im Rechenzentrum oder geeignetem Server im Unternehmen möglich.
Es wird eine große Zahl von KI Modellen angeboten, mit attraktiven Lizenzmodellen für die kommerzielle Nutzung (z.B. MIT Lizenz).
Für wenig erfahrene Administratoren, wenig GPU Leistung und wenig Linux Erfahrung empfehlen wir die Windows Installation.
Bitte beachten Sie die erforderlichen Ressourcen je Modell.
1. Installieren Sie ollama auf einem geeigneten Server, z.B. mit GPU und installiertem CUDA. https://ollama.com/download/windows Es kann eine andere Maschine sein, als die, auf der Dr.DOC Web läuft.
2. ggf. Ollama Parameter ändern
SET OLLAMA_HOST=192.168.111.21:8080
SET OLLAMA_MODELS=D:\ollama\models
3. Model laden
ollama pull <model>
z.B. ollama pull llama3
4. Ollama Server starten
ollama serve
# ggf. GPUCUDA Treiber installieren
# CUDA installiert?
nvidia-smi
# ggf. Alle Nvidia treiber entfernen für eine saubere CUDA Installation
# apt remove --autoremove --purge -V nvidia-driver\* libxnvctrl\*
# CUDA Toolkit installieren, je nach Plattform - bitte folgende Befehle an Ihre Grafikkarte anpassen (siehe Link)
# https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=24.04&target_type=deb_network
# https://docs.nvidia.com/datacenter/tesla/driver-installation-guide/index.html
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-8
# sudo apt-get -y install cuda-toolkit
# sudo apt-get -y install cuda
# Treiber installieren
# sudo apt-get -y install nvidia-open
# sudo apt-get -y install cuda-drivers-570
sudo apt-get -y install cuda-drivers
# Env PATH anpassen
export PATH=/usr/local/cuda/bin:$PATH
# CUDA installiert?
nvcc --version
nvidia-smi
cat /proc/driver/nvidia/version
grep nvidia /etc/modprobe.d/* /lib/modprobe.d/*
# Nach Modul/Treiber Änderung evtl. initramfs Archive in /boot updaten
# sudo update-initramfs -u
# neu starten
systemctl reboot
# Doku: https://github.com/ollama/ollama/blob/main/docs/linux.md
curl -fsSL https://ollama.com/install.sh | sh
# Installationsort rausfinden
whereis ollama
sudo useradd -r -s /bin/false -U -m -d /usr/local/bin/ollama ollama
sudo usermod -a -G ollama $(whoami)
# Hostname und IP dieser Maschine rausfinden
hostname && hostname -I
# Env PATH anpassen
export OLLAMA_HOST=159.100.240.33:80
# Bind und Listen auf niedrigen Ports erlauben, z.B. Port 80 erlauben
sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/ollama
# Ollama Dienst erstellen
# ggf. IP und Port anpassen
sudo bash -c 'cat <<'EOF' >> /etc/systemd/system/ollama.service
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
Environment="OLLAMA_HOST=159.100.240.33:80"
[Install]
WantedBy=default.target
EOF'
# Ollama Dienst laden und starten
sudo systemctl daemon-reload
sudo systemctl enable ollama
sudo systemctl restart ollama
# Ollama Installation prüfen
/usr/local/bin/ollama --version
sudo systemctl status ollama
# Optional: Firewall anpasen; nur noch Zugriffe vom Netzwerk in dem Dr.DOC läuft bzw. der Dr.DOC Maschine aus zulassen
# FW Port öffnen
sudo ufw status
# ssh erlauben
sudo ufw allow proto tcp to any port 22
# sudo ufw allow proto tcp to any port 8081
# sudo ufw allow from 192.168.1.50
# FW nur folgende externe Remote IPs zulassen (statt Auth)
sudo ufw allow from 217.92.78.156 to any proto tcp port 80
# FW aus dem internen Netzwerk erlauben
sudo ufw allow from 192.168.1.0/24 to any proto tcp port 80
sudo ufw allow from 159.100.240.0/24 to any proto tcp port 80
# FW prüfen, bevor sie aktiv wird, da SSH Verbindungen und Remotezugriff gekappt werden könnte
sudo ufw status
sudo ufw enable
sudo ufw reload
# Ollama Modell laden
# Bitte Hardware Ressourcen für das jeweilige KI Modell prüfen
/usr/local/bin/ollama pull llama3.3:70b
# Ollama Modelle auflisten
/usr/local/bin/ollama list
# Läuft das Modell auf der GPU?
/usr/local/bin/ollama ps && nvidia-smi
# Ollama Modell starten zum testen
/usr/local/bin/ollama run llama3.3:70b
# Ollama aktualisieren
/usr/local/bin/ollama update
# Ollama API Test
http://159.100.240.33/api/version
# Logs
journalctl -u ollama --no-pager
# Ollama API Doku
# https://github.com/ollama/ollama/blob/main/docs/api.md