Ali Karami
Developer
Da digitale Innovationen und KI-Technologien zunehmend an Bedeutung gewinnen, ist es für Unternehmen besonders wichtig, mit dem technologischen Fortschritt mitzuhalten. So hat sich auch Senacor dafür entschieden, die technologischen Innovationen in das Kerngeschäft von Senacor zu integrieren. Ziel des Projekts ist es, ChatGPT in den Arbeitsalltag bei Senacor einzubinden, um von diesem leistungsfähigen und effizienzsteigernden Tool profitieren zu können. Konkret soll unseren Kollegen ein Zugang zu ChatGPT verschafft und ihnen auf diese Weise neue Möglichkeiten in der Automatisierung und Datenverarbeitung eröffnet werden.
Was ist ChatGPT?
ChatGPT ist ein Sprachmodell (Large Language Model, LLM), das von OpenAI entwickelt wurde und auf der GPT (Generative Pre-trained Transformer) Architektur basiert. Diese KI-Technologie ermöglicht es dem Modell, menschenähnliche Texte zu generieren, indem sie Muster und Informationen aus einem umfangreichen Datensatz, der während des Trainings verwendet wurde, erkennt und nutzt¹. ChatGPT verspricht, einfache Faktenfragen bis hin zu komplexeren Aufgaben wie dem Verfassen von Texten, Beantworten von Fachfragen oder dem Führen von Gesprächen in natürlicher Sprache bearbeiten zu können. Hierbei soll es den Kontext verstehen und passende, relevante Antworten zurückgeben. Dies erreicht ChatGPT durch die zugrundeliegende, umfassende Datenmenge beim Training des LLM. Beispielsweise in den Bereichen Kundenbetreuung, Textbearbeitung und Bildung werden große Mehrwerte durch den Einsatz von ChatGPT erwartet.²
Die Entstehung des Projekts
Um unser Ziel zu erreichen und durchzusetzen, wurde zunächst ein Entwickler-Team, bestehend aus drei Entwicklern, zusammengestellt. Gemeinsam entwickelten wir eine Strategie, wie und in welcher Form wir unseren Kollegen bei Senacor ChatGPT zur Verfügung stellen werden. Dabei haben wir uns für eine Webapp und eine Slack-App entschieden. Die Webapp bietet die Möglichkeit, device unabhängig zu sein. Dies ist deshalb von Vorteil, da im Projektgeschäft auch des Öfteren Fremdrechner zum Einsatz kommen. Die Slack-App hingegen nutzten wir als zentrales Kommunikationsmedium. Da Senacor dieses bereits benutzt, mussten wir kein weiteres Tool im Unternehmen etablieren, um dies zu integrieren.
Entwicklung der Webapp
Einführung in Next.js
Unserer neuestes Projekt verwendet Next.js, ein fortschrittliches Framework basierend auf React. Next.js ist bekannt für seine Benutzerfreundlichkeit, Effizienz und Fähigkeit, hochleistungsfähige Anwendungen zu erstellen.
Anwendung von Next.js in unserer Webapp
In unserer Anwendung wird Next.js verwendet, um eine Single-Page-Anwendung (SPA) zu erstellen, die die OpenAI-Funktionalität integriert. Die Schlüsselaspekte unserer Implementierung umfassen:
- Integration des OpenAI-Chat-Modells: Unsere Anwendung integriert das Chat-Modell von OpenAI, wodurch Benutzer mit ChatGPT interagieren können. Dies wird durch API-Routen in Next.js ermöglicht, die Authentifizierung und Kommunikation mit der OpenAI-API verwalten.
- Echtzeit-Interaktivität: Funktionen wie das automatische Scrollen zur neuesten Nachricht und die Möglichkeit, zwischen dem GPT-4- und GPT-3.5-Modell umzuschalten, verbessern das Benutzererlebnis und machen die App interaktiver und ansprechender.
- API-Integration für Authentifizierung und Chat-Funktionalität: Die Verwendung von Next.js-API-Routen für die Handhabung der Authentifizierung (NextAuth) und die Chat-Funktionalität mit der OpenAI-API zeigt die Backend-Fähigkeiten von Next.js. Dazu gehören die effiziente Handhabung von Anfragen und Antworten, die Verwaltung von Sitzungsdaten und die Verwaltung von Umgebungsvariablen für API-Schlüssel.
Um die WebApp zu bauen, benötigt man darüber hinaus noch folgende Punkte:
- Einfache Struktur mit einer einzigen Seite (page.js)
- Verwendung von React Hooks und Komponenten (bspw. useState, useEffect und useRef)
- Eigene Komponenten und Styling (bspw. Switch und Message und Styling durch Tailwind CSS)
- Zugänglichkeit und Reaktionsfähigkeit
Die Chat-API ist das Herzstück unserer Anwendung, da sie die Kommunikation mit OpenAI’s ChatGPT ermöglicht. Der folgende Codeausschnitt zeigt, wie wir diese Funktionalität implementieren:
// ./app/api/chat/route.ts
import { Configuration, OpenAIApi } from 'openai-edge'
import { OpenAIStream, StreamingTextResponse } from 'ai'
const config = new Configuration({
apiKey: process.env.OPENAI_API_KEY
})
const openai = new OpenAIApi(config)
export const runtime = 'edge'
export async function POST(req) {
// Extract the `prompt` from the body of the request
const { messages } = await req.json()
const cookieGpt4model = req.cookies.get('gpt4model')?.value
const model = cookieGpt4model ? "gpt-4" : "gpt-3.5-turbo"
// Ask OpenAI for a streaming chat completion given the prompt
const response = await openai.createChatCompletion({
model: model,
stream: true,
messages: messages.map((message) => ({
content: message.content,
role: message.role
}))
})
// Convert the response into a friendly text-stream
const stream = OpenAIStream(response)
// Respond with the stream
return new StreamingTextResponse(stream)
}
In diesem Abschnitt wird zunächst eine Konfiguration mit dem OpenAI-API-Schlüssel erstellt. Dann wird die POST-Methode definiert, die Anfragen von der Benutzeroberfläche annimmt, um mit OpenAI zu interagieren. Die Anfrage enthält die Messages, die vom Benutzer und ChatGPT gesendet wurden. Basierend auf den Cookies wird entschieden, ob das Modell GPT-4 oder GPT-3.5-Turbo verwendet wird. Anschließend wird eine Streaming-Antwort von OpenAI angefordert und an den Client zurückgesendet.
Integration von ChatGPT in Slack mittels Azure Function
In einem weiteren Schritt integrieren wir ChatGPT in Slack, hierzu verwenden wir eine Azure Function, die mit der OpenAI-API kommuniziert. Dies ermöglicht es uns, ChatGPT direkt in Slack zu integrieren. Hier ist eine Übersicht über die wichtigsten Teile des Codes und wie sie funktionieren.
Einrichtung und Slack-SDK
Zu Beginn importieren wir erforderliche Bibliotheken und initialisieren die Slack SDK. Wir nutzen Umgebungsvariablen, um sensible Daten wie das Slack-Token und den Signing-Secret sicher zu verwalten.
import os
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
from slack_sdk.signature import SignatureVerifier
import openai
import threading
signature_verifier = SignatureVerifier(os.environ['SLACK_SIGNING_SECRET'])
slack_token = os.environ['SLACK_TOKEN']
client = WebClient(token=slack_token)
Nachrichten aus Slack Threads abrufen
Mit der Funktion get_thread_messages holen wir alle vorherigen Nachrichten aus einem Slack-Thread. Dies ist wichtig, um den Kontext der Konversation zu verstehen und eine passende Antwort zu generieren.
def get_thread_messages(channel_id, thread_ts):
try:
response = client.conversations_replies(
channel=channel_id,
ts=thread_ts
)
messages = response.get("messages", [])
return messages[1:]
except SlackApiError as e:
print("Error retrieving thread messages:", e.response["error"])
return []
Verarbeitung eingehender Nachrichten
Die Hauptfunktion handle_message verarbeitet eingehende Slack-Nachrichten. Wenn eine Nachricht keine bot_id hat (also von einem echten Benutzer stammt), bereiten wir die Daten vor, um sie an die OpenAI-API zu senden.
def handle_message(event):
if event.get("bot_id") is None:
channel_id = event["channel"]
user_id = event["user"]
message_ts = event["ts"]
message = event["text"]
thread_ts = event.get("thread_ts")
thread = threading.Thread(target=generate_openai_response)
thread.start()
Innerhalb der handle_message-Funktion definieren wir eine innere Funktion generate_openai_response, die einen separaten Thread startet. Diese Funktion bereitet die Konversation vor und sendet eine Anfrage an OpenAI, um eine Antwort basierend auf dem vorherigen Chat-Verlauf zu generieren.
def generate_openai_response():
if thread_ts:
thread_messages = get_thread_messages(channel_id, thread_ts)
else:
thread_messages = []
formatted_conversation = [
{"role": "system", "content": "You are a helpful assistant SenacorGPT Slackbot. Senacor AG Employees will message you"}
]
for msg in thread_messages:
role = "user" if msg["user"] == user_id else "assistant"
content = msg["text"]
formatted_conversation.append({"role": role, "content": content})
messages = [{"role": "user", "content": message}]
formatted_conversation.extend(messages)
chat_completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=formatted_conversation
)
response = chat_completion.choices[0].message.content
Antwort an Slack senden
Nach dem Erhalten der Antwort von OpenAI senden wir diese zurück in den entsprechenden Slack-Thread.
Azure Function HTTP-Trigger
Die gesamte Logik ist in einer Azure Function verpackt, die über einen HTTP-Trigger aktiviert wird. Dies stellt sicher, dass jede eingehende Slack-Nachricht verarbeitet wird und eine entsprechende Antwort generiert.
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
if not signature_verifier.is_valid_request(req.get_body(), req.headers):
return func.HttpResponse("Not a valid Signature Key", status_code=403)
try:
req_body = req.get_json()
if req_body["type"] == "url_verification":
response = func.HttpResponse(body=req_body["challenge"], status_code=200)
response.headers["Content-Type"] = "text/plain"
return response
if "event" in req_body:
event = req_body["event"]
if event["type"] == "message":
handle_message(event)
except ValueError:
pass
# Respond immediately to Slack with a 200 status code
return func.HttpResponse(status_code=200)
Integration und Sicherheit
Für die Authentifizierung der User der Webapp wird Azure eingesetzt. Hierdurch können wir eine sichere Umgebung für die Nutzung der Webapp gewährleisten.
Bei der Slack-App dagegen ist der User automatisch eingeloggt. Die Anfragen, die an Azure Function geschickt werden, werden hier also nur von den eingeloggten Nutzern geschickt. Somit ist die Azure Function seitig ebenfalls über entsprechende Mechanismen abgesichert und nicht frei im Netz verfügbar.
Abschluss und Ausblick
Mit diesem Projekt wurde allen Senacor Mitarbeitern ein einfacher Zugang zu ChatGPT über unterschiedliche Interaktionskanäle ermöglicht. Die Umsetzung trägt erfolgreich dazu bei, den Arbeitsalltag aller Mitarbeiter effizienter zu gestalten. Basierend auf der umgesetzten Integration eröffnet sich ein großes Potential hinsichtlich weiterer Ausbaustufen und Nutzung von AI-Services im Unternehmen.
Eine erste Nutzung dieses Potentials ist durch die Erweiterung der Integration auf einen “Senacor AI-Assistenten“ unter Einbindung unternehmensinterner Anwendungen geplant. Dieser Assistent würde die Recherche nach spezifischen Informationen übernehmen und gleichzeitig unterstützend dabei wirken, für bestimmte Anliegen stets den richtigen Ansprechpartner oder die passenden Informationen bereitzustellen. Ein Beispiel hierfür wäre die automatisierte Bereitstellung von relevanten Informationen im Falle einer Krankmeldung. Durch die Implementierung dieses Assistenten könnten Arbeitsabläufe effizienter gestaltet und die Produktivität im Unternehmen gesteigert werden.
Etwaige Projekte bei Senacor machen es möglich, mit neusten Technologien zu arbeiten und reale Produkte auf Basis dieser Technologien im Projektalltag zu schaffen, die Mehrwert im und außerhalb des Unternehmens schaffen.
¹ Introducing ChatGPT, 2022: https://openai.com/blog/chatgpt
² ChatGPT – Aktuelle Nutzung in deutschen Unternehmen, 2023: https://clueone.de/chatgpt-aktuelle-nutzung-in-deutschen-unternehmen/#:~:text=In%20Bereichen%20wie%20Marketing%2C%20Vertrieb%20und%20internen%20Abl%C3%A4ufen,Datenmengen%20analysiert%20und%20in%20wertvolle%20Erkenntnisse%20umgewandelt%20werden.