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).

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.

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.

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)

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

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.

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.

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 ...

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.

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.

Zusammenfassung
Hier ist eine Zusammenfassung der Schritte, die ich befolgt habe, um semantisches Clustering mit LLM -Eingaben durchzuführen:
- Extrahieren Sie Zwietrachtfäden.
- Formatdaten in Konversationsumdrehungen mit Rollen („Benutzer“, „Assistant“).
- Bewerten Sie das Gefühl und speichern Sie als CSV.
- Drang Google Gemini 2.0 Flash für Thread -Zusammenfassungen auffordern.
- Eingabeaufforderung für Verwirrungen Professional oder Gemini 2.0 Professional für das Clustering basierend auf Thread -Zusammenfassungen mit demselben CSV.
- 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
- Clio: Privatsphäre, die Erkenntnisse in die reale KI-Verwendung in der realen Welt erziehen, https://arxiv.org/abs/2412.13678
- Anthropischer Weblog über Clio, https://www.anthropic.com/analysis/clio
- Milvus Discord Serverzuletzt abgerufen am 7. Februar 2025
Chroma Discord Serverzuletzt abgerufen am 7. Februar 2025
Qdrant Discord Serverzuletzt abgerufen am 7. Februar 2025 - Gemini -Modelle, https://ai.google.dev/gemini-api/docs/fashions/gemini
- Weblog über Gemini 2.0 -Modelle, https://weblog.google/know-how/google-deepmind/gemini-model-updates-february-2025/
- Scikit-Study Silhouette Rating
- Openai matryoshka Einbettungen
- Straffung