Blog

Die Assistenten-API von OpenAI: Ein Leitfaden für Anfänger zur Verbesserung Ihrer App

Ewa Oszajec
November 11, 2024

Bewaffnet mit dem Wunsch, Teil der Magie zu sein, dem Wunsch, neue Fähigkeiten zu erwerben und ein Semester Python zu lernen, fing ich an, mit der Assistents-API von Open AI herumzuspielen. Nicht allzu lange danach konnte ich mit außergewöhnlichen Ingenieuren zusammenarbeiten, um eine Beta-App zu entwickeln, deren Herzstück unsere Verwendung der APIs von Open AI war. 💚 Ich werde unser Geheimrezept nicht verraten, obwohl Sie unten einen kleinen Einblick erhalten. 👀 Mithilfe von Open AI konnten wir eine voll funktionsfähige Beta erstellen, die eine App ersetzen sollte, deren Entwicklung 3 Jahre dauerte, Tausende von Codezeilen umfasste und ein weniger genaues Verhalten als unsere Beta hatte, dessen Bau nur 6 Wochen dauerte.

Um es kurz zu machen, bin ich am besten qualifiziert, über dieses Thema zu sprechen? Nein, aber verstehe ich, wie es sich anfühlt, keine Ahnung zu haben, wo ich anfangen soll, KI und LLMs in Ihre App zu integrieren? Ja. Lassen Sie uns in ein Szenario eintauchen, in dem ich Ihnen zeige, wie Sie die Assistenten-API verwenden, um Ihre App zu verbessern.

❗️Haftungsausschluss: Dies ist ein Ausgangspunkt, von dem aus Sie iterieren können. Es ist also nicht perfekt oder produktionsbereit. Ich bin mir sicher, dass der Code veraltet sein wird, sobald OpenAI eine neue Version veröffentlicht, da sich die Assistants API in der Beta-Phase befindet.

Wie bestimmen Sie, was ein guter Lösung für diese Technologie ist?

Ich denke darüber nach, was ist eine Benutzeraktion, die natürliche Sprache verwendet, aber für jeden Benutzer sehr spezifisch ist? Bei der Beantwortung dieser Frage werden wir im Folgenden das Problem lösen, wie die Datei eines Benutzers analysiert und Rückschlüsse auf die Daten in der Datei gezogen werden kann.

Für den Workspace führe ich alle meine Machbarkeitsnachweise in einem Jupyter-Notizbuch und der Open AI-Benutzeroberfläche durch.

Schritt 1: Erstellen Sie Ihren Open AI Client

import openai
openai.api_key = <insert your API key here>
from openai import OpenAI
client = OpenAI()

Schritt 2: Laden Sie Ihre Datei hoch

file = client.files.create(
  file=open("File1.csv", "rb"),
  purpose='assistants'
)
print(file)

Schritt 3: Erstelle deinen Assistenten

Wie unten gezeigt, stehen für einen Assistenten mehrere Tools zur Verfügung. Ich habe mich für die Verwendung des entschieden Code-Interpreter um dieses Problem zu lösen, da die Dateisuche eine bekannte Einschränkung für die Zusammenfassung hat (Schiedsrichter). Also werden wir versuchen, das LLM dazu zu bringen, Pandas und andere Bibliotheken zu verwenden, um eine eingehende Analyse der Datei durchzuführen

my_assistant = client.beta.assistants.create(
    instructions="You are an expert accountant, tasked with reading and analyzing General Ledger files", 
    name="Expert File Analyzer Assistant", 
    tools=[{"type": "code_interpreter"}],
    tool_resources={
        "code_interpreter": {
          "file_ids": [file.id]
        }
      },
    model="gpt-4o"
)
print(my_assistant)

Schritt 4: Erstelle deinen Thread

thread = client.beta.threads.create()
print(thread)

Schritt 5: Erstellen Sie Ihre Aufforderung und Nachricht

Prompt Engineering ist eine herausfordernde und entmutigende Aufgabe, da es sich um ein brandneues Gebiet handelt und nur begrenzte Unterlagen verfügbar sind. Ich habe unten eine Starter-Eingabeaufforderung bereitgestellt, die ich getestet und wiederholt habe. Ihre Aufforderung wird der wichtigste Teil zur Lösung Ihres spezifischen Problems sein. Einige Ideen finden Sie unter: https://cookbook.openai.com/

prompt=f"""
    **Role**: you are an expert accountant analyzing General Ledger files.
    You are provided with a General Ledger file attached to this assistant. 
    Each transaction has a date, 2 or more reference fields, and an amount.
    **Task**:
    You are to open the file and analyze the data inside
    **Instructions**:
    1. Open the attached file and load into the code interprator using your library of choice.
    2. Identify the column that contains dates
    3. Identify the column that contains amounts
    4. Identify the row where transactional data begins
    5. Analyze the all the columns except the data and amount columns and make a recommendation on which column should be the the primary refence field(reference 1)
    6. Analyze the all the columns except the data and amount columns and make a recommendation on which column should be the the secondary refence field(reference 2)
    Respond with only the output summary using the following template.
    ***Output***
    1. The Date column is found in column
    2. The Amount column is found in column
    3. Transactional Data begins in row
    3. My recommendation for reference 1 is
    4. My recommendation for reference 2 is
"""
client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content=prompt,
    attachments= [
    {
      "file_id": file.id,
      "tools": [{"type": "code_interpreter"}]
    }
  ]
)


Schritt 6: Lauf und erhalte deine Antwort

from typing_extensions import override
from openai import AssistantEventHandler
from openai.types.beta.threads import Text
class EventHandler(AssistantEventHandler):
    def __init__(self):
        super().__init__()
        self.text_responses = []
        self.error = None
    def get_last_text_response(self):
        return None if len(self.text_responses) == 0 else self.text_responses[-1]
    @override
    def on_text_done(self, text: Text) -> None:
        self.text_responses.append(text.value)
    @override
    def on_exception(self, exception: Exception):
        self.error = str(exception)
    @override
    def on_timeout(self):
        self.error = "Timeout error"
event_handler = EventHandler()
with client.beta.threads.runs.stream(
    thread_id=thread.id,
    assistant_id=my_assistant.id,
    event_handler=event_handler,
) as stream:
    stream.until_done()
if event_handler.error:
    print(event_handler.error)
summary = event_handler.get_last_text_response()
print(summary)


Schritt 7: Iteriere deinen Code

Ändern Sie Ihre Aufforderung und/oder die Anzahl der an den Assistenten gesendeten Nachrichten, indem Sie die Schritte 5 und 6 wiederholen, bis die Ausgabe, die Sie erhalten, Ihr Problem konsistent löst. Um mir zu helfen, meine Eingabeaufforderung zu verfeinern, verwende ich den Benutzeroberfläche für Threads. Dies hilft mir zu sehen, wie der LLM denkt, und hilft mir, verschiedene Follow-Prompts zu testen. Wir haben festgestellt, dass der Assistent manchmal verwirrt ist, wenn Sie ihm zu viele Informationen geben.

Während du iterierst, ist es ganz normal, 4 Stufen der Aufforderung zu durchlaufen (vielleicht gibt es mehr oder weniger, aber diese vier sind das, was ich ständig fühle, wenn ich in diesem Bereich arbeite)

Stufe 1: Erkundung und Verwirrung

Confused

Stufe 2: Frustration

Frustrated

Stufe 3: Über den Sinn des Lebens nachdenken

Think

Stufe 4: Der Heureka-Moment, in dem du endlich alle Teile richtig hinkriegst

Think

Schritt 8: Aufräumen

client.files.delete(file.id)
client.beta.threads.delete(thread_id)
client.beta.assistants.delete(assistant_id)

Ich hoffe, dieser Blogbeitrag hilft Ihnen dabei, den Sprung in LLMs und den KI-Bereich zu wagen, denn obwohl das Programmieren in diesem Bereich sehr schwierig ist, werden die Belohnungen und Verbesserungen Ihrer App Sie auf das nächste Level bringen und Ihnen helfen, Probleme schneller und spezifischer für jeden Kunden als je zuvor zu lösen! Viel Spaß beim Programmieren! 👩💻😊 Lass uns das Level festlegen, bevor wir beginnen. Ich bin ein Anfänger, genau wie Sie, wenn es um den Einsatz von KI und LLMs (Large Language Models) geht. Ich bin in diesen Bereich gekommen, weil wir uns derzeit an einem Scheideweg in der Technologiebranche befinden. Ich erinnere mich an das erste Mal, als ich ChatGPT benutzt habe; es fühlte sich an wie ✨ magisch. ✨ Es gab mir eine Antwort auf ein obskures Problem, das ich seit Wochen zu lösen versuchte.