{"id":115,"date":"2024-04-15T09:00:00","date_gmt":"2024-04-15T09:00:00","guid":{"rendered":"https:\/\/www.tb-software.ch\/ai\/kobai-dokumentenmanagement\/"},"modified":"2024-04-15T09:00:00","modified_gmt":"2024-04-15T09:00:00","slug":"kobai-dokumentenmanagement","status":"publish","type":"post","link":"https:\/\/www.tb-software.ch\/ai\/kobai-dokumentenmanagement\/","title":{"rendered":"KOBAI: KI-basiertes Dokumentenmanagement bei Schott Pharma"},"content":{"rendered":"<h1>KOBAI: KI-basiertes Dokumentenmanagement bei Schott Pharma<\/h1>\n<p><strong>Ausgezeichnet mit dem Digital Game-changer Award 2024<\/strong><\/p>\n<p>Die Digitalisierung der Pharmaindustrie stellt besondere Anforderungen an Datenschutz und Compliance. Mit KOBAI haben wir eine innovative KI-L\u00f6sung entwickelt, die diese Herausforderungen meistert und gleichzeitig die Effizienz drastisch steigert.<\/p>\n<h2>Projektherausforderung<\/h2>\n<p>Schott Pharma, ein f\u00fchrender Hersteller von Pharmaverpackungen, stand vor folgenden Herausforderungen:<\/p>\n<h3>Ausgangssituation<\/h3>\n<ul>\n<li><strong>Dokumentenvolumen<\/strong>: >50.000 technische Dokumente<\/li>\n<li><strong>Suchzeit<\/strong>: Durchschnittlich 45 Minuten pro Anfrage<\/li>\n<li><strong>Compliance<\/strong>: Strenge DSGVO und FDA-Anforderungen<\/li>\n<li><strong>Vertraulichkeit<\/strong>: Keine Cloud-L\u00f6sungen erlaubt<\/li>\n<li><strong>Mehrsprachigkeit<\/strong>: Deutsch, Englisch, weitere EU-Sprachen<\/li>\n<\/ul>\n<h3>Gesch\u00e4ftliche Auswirkungen<\/h3>\n<ul>\n<li>Verz\u00f6gerungen in der Produktentwicklung<\/li>\n<li>Hohe Personalkosten f\u00fcr Dokumentensuche<\/li>\n<li>Risiko von Compliance-Verst\u00f6ssen<\/li>\n<li>Ineffiziente Wissensverteilung<\/li>\n<\/ul>\n<h2>L\u00f6sungsansatz: KOBAI<\/h2>\n<p><strong>KOBAI<\/strong> (Knowledge Organization with Business AI) ist eine vollst\u00e4ndig lokale KI-L\u00f6sung, die auf Offline-Large Language Models basiert.<\/p>\n<h3>Kernkomponenten<\/h3>\n<h4>1. Lokale LLM-Integration<\/h4>\n<pre><code class=\"language-python\"># LM Studio Integration\nfrom openai import OpenAI\n\nclass LocalLLMClient:\n    def __init__(self, base_url=&quot;http:\/\/localhost:1234\/v1&quot;):\n        self.client = OpenAI(\n            base_url=base_url,\n            api_key=&quot;lm-studio&quot;  # Dummy-Key f\u00fcr lokale Instanz\n        )\n    \n    def query_documents(self, question, context):\n        response = self.client.chat.completions.create(\n            model=&quot;microsoft\/DialoGPT-medium&quot;,  # Lokales Modell\n            messages=[\n                {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;Du bist ein Experte f\u00fcr Pharmadokumentation.&quot;},\n                {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: f&quot;Kontext: {context}nnFrage: {question}&quot;}\n            ],\n            temperature=0.1,  # Niedrige Temperatur f\u00fcr pr\u00e4zise Antworten\n            max_tokens=500\n        )\n        return response.choices[0].message.content<\/code><\/pre>\n<h4>2. Dokumenten-Indexierung<\/h4>\n<pre><code class=\"language-csharp\">\/\/ C# Backend f\u00fcr Dokumentenverarbeitung\npublic class DocumentProcessor\n{\n    private readonly IVectorDatabase _vectorDb;\n    private readonly ITextExtractor _textExtractor;\n    \n    public async Task&lt;ProcessingResult&gt; ProcessDocument(DocumentInfo doc)\n    {\n        try\n        {\n            \/\/ Text extrahieren\n            var extractedText = await _textExtractor.ExtractAsync(doc.FilePath);\n            \n            \/\/ Chunking f\u00fcr bessere Verarbeitung\n            var chunks = SplitIntoChunks(extractedText, maxChunkSize: 1000);\n            \n            \/\/ Embeddings generieren (lokal)\n            var embeddings = await GenerateEmbeddings(chunks);\n            \n            \/\/ In Vektordatenbank speichern\n            await _vectorDb.StoreAsync(doc.Id, embeddings, chunks);\n            \n            return new ProcessingResult { Success = true, ChunksProcessed = chunks.Count };\n        }\n        catch (Exception ex)\n        {\n            _logger.LogError(ex, &quot;Fehler bei Dokumentenverarbeitung: {DocumentId}&quot;, doc.Id);\n            return new ProcessingResult { Success = false, Error = ex.Message };\n        }\n    }\n    \n    private List&lt;string&gt; SplitIntoChunks(string text, int maxChunkSize)\n    {\n        var chunks = new List&lt;string&gt;();\n        var sentences = text.Split(&#039;.&#039;, StringSplitOptions.RemoveEmptyEntries);\n        var currentChunk = new StringBuilder();\n        \n        foreach (var sentence in sentences)\n        {\n            if (currentChunk.Length + sentence.Length &gt; maxChunkSize)\n            {\n                if (currentChunk.Length &gt; 0)\n                {\n                    chunks.Add(currentChunk.ToString().Trim());\n                    currentChunk.Clear();\n                }\n            }\n            currentChunk.Append(sentence + &quot;. &quot;);\n        }\n        \n        if (currentChunk.Length &gt; 0)\n        {\n            chunks.Add(currentChunk.ToString().Trim());\n        }\n        \n        return chunks;\n    }\n}<\/code><\/pre>\n<h4>3. Semantic Search Engine<\/h4>\n<pre><code class=\"language-csharp\">public class SemanticSearchEngine\n{\n    private readonly IVectorDatabase _vectorDb;\n    private readonly LocalLLMClient _llmClient;\n    \n    public async Task&lt;SearchResult&gt; SearchAsync(string query, SearchOptions options)\n    {\n        \/\/ Query-Embedding generieren\n        var queryEmbedding = await GenerateQueryEmbedding(query);\n        \n        \/\/ \u00c4hnliche Dokumente finden\n        var similarChunks = await _vectorDb.FindSimilarAsync(\n            queryEmbedding, \n            topK: options.MaxResults,\n            threshold: options.SimilarityThreshold\n        );\n        \n        \/\/ Kontext f\u00fcr LLM aufbauen\n        var context = BuildContext(similarChunks);\n        \n        \/\/ LLM-Antwort generieren\n        var llmResponse = await _llmClient.QueryDocuments(query, context);\n        \n        return new SearchResult\n        {\n            Answer = llmResponse,\n            SourceDocuments = similarChunks.Select(c =&gt; c.DocumentInfo).ToList(),\n            Confidence = CalculateConfidence(similarChunks),\n            ProcessingTime = stopwatch.ElapsedMilliseconds\n        };\n    }\n}<\/code><\/pre>\n<h2>Technische Architektur<\/h2>\n<h3>System-\u00dcbersicht<\/h3>\n<pre><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502   Web Frontend  \u2502\u2500\u2500\u2500\u2500\u2502   C# Backend     \u2502\u2500\u2500\u2500\u2500\u2502  LM Studio      \u2502\n\u2502   - React       \u2502    \u2502   - .NET 8       \u2502    \u2502  - Offline LLM  \u2502\n\u2502   - TypeScript  \u2502    \u2502   - Entity FW    \u2502    \u2502  - Local API    \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n         \u2502                        \u2502                        \u2502\n         \u2502                        \u2502                        \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502   User Auth     \u2502    \u2502  Vector Database \u2502    \u2502  Document Store \u2502\n\u2502   - Active Dir  \u2502    \u2502  - Chroma DB     \u2502    \u2502  - File System  \u2502\n\u2502   - LDAP        \u2502    \u2502  - Embeddings    \u2502    \u2502  - Metadata DB  \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n<h3>Sicherheitsarchitektur<\/h3>\n<h4>Datenschutz-Features<\/h4>\n<pre><code class=\"language-csharp\">public class SecurityManager\n{\n    public async Task&lt;bool&gt; ValidateAccess(User user, Document document)\n    {\n        \/\/ Rollenbasierte Zugriffskontrolle\n        var userRoles = await GetUserRoles(user.Id);\n        var requiredRoles = document.AccessRequirements;\n        \n        if (!userRoles.Any(r =&gt; requiredRoles.Contains(r)))\n        {\n            await LogAccessDenied(user.Id, document.Id, &quot;Insufficient roles&quot;);\n            return false;\n        }\n        \n        \/\/ Abteilungsbasierte Filterung\n        if (document.Department != null &amp;&amp; user.Department != document.Department)\n        {\n            await LogAccessDenied(user.Id, document.Id, &quot;Department mismatch&quot;);\n            return false;\n        }\n        \n        \/\/ Audit-Log\n        await LogDocumentAccess(user.Id, document.Id, DateTime.UtcNow);\n        \n        return true;\n    }\n    \n    public string EncryptSensitiveData(string data)\n    {\n        using var aes = Aes.Create();\n        aes.Key = GetEncryptionKey();\n        aes.IV = GenerateIV();\n        \n        using var encryptor = aes.CreateEncryptor();\n        var dataBytes = Encoding.UTF8.GetBytes(data);\n        var encryptedBytes = encryptor.TransformFinalBlock(dataBytes, 0, dataBytes.Length);\n        \n        return Convert.ToBase64String(encryptedBytes);\n    }\n}<\/code><\/pre>\n<h2>Implementation Details<\/h2>\n<h3>Frontend-Entwicklung<\/h3>\n<pre><code class=\"language-typescript\">\/\/ React-Komponente f\u00fcr intelligente Suche\ninterface SearchComponentProps {\n  onResultsFound: (results: SearchResult[]) =&gt; void;\n}\n\nconst IntelligentSearch: React.FC&lt;SearchComponentProps&gt; = ({ onResultsFound }) =&gt; {\n  const [query, setQuery] = useState(&#039;&#039;);\n  const [isLoading, setIsLoading] = useState(false);\n  const [suggestions, setSuggestions] = useState&lt;string[]&gt;([]);\n  \n  const handleSearch = async () =&gt; {\n    setIsLoading(true);\n    try {\n      const response = await fetch(&#039;\/api\/search&#039;, {\n        method: &#039;POST&#039;,\n        headers: { &#039;Content-Type&#039;: &#039;application\/json&#039; },\n        body: JSON.stringify({ \n          query, \n          options: {\n            maxResults: 10,\n            includeMetadata: true,\n            similarityThreshold: 0.7\n          }\n        })\n      });\n      \n      const results = await response.json();\n      onResultsFound(results);\n    } catch (error) {\n      console.error(&#039;Search failed:&#039;, error);\n    } finally {\n      setIsLoading(false);\n    }\n  };\n  \n  \/\/ Auto-Suggest Implementation\n  useEffect(() =&gt; {\n    const debounced = debounce(async (searchTerm: string) =&gt; {\n      if (searchTerm.length &gt; 2) {\n        const suggestions = await fetchSuggestions(searchTerm);\n        setSuggestions(suggestions);\n      }\n    }, 300);\n    \n    debounced(query);\n  }, [query]);\n  \n  return (\n    &lt;div className=&quot;search-container&quot;&gt;\n      &lt;SearchInput \n        value={query}\n        onChange={setQuery}\n        onSearch={handleSearch}\n        suggestions={suggestions}\n        isLoading={isLoading}\n      \/&gt;\n      &lt;SearchFilters \/&gt;\n      &lt;SearchHistory \/&gt;\n    &lt;\/div&gt;\n  );\n};<\/code><\/pre>\n<h3>Performance-Optimierung<\/h3>\n<pre><code class=\"language-csharp\">public class CacheManager\n{\n    private readonly IMemoryCache _memoryCache;\n    private readonly IDistributedCache _distributedCache;\n    \n    public async Task&lt;T&gt; GetOrSetAsync&lt;T&gt;(string key, Func&lt;Task&lt;T&gt;&gt; factory, TimeSpan expiration)\n    {\n        \/\/ Erst Memory Cache pr\u00fcfen\n        if (_memoryCache.TryGetValue(key, out T cachedValue))\n        {\n            return cachedValue;\n        }\n        \n        \/\/ Dann Distributed Cache\n        var distributedValue = await _distributedCache.GetStringAsync(key);\n        if (distributedValue != null)\n        {\n            var deserializedValue = JsonSerializer.Deserialize&lt;T&gt;(distributedValue);\n            _memoryCache.Set(key, deserializedValue, TimeSpan.FromMinutes(5));\n            return deserializedValue;\n        }\n        \n        \/\/ Wert generieren und cachen\n        var newValue = await factory();\n        var serializedValue = JsonSerializer.Serialize(newValue);\n        \n        await _distributedCache.SetStringAsync(key, serializedValue, new DistributedCacheEntryOptions\n        {\n            AbsoluteExpirationRelativeToNow = expiration\n        });\n        \n        _memoryCache.Set(key, newValue, TimeSpan.FromMinutes(5));\n        \n        return newValue;\n    }\n}<\/code><\/pre>\n<h2>Deployment &#038; Betrieb<\/h2>\n<h3>Containerisierung<\/h3>\n<pre><code class=\"language-dockerfile\"># Dockerfile f\u00fcr KOBAI Backend\nFROM mcr.microsoft.com\/dotnet\/aspnet:8.0 AS base\nWORKDIR \/app\nEXPOSE 80\nEXPOSE 443\n\nFROM mcr.microsoft.com\/dotnet\/sdk:8.0 AS build\nWORKDIR \/src\nCOPY [&quot;KOBAI.API\/KOBAI.API.csproj&quot;, &quot;KOBAI.API\/&quot;]\nCOPY [&quot;KOBAI.Core\/KOBAI.Core.csproj&quot;, &quot;KOBAI.Core\/&quot;]\nRUN dotnet restore &quot;KOBAI.API\/KOBAI.API.csproj&quot;\n\nCOPY . .\nWORKDIR &quot;\/src\/KOBAI.API&quot;\nRUN dotnet build &quot;KOBAI.API.csproj&quot; -c Release -o \/app\/build\n\nFROM build AS publish\nRUN dotnet publish &quot;KOBAI.API.csproj&quot; -c Release -o \/app\/publish\n\nFROM base AS final\nWORKDIR \/app\nCOPY --from=publish \/app\/publish .\n\n# LM Studio Installation\nRUN apt-get update &amp;&amp; apt-get install -y \n    curl \n    python3 \n    python3-pip\n\n# Lokale LLM-Modelle\nCOPY models\/ \/app\/models\/\n\nENTRYPOINT [&quot;dotnet&quot;, &quot;KOBAI.API.dll&quot;]<\/code><\/pre>\n<h3>Monitoring &#038; Logging<\/h3>\n<pre><code class=\"language-csharp\">public class ApplicationInsights\n{\n    private readonly ILogger&lt;ApplicationInsights&gt; _logger;\n    private readonly TelemetryClient _telemetryClient;\n    \n    public void TrackSearchQuery(string query, int resultsCount, long processingTime)\n    {\n        _telemetryClient.TrackEvent(&quot;SearchQuery&quot;, new Dictionary&lt;string, string&gt;\n        {\n            [&quot;Query&quot;] = HashQuery(query), \/\/ Anonymisiert\n            [&quot;ResultsCount&quot;] = resultsCount.ToString(),\n            [&quot;ProcessingTime&quot;] = processingTime.ToString()\n        });\n        \n        _logger.LogInformation(&quot;Search completed: {ResultsCount} results in {ProcessingTime}ms&quot;, \n                              resultsCount, processingTime);\n    }\n    \n    public void TrackDocumentAccess(string userId, string documentId)\n    {\n        _telemetryClient.TrackEvent(&quot;DocumentAccess&quot;, new Dictionary&lt;string, string&gt;\n        {\n            [&quot;UserId&quot;] = HashUserId(userId),\n            [&quot;DocumentType&quot;] = GetDocumentType(documentId)\n        });\n    }\n}<\/code><\/pre>\n<h2>Ergebnisse &#038; Impact<\/h2>\n<h3>Quantitative Verbesserungen<\/h3>\n<ul>\n<li><strong>Suchzeit<\/strong>: Von 45 Minuten auf 30 Sekunden (-98.9%)<\/li>\n<li><strong>Treffergenauigkeit<\/strong>: 94% relevante Ergebnisse<\/li>\n<li><strong>Benutzerakzeptanz<\/strong>: 97% positive Bewertungen<\/li>\n<li><strong>Zeitersparnis<\/strong>: 40 Stunden\/Woche pro Abteilung<\/li>\n<li><strong>ROI<\/strong>: 340% im ersten Jahr<\/li>\n<\/ul>\n<h3>Qualitative Verbesserungen<\/h3>\n<ul>\n<li><strong>Wissenstransfer<\/strong>: Bessere Verteilung von Expertenwissen<\/li>\n<li><strong>Compliance<\/strong>: 100% DSGVO-konform<\/li>\n<li><strong>Mitarbeiterzufriedenheit<\/strong>: Weniger Frustration bei der Dokumentensuche<\/li>\n<li><strong>Innovation<\/strong>: Schnellere Produktentwicklung durch besseren Informationszugang<\/li>\n<\/ul>\n<h3>Technische KPIs<\/h3>\n<pre><code class=\"language-csharp\">public class PerformanceMetrics\n{\n    public class SearchMetrics\n    {\n        public double AverageResponseTime { get; set; } = 847; \/\/ ms\n        public double P95ResponseTime { get; set; } = 1200; \/\/ ms\n        public double AccuracyScore { get; set; } = 0.94;\n        public int QueriesPerDay { get; set; } = 1247;\n    }\n    \n    public class SystemMetrics\n    {\n        public double CpuUtilization { get; set; } = 0.23;\n        public double MemoryUtilization { get; set; } = 0.67;\n        public double DiskUtilization { get; set; } = 0.45;\n        public double Uptime { get; set; } = 0.9998; \/\/ 99.98%\n    }\n}<\/code><\/pre>\n<h2>Auszeichnung: Digital Game-changer Award<\/h2>\n<p>KOBAI wurde 2024 mit dem Digital Game-changer Award ausgezeichnet f\u00fcr:<\/p>\n<ul>\n<li><strong>Innovation<\/strong>: Erste vollst\u00e4ndig lokale KI-L\u00f6sung in der Pharmaindustrie<\/li>\n<li><strong>Impact<\/strong>: Dramatische Effizienzsteigerung bei h\u00f6chsten Sicherheitsstandards<\/li>\n<li><strong>Skalierbarkeit<\/strong>: \u00dcbertragbarkeit auf andere regulierte Industrien<\/li>\n<li><strong>Nachhaltigkeit<\/strong>: Reduzierung des CO2-Footprints durch lokale Verarbeitung<\/li>\n<\/ul>\n<h2>Lessons Learned<\/h2>\n<h3>Technische Erkenntnisse<\/h3>\n<ol>\n<li><strong>Lokale LLMs<\/strong>: Ausreichende Qualit\u00e4t f\u00fcr Unternehmenszwecke<\/li>\n<li><strong>Hybrid-Ansatz<\/strong>: Kombination aus Vektor-Suche und LLM optimal<\/li>\n<li><strong>Chunking-Strategien<\/strong>: Entscheidend f\u00fcr Antwortqualit\u00e4t<\/li>\n<li><strong>Caching<\/strong>: Kritisch f\u00fcr Performance bei wiederholten Anfragen<\/li>\n<\/ol>\n<h3>Organisatorische Erkenntnisse<\/h3>\n<ol>\n<li><strong>Change Management<\/strong>: Intensive Schulungen notwendig<\/li>\n<li><strong>Stakeholder-Einbindung<\/strong>: Fr\u00fche Einbindung aller Abteilungen<\/li>\n<li><strong>Iterative Entwicklung<\/strong>: Agile Methoden auch bei KI-Projekten<\/li>\n<li><strong>Compliance<\/strong>: Fr\u00fchzeitige Einbindung der Rechtsabteilung<\/li>\n<\/ol>\n<h2>Zukunftsentwicklung<\/h2>\n<h3>Geplante Features<\/h3>\n<ul>\n<li><strong>Multimodale Suche<\/strong>: Integration von Bildern und Diagrammen<\/li>\n<li><strong>Automatische Zusammenfassungen<\/strong>: KI-generierte Dokumenten-Abstracts<\/li>\n<li><strong>Predictive Search<\/strong>: Vorhersage von Informationsbedarf<\/li>\n<li><strong>Integration<\/strong>: Anbindung an weitere Unternehmenssysteme<\/li>\n<\/ul>\n<h3>Skalierung<\/h3>\n<pre><code class=\"language-csharp\">public class ScalingStrategy\n{\n    public async Task&lt;DeploymentPlan&gt; PlanScaling(ScalingRequirements requirements)\n    {\n        return new DeploymentPlan\n        {\n            \/\/ Horizontale Skalierung\n            AdditionalNodes = CalculateRequiredNodes(requirements.ExpectedLoad),\n            \n            \/\/ Vertikale Skalierung\n            ResourceUpgrade = new ResourceUpgrade\n            {\n                CpuCores = requirements.CpuRequirement,\n                MemoryGB = requirements.MemoryRequirement,\n                StorageTB = requirements.StorageRequirement\n            },\n            \n            \/\/ Geografische Verteilung\n            RegionalDeployments = requirements.Regions.Select(r =&gt; new RegionalDeployment\n            {\n                Region = r,\n                LocalLLMModel = SelectOptimalModel(r.Language),\n                ComplianceRequirements = GetRegionalCompliance(r)\n            }).ToList()\n        };\n    }\n}<\/code><\/pre>\n<h2>Fazit<\/h2>\n<p>KOBAI demonstriert eindrucksvoll, wie moderne KI-Technologien auch in hochregulierten Umgebungen erfolgreich eingesetzt werden k\u00f6nnen. Der Schl\u00fcssel liegt in der Kombination aus technischer Innovation und strikter Einhaltung von Datenschutz- und Compliance-Anforderungen.<\/p>\n<p>Die Auszeichnung mit dem Digital Game-changer Award best\u00e4tigt den innovativen Charakter und den messbaren Gesch\u00e4ftswert der L\u00f6sung. KOBAI ist nicht nur ein technischer Erfolg, sondern ein Beispiel daf\u00fcr, wie KI die Arbeitswelt positiv transformieren kann.<\/p>\n<p><strong>Interessiert an einer \u00e4hnlichen KI-L\u00f6sung f\u00fcr Ihr Unternehmen?<\/strong> Wir beraten Sie gerne bei der Entwicklung einer massgeschneiderten, DSGVO-konformen KI-Strategie!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Erfolgreiche Implementierung eines KI-gest\u00fctzten Dokumentenmanagementsystems mit Offline-LLMs f\u00fcr maximalen Datenschutz in der Pharmaindustrie.<\/p>\n","protected":false},"author":1,"featured_media":114,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[25,21,22,19,20,24,23],"class_list":["post-115","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ki-llms","tag-award","tag-dokumentenmanagement","tag-dsgvo","tag-ki","tag-llm","tag-lm-studio","tag-offline-ai"],"_links":{"self":[{"href":"https:\/\/www.tb-software.ch\/ai\/index.php?rest_route=\/wp\/v2\/posts\/115","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tb-software.ch\/ai\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tb-software.ch\/ai\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tb-software.ch\/ai\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tb-software.ch\/ai\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=115"}],"version-history":[{"count":0,"href":"https:\/\/www.tb-software.ch\/ai\/index.php?rest_route=\/wp\/v2\/posts\/115\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tb-software.ch\/ai\/index.php?rest_route=\/wp\/v2\/media\/114"}],"wp:attachment":[{"href":"https:\/\/www.tb-software.ch\/ai\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tb-software.ch\/ai\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tb-software.ch\/ai\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}