Als Entwickleranwalt ist es schwierig, mit Nachrichten -Discussion board -Nachrichten auf dem Laufenden zu bleiben und das Gesamtbild dessen zu verstehen, was Benutzer sagen. Es gibt viele wertvolle Inhalte – aber wie können Sie die wichtigsten Gespräche schnell erkennen? In diesem Tutorial zeige ich Ihnen einen KI -Hack, um semantisches Clustering einfach durch LLMs aufzufordern!

TL; Dr. 🔄 In diesem Weblog -Beitrag geht es darum, wie man von (Information Science + Code) → (AI -Eingabeaufforderungen + LLMs) für die gleichen Ergebnisse enthält – nur schneller und mit weniger Aufwand! 🤖⚡. Es ist wie folgt organisiert:

  • Inspiration und Datenquellen
  • Erforschung der Daten mit Dashboards
  • LLM veranlasst, KNN -Cluster zu produzieren
  • Experimentieren mit benutzerdefinierten Einbettungen
  • Clustering über mehrere Discord -Server

Inspiration und Datenquellen

Erstens werde ich geben Requisiten für das Papier im Dezember 2024 Clio (Claude -Erkenntnisse und Beobachtungen)Eine Datenschutz-Präsentationsplattform, die mit AI-Assistenten aggregierte Nutzungsmuster über Millionen von Gesprächen analysiert und oberflächenübergreifend ist. Das Lesen dieses Papiers hat mich dazu inspiriert, dies zu versuchen.

Daten. Ich habe nur öffentlich verfügbar verwendet Zwietracht Nachrichten, insbesondere „Discussion board -Threads“, bei denen Benutzer um technische Hilfe bitten. Darüber hinaus habe ich Inhalte für diesen Weblog aggregiert und anonymisierte. Professional Thread habe ich die Daten in das Konversations -Flip -Format formatiert, wobei Benutzerrollen entweder als „Benutzer“ identifiziert wurden und die Frage oder den „Assistenten“ gestellt haben, jeder, der die erste Frage des Benutzers beantwortet. Ich habe auch eine einfache, hartcodierte binäre Sentimentsbewertung (0 für „nicht glücklich“ und 1 für „Completely satisfied“) hinzugefügt, basierend darauf, ob der Benutzer jederzeit in seinem Thread bedankte. Für Vectordb -Anbieter habe ich Zilliz/Milvus, Chroma und Qdrant verwendet.

Der erste Schritt bestand darin, die Daten in einen Pandas -Datenrahmen umzuwandeln. Unten ist ein Auszug. Sie können für Thread_id = 2 sehen, ein Benutzer, der nur 1 Frage gestellt hat. Aber für Thread_ID = 3 stellte ein Benutzer 4 verschiedene Fragen im selben Thread (andere 2 Fragen zu weiter unten, nicht unten gezeigten Zeitstempeln).

Der erste Schritt bestand darin, die anonymisierten Daten in einen Pandas -Datenrahmen mit Spalten umzuwandeln: Punktzahl, Benutzer, Rolle, Nachricht, Zeitstempel, Thread, user_turns.

Ich habe ein naives Gefühl hinzugefügt. 0 | 1 Bewertungsfunktion.

def calc_score(df):
   # Outline the goal phrases
   target_words = ("thanks", "thanks", "thx", "🙂", "😉", "👍")


   # Helper perform to verify if any goal phrase is within the concatenated message content material
   def contains_target_words(messages):
       concatenated_content = " ".be part of(messages).decrease()
       return any(phrase in concatenated_content for phrase in target_words)


   # Group by 'thread_id' and calculate rating for every group
   thread_scores = (
       df(df('role_name') == 'consumer')
       .groupby('thread_id')('message_content')
       .apply(lambda messages: int(contains_target_words(messages)))
   )
   # Map the calculated scores again to the unique DataFrame
   df('rating') = df('thread_id').map(thread_scores)
   return df


...


if __name__ == "__main__":
  
   # Load parameters from YAML file
   config_path = "config.yaml"
   params = load_params(config_path)
   input_data_folder = params('input_data_folder')
   processed_data_dir = params('processed_data_dir')
   threads_data_file = os.path.be part of(processed_data_dir, "thread_summary.csv")
  
   # Learn knowledge from Discord Discussion board JSON information right into a pandas df.
   clean_data_df = process_json_files(
       input_data_folder,
       processed_data_dir)
  
   # Calculate rating based mostly on particular phrases in message content material
   clean_data_df = calc_score(clean_data_df)


   # Generate reviews and plots
   plot_all_metrics(processed_data_dir)


   # Concat thread messages & save as CSV for prompting.
   thread_summary_df, avg_message_len, avg_message_len_user = 
   concat_thread_messages_df(clean_data_df, threads_data_file)
   assert thread_summary_df.form(0) == clean_data_df.thread_id.nunique()

Erforschung der Daten mit Dashboards

Aus den oben verarbeiteten Daten habe ich traditionelle Dashboards erstellt:

  • Nachrichtenmengen: Einmalige Gipfel bei Anbietern wie Qdrant und Milvus (möglicherweise aufgrund von Marketingereignissen).
  • Benutzerverlobung: High -Benutzer -Bar -Diagramme und -StrussPlots der Reaktionszeit im Vergleich zu Anzahl der Benutzerumwenden zeigen, dass im Allgemeinen mehr Benutzer um eine höhere Zufriedenheit bedeuten. Die Zufriedenheit sieht jedoch nicht mit der Reaktionszeit korreliert aus. Streuplot-dunkle Punkte scheinen in Bezug auf die y-Achse (Antwortzeit) zufällig zu sein. Vielleicht sind Benutzer nicht in Produktion, ihre Fragen sind nicht sehr dringend? Ausreißer existieren, wie QDrant und Chroma, die möglicherweise botgesteuerte Anomalien haben.
  • Zufriedenheitstrends: Rund 70% der Benutzer scheinen gerne eine Interaktion zu haben. Daten Hinweis: Überprüfen Sie die Emojis professional Anbieter. Manchmal reagieren Benutzer mit Emojis anstelle von Wörtern! Beispiel Qdrant und Chroma.
Bild des Autors von aggregierten, anonymisierten Daten. High hyperlinks: Die Diagramme zeigen Chromas höchstes Nachrichtenvolumen an, gefolgt von QDrant und dann Milvus. High -Rechte: High -Messaging -Benutzer, QDrant + Chroma -mögliche Bots (siehe High -Bar in der High -Messaging -Benutzer -Chart). Center Rights: Streudiagramme der Reaktionszeit und die Anzahl der Benutzerumwendungen zeigen keine Korrelation in Bezug auf dunkle Punkte und Y-Achse (Antwortzeit). In der Regel eine höhere Zufriedenheit der WRT-X-Achse (Benutzerumdrehen), außer Chroma. Backside hyperlinks: Balkendiagramme der Zufriedenheitsstufen, stellen Sie sicher, dass Sie mögliche Emoji-basierte Suggestions fangen, siehe Qdrant und Chroma.

LLM veranlasst, KNN -Cluster zu produzieren

Für die Aufforderung bestand der nächste Schritt darin, Daten nach Thread_ID zu aggregieren. Für LLMs benötigen Sie die zusammengesetzten Texte zusammen. Ich trenne Benutzernachrichten von ganzen Thread -Nachrichten ab, um festzustellen, ob das eine oder andere bessere Cluster erzeugen würde. Am Ende habe ich nur Benutzernachrichten verwendet.

Beispiel Anonymisierte Daten zur Aufforderung. Alle Nachrichtentexte werden zusammen verkettet.

Mit einer CSV -Datei zur Aufforderung können Sie mit einem LLM beginnen, um Datenwissenschaft zu machen!

!pip set up -q google.generativeai
import os
import google.generativeai as genai


# Get API key from native system
api_key=os.environ.get("GOOGLE_API_KEY")


# Configure API key
genai.configure(api_key=api_key)


# Checklist all of the mannequin names
for m in genai.list_models():
   if 'generateContent' in m.supported_generation_methods:
       print(m.identify)


# Attempt totally different fashions and prompts
GEMINI_MODEL_FOR_SUMMARIES = "gemini-2.0-pro-exp-02-05"
mannequin = genai.GenerativeModel(GEMINI_MODEL_FOR_SUMMARIES)
# Mix the immediate and CSV knowledge.
full_input = immediate + "nnCSV Information:n" + csv_data
# Inference name to Gemini LLM
response = mannequin.generate_content(full_input)


# Save response.textual content as .json file...


# Examine token counts and evaluate to mannequin restrict: 2 million tokens
print(response.usage_metadata)
Bild des Autors. Oben: Beispiel LLM -Modellnamen. Unten: Beispiel Inference Name to Gemini LLM Token Zählungen: prompt_token_count = Eingabe -Token; candidaten_token_count = output tokens; Total_Token_Count = Summe Whole Token verwendet.

Leider schnitt die Gemini -API immer wieder kurz das ab response.textual content. Ich hatte besseres Glück benutzt AI Studio direkt.

Bild vom Autor: Screenshot von Beispielausgaben von Google AI Studio.

Meine 5 Eingabeaufforderungen zu Gemini Flash & Professional (Temperatur eingestellt auf 0) sind unten.

Eingabeaufforderung Nr. 1: Thread -Zusammenfassungen abrufen:

In Anbetracht dieser .csv -Datei professional Zeile fügen Sie 3 Spalten hinzu:
– Thread_Summary = 205 Zeichen oder weniger Zusammenfassung der Spalte der Zeile ‚Message_Content‘ ‚
– user_thread_summary = 126 Zeichen oder weniger Zusammenfassung der Spalte der Zeile ‚message_content_user‘ ‚
-Thread_topic = 3–5 Wort Tremendous Excessive-Stage-Kategorie
Stellen Sie sicher, dass die Zusammenfassungen den Hauptinhalt erfassen, ohne zu viele Particulars zu verlieren. Machen Sie die Zusammenfassungen von Benutzer -Threads direkt auf den Punkt, erfassen Sie den Hauptinhalt, ohne zu viele Particulars zu verlieren, und überspringen Sie den Intro -Textual content. Wenn eine kürzere Zusammenfassung intestine genug ist, bevorzugen die kürzere Zusammenfassung. Stellen Sie sicher, dass das Thema allgemein genug ist, dass es für alle Daten weniger als 20 hochrangige Themen gibt. Bevorzugen Sie weniger Themen. JSON -Spalten ausgeben: Thread_id, Thread_Summary, user_thread_summary, Thread_topic.

Eingabeaufforderung Nr. 2: Cluster -Statistiken abrufen:

Verwenden Sie angesichts dieser CSV -Datei mit Nachrichten die semantische Clusterbildung aller Zeilen durch Column = ‚user_thread_summary‘. Verwenden Sie Technik = Silhouette mit Verknüpfungsmethode = Ward und Distance_Metric = Cosinus -Ähnlichkeit. Geben Sie mir vorerst die Statistiken für die Methode Silhouette -Analyse.

Eingabeaufforderung Nr. 3: Erstes Clustering durchführen:

Verwenden Sie angesichts dieser CSV -Datei mit Nachrichten die Säule = ‚user_thread_summary‘, um die semantische Clusterbildung aller Zeilen mit der Silhouette -Methode in n = 6 -Cluster durchzuführen. Verwenden Sie Column = ”thread_topic”, um jedes Cluster -Thema in 1–3 Wörtern zusammenzufassen. Ausgabe JSON mit Spalten: Thread_id, Level0_Cluster_ID, Level0_Cluster_Topic.

Silhouette Rating misst, wie ähnlich ein Objekt wie ein eigenes Cluster (Kohäsion) gegenüber anderen Clustern (Trennung) ist. Die Bewertungen reichen von -1 bis 1. Eine höhere durchschnittliche Silhouette -Punktzahl zeigt im Allgemeinen besser definierte Cluster mit guter Trennung. Weitere Informationen finden Sie in der Scikit-Study Silhouette Rating-Dokumentation.

Anwenden auf Chroma -Daten. Im Folgenden zeige ich Ergebnisse aus der Eingabeaufforderung Nr. 2 als Diagramm der Silhouette -Ergebnisse. Ich habe gewählt N = 6 Cluster als Kompromiss zwischen hoher Punktzahl und weniger Clustern. Die meisten LLMs für die Datenanalyse nehmen in diesen Tagen Eingabe als CSV und Ausgabe JSON an.

Bild des Autors von aggregierten, anonymisierten Daten. Hyperlinks: Ich habe n = 6 Cluster als Kompromiss zwischen höherer Punktzahl und weniger Clustern gewählt. Rechts: Die tatsächlichen Cluster verwenden n = 6. Das höchste Gefühl (höchste Punktzahlen) ist für Themen über Abfrage. Die niedrigste Stimmung (niedrigste Werte) bezieht sich auf Themen zu „Kundenproblemen“.

Aus der obigen Handlung können Sie sehen, dass wir endlich in das Fleisch dessen einsteigen, was Benutzer sagen!

Eingabeaufforderung Nr. 4: Hierarchische Cluster -Statistiken erhalten:

Verwenden Sie angesichts dieser CSV -Datei mit Nachrichten die Säule = ‚Thread_Summary_User‘, um die semantische Clusterbildung aller Zeilen in hierarchische Clusterbildung (agglomerativ) mit 2 Ebenen durchzuführen. Verwenden Sie Silhouette Rating. Was ist die optimale Anzahl der Cluster der nächsten Level0- und Level1? Wie viele Fäden professional Level1 -Cluster? Geben Sie mir einfach die Statistiken vorerst, wir werden später das eigentliche Clustering machen.

Eingabeaufforderung Nr. 5: Hierarchische Clustering führen:

Akzeptieren Sie dieses Clustering mit 2 Ebenen. Fügen Sie Cluster -Themen hinzu, die die Textspalte „Thread_topic“ zusammenfassen. Cluster -Themen sollten so kurz wie möglich sein, ohne im Cluster -Bedeutung zu viel Particulars zu verlieren.
– Level0 -Cluster -Themen ~ 1–3 Wörter.
– Level1 -Cluster -Themen ~ 2–5 Wörter.
Ausgabe JSON mit Spalten: Thread_id, Level0_Cluster_ID, Level0_Cluster_Topic, Level1_Cluster_ID, Level1_Cluster_Topic.

Ich habe auch aufgefordert, Streamlit -Code zu generieren, um die Cluster zu visualisieren (da ich kein JS -Experte 😄 bin). Die Ergebnisse für die gleichen Chroma -Daten sind unten aufgeführt.

Bild des Autors von aggregierten, anonymisierten Daten. Linkes Bild: Jeder Scatterplot-Punkt ist ein Faden mit Hover-Information. Rechts Bild: hierarchisches Clustering mit Rohdaten-Drill-Down-Funktionen. API- und Paketfehler sehen nach Chromas dringendster Thema zu beheben, da das Gefühl niedrig ist und das Volumen der Nachrichten hoch ist.

Ich fand das sehr aufschlussreich. Für Chroma ergab Clustering, dass Benutzer zwar mit Themen wie Abfrage, Distanz und Leistung zufrieden waren, sie jedoch über Bereiche wie Daten, Consumer und Bereitstellung unglücklich waren.

Experimentieren mit benutzerdefinierten Einbettungen

Ich wiederholte die obigen Clustering -Eingabeaufforderungen anstelle der numerischen Einbettung („user_embedding“) im CSV anstelle der RAW -Textzusammenfassungen („user_text“). Blogs Vorher und die Risiken von Überfit -Modellen auf Bestenlisten. Openai hat zuverlässig Einbettungen die durch API -Anruf äußerst erschwinglich sind. Im Folgenden finden Sie ein Beispiel -Code -Snippet, wie Sie Einbettungen erstellen.

from openai import OpenAI


EMBEDDING_MODEL = "text-embedding-3-small"
EMBEDDING_DIM = 512 # 512 or 1536 attainable


# Initialize shopper with API key
openai_client = OpenAI(
   api_key=os.environ.get("OPENAI_API_KEY"),
)


# Perform to create embeddings
def get_embedding(textual content, embedding_model=EMBEDDING_MODEL,
                 embedding_dim=EMBEDDING_DIM):
   response = openai_client.embeddings.create(
       enter=textual content,
       mannequin=embedding_model,
       dimensions=embedding_dim
   )
   return response.knowledge(0).embedding


# Perform to name per pandas df row in .apply()
def generate_row_embeddings(row):
   return {
       'user_embedding': get_embedding(row('user_thread_summary')),
   }


# Generate embeddings utilizing pandas apply
embeddings_data = df.apply(generate_row_embeddings, axis=1)
# Add embeddings again into df as separate columns
df('user_embedding') = embeddings_data.apply(lambda x: x('user_embedding'))
show(df.head())


# Save as CSV ...
Beispieldaten für die Aufforderung. Spalte „user_embedding“ ist eine Array -Länge = 512 der schwimmenden Punktzahlen.

Interessanterweise halluzinierten sowohl Verwirrigkeit Professional als auch Gemini 2.0 Professional manchmal hallukinierte Cluster -Themen (z. B. falsch klassifizieren eine Frage zu langsamen Abfragen als „persönliche Angelegenheit“).

Schlussfolgerung: Wenn Sie NLP mit Eingabeaufforderungen ausführen, lassen Sie das LLM seine eigenen Einbettungen erzeugen – extern erzeugte Einbettungen scheinen das Modell zu verwirren.

Bild des Autors von aggregierten, anonymisierten Daten. Sowohl Verwirrungsprofi als auch Google Gemini 1.5 Professional professional halluzinierten Cluster-Themen, wenn sie eine extern erzeugte Einbettungssäule verabreicht. Schlussfolgerung – Wenn Sie NLP mit Eingabeaufforderungen ausführen, halten Sie einfach den rohen Textual content und lassen Sie die LLM ihre eigenen Einbettungen hinter den Kulissen erstellen. Das Füttern in extern generierten Einbettungen scheint das LLM zu verwirren!

Clustering über mehrere Discord -Server

Schließlich erweiterte ich die Analyse um Discord -Nachrichten aus drei verschiedenen Vectordb -Anbietern. Die daraus resultierende Visualisierung hob häufige Probleme hervor – wie MILVUS und CHROMA, die sich mit Authentifizierungsproblemen befassen.

Bild des Autors von aggregierten, anonymisierten Daten: Ein Multi-Vendor-Vectordb-Dashboard zeigt Spitzenprobleme in vielen Unternehmen an. Eine Sache, die auffällt, ist, dass sowohl Milvus als auch Chroma Probleme mit der Authentifizierung haben.

Zusammenfassung

Hier ist eine Zusammenfassung der Schritte, die ich befolgt habe, um semantisches Clustering mit LLM -Eingaben durchzuführen:

  1. Extrahieren Sie Zwietrachtfäden.
  2. Formatdaten in Konversationsumdrehungen mit Rollen („Benutzer“, „Assistant“).
  3. Bewerten Sie das Gefühl und speichern Sie als CSV.
  4. Drang Google Gemini 2.0 Flash für Thread -Zusammenfassungen auffordern.
  5. Eingabeaufforderung für Verwirrungen Professional oder Gemini 2.0 Professional für das Clustering basierend auf Thread -Zusammenfassungen mit demselben CSV.
  6. Schnellverfelste Professional oder Gemini 2.0 Professional zum Schreiben Straffung Code zur Visualisierung von Clustern (weil ich kein JS -Experte 😆 bin).

Wenn Sie diese Schritte befolgen, können Sie RAW -Discussion board -Daten schnell in umsetzbare Erkenntnisse umwandeln – was früher eine Codierungstage in nur einem Nachmittag erfolgt!

Referenzen

  1. Clio: Privatsphäre, die Erkenntnisse in die reale KI-Verwendung in der realen Welt erziehen, https://arxiv.org/abs/2412.13678
  2. Anthropischer Weblog über Clio, https://www.anthropic.com/analysis/clio
  3. Milvus Discord Serverzuletzt abgerufen am 7. Februar 2025
    Chroma Discord Serverzuletzt abgerufen am 7. Februar 2025
    Qdrant Discord Serverzuletzt abgerufen am 7. Februar 2025
  4. Gemini -Modelle, https://ai.google.dev/gemini-api/docs/fashions/gemini
  5. Weblog über Gemini 2.0 -Modelle, https://weblog.google/know-how/google-deepmind/gemini-model-updates-february-2025/
  6. Scikit-Study Silhouette Rating
  7. Openai matryoshka Einbettungen
  8. Straffung

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert