Heim >Backend-Entwicklung >Python-Tutorial >Verwendung von Claude Sonnet von Anthropic zur Erstellung von Berichten
Berichterstellung mit Anthropics Claude 3.5 Sonnet: Vergleich zweier Methoden
Hallo zusammen! Ich bin Raphael, Mitbegründer und CTO des brasilianischen Immobilienunternehmens Pilar. Pilar bietet Software und Dienstleistungen für Immobilienmakler und Maklerfirmen an und nutzt dabei ein Modell mit niedrigen Erfolgsgebühren. Anstatt hohe Vorabgebühren zu verlangen, erhalten wir von jeder erfolgreichen Transaktion eine kleine Provision und knüpfen so unseren Erfolg direkt an den Erfolg unserer Kunden. Unser Team aus 20 Technologen entwickelt ständig Innovationen und das neueste Produkt ist Pilar Homes, ein neues Immobilienportal, das Hauskäufern und Immobilienmaklern das beste Erlebnis bieten soll.
In diesem Beitrag werde ich unsere Erfahrungen mit der Verwendung künstlicher Intelligenz zur Erstellung von Berichten teilen, insbesondere Claude 3.5 Sonnet von Anthropic, und zwei verschiedene Methoden vergleichen.
Unsere Philosophie zur Bearbeitung von Aufgaben wird in einem zukünftigen Artikel detailliert beschrieben (bleiben Sie dran!), aber kurz gesagt, diese Aufgaben landen als Jira-Tickets auf dem „Tech Help Desk“-Board. Das Erstellen von Berichten ist eine dieser Aufgaben, wobei Ingenieure für die Lösung der meisten Aufgaben etwa 30 Minuten benötigen, wobei komplexe Berichte selten länger als ein paar Stunden dauern. Aber die Dinge ändern sich. Die Boutique-Marken, die wir mit ein oder zwei Partnern gegründet haben, expandieren zu größeren Agenturen und wir schließen mehr Verträge mit etablierten Playern der Branche ab. Während eine Erhöhung der Ingenieurstunden den wachsenden Berichtsanforderungen gerecht werden könnte, sah ich eine Gelegenheit, KI-Agenten zu erkunden und Architekturmuster in realen Umgebungen zu erlernen.
In unserem ersten Ansatz haben wir das Tool dem 3.5 Sonnet-Modell von Claude ausgesetzt, sodass es Datenbankabfragen durchführen, abgerufene Dokumente in CSV konvertieren und seine Ergebnisse in eine CSV-Datei schreiben kann.
Hier ist unsere Struktur, stark inspiriert vom obigen Blog-Beitrag:
<code># 每个collection对象描述一个MongoDB集合及其字段 # 这有助于Claude理解我们的数据模式 COLLECTIONS = [ { 'name': 'companies', 'description': 'Companies are the real estate brokerages. If the user provides a code to filter the data, it will be a company code. The _id may be retrieved by querying the company with the given code. Company codes are not used to join data.', 'fields': { '_id': 'The ObjectId is the MongoDB id that uniquely identifies a company document. Its JSON representation is \"{"$oid": "the id"}\"', 'code': 'The company code is a short and human friendly string that uniquely identifies the company. Never use it for joining data.', 'name': 'A string representing the company name', } }, # 此处之后描述了更多集合,但思路相同... ] # 这是client.messages.create的“system”参数 ROLE_PROMPT = "You are an engineer responsible for generating reports in CSV based on a user's description of the report content" # 这是“user”消息 task_prompt = f"{report_description}.\nAvailable collections: {COLLECTIONS}\nCompany codes: {company_codes}\n.Always demand a company code from the user to filter the data -- the user may use the terms imobiliária, marca, brand or company to reference a company. If the user wants a field that does not exist in a collection, don't add it to the report and don't ask the user for the field." </code>
„report_description“ ist nur ein Befehlszeilenargument, das über argparse gelesen wird. „company_codes“ wird aus der Datenbank abgerufen und dem Modell zur Verfügung gestellt, damit es weiß, welche Unternehmen existieren und welche Buchungskreise in der Benutzereingabe enthalten sind. Beispiele: (MO – Mosaic Homes, NV – Nova Real Estate usw.).
Zu den für Modelle verfügbaren Tools gehören: find und docs2csv.
<code>def find(collection: str, query: str, fields: list[str]) -> Cursor: """Find documents in a collection filtering by "query" and retrieving fields via projection""" return db.get_collection(collection).find(query, projection={field: 1 for field in fields}) def docs2csv(documents: list[dict]) -> list[str]: """ Convert a dictionary to a CSV string. """ print(f"Converting {len(documents)} documents to CSV") with open('report.csv', mode='w', encoding='utf-8') as file: writer = csv.DictWriter(file, fieldnames=documents[0].keys()) writer.writeheader() writer.writerows(documents) return "report.csv"</code>
Claude konnte die Suchfunktion aufrufen, um gut strukturierte Abfragen und Prognosen für unsere Datenbank durchzuführen und mit dem docs2csv-Tool kleine CSV-Berichte (weniger als 500 Zeilen) zu erstellen. Größere Berichte lösen jedoch max_tokens-Fehler aus.
Nachdem wir unsere Token-Nutzungsmuster analysiert hatten, stellten wir fest, dass der Großteil des Token-Verbrauchs auf die Verarbeitung einzelner Datensätze durch das Modell zurückzuführen ist. Dies veranlasste uns, einen anderen Ansatz zu erkunden: Claude Verarbeitungscode generieren zu lassen, anstatt die Daten direkt zu verarbeiten.
Obwohl die Lösung des max_tokens-Limits technisch nicht schwierig ist, erfordert es von uns, unseren Ansatz zur Lösung des Problems zu überdenken.
Lösung? Lassen Sie Claude Python-Code generieren, der auf unseren CPUs ausgeführt wird, anstatt jedes Dokument durch KI zu verarbeiten.
Ich musste die Charakter- und Quest-Eingabeaufforderungen ändern und die Werkzeuge entfernen.
Das Folgende ist der Kern des Berichtsgenerierungscodes.
Der Befehl zum Generieren des Berichts lautet:
<code># 每个collection对象描述一个MongoDB集合及其字段 # 这有助于Claude理解我们的数据模式 COLLECTIONS = [ { 'name': 'companies', 'description': 'Companies are the real estate brokerages. If the user provides a code to filter the data, it will be a company code. The _id may be retrieved by querying the company with the given code. Company codes are not used to join data.', 'fields': { '_id': 'The ObjectId is the MongoDB id that uniquely identifies a company document. Its JSON representation is \"{"$oid": "the id"}\"', 'code': 'The company code is a short and human friendly string that uniquely identifies the company. Never use it for joining data.', 'name': 'A string representing the company name', } }, # 此处之后描述了更多集合,但思路相同... ] # 这是client.messages.create的“system”参数 ROLE_PROMPT = "You are an engineer responsible for generating reports in CSV based on a user's description of the report content" # 这是“user”消息 task_prompt = f"{report_description}.\nAvailable collections: {COLLECTIONS}\nCompany codes: {company_codes}\n.Always demand a company code from the user to filter the data -- the user may use the terms imobiliária, marca, brand or company to reference a company. If the user wants a field that does not exist in a collection, don't add it to the report and don't ask the user for the field." </code>
Claude-generierter Python-Inhalt (funktioniert gut):
<code>def find(collection: str, query: str, fields: list[str]) -> Cursor: """Find documents in a collection filtering by "query" and retrieving fields via projection""" return db.get_collection(collection).find(query, projection={field: 1 for field in fields}) def docs2csv(documents: list[dict]) -> list[str]: """ Convert a dictionary to a CSV string. """ print(f"Converting {len(documents)} documents to CSV") with open('report.csv', mode='w', encoding='utf-8') as file: writer = csv.DictWriter(file, fieldnames=documents[0].keys()) writer.writeheader() writer.writerows(documents) return "report.csv"</code>
Unsere Reise mit Claude 3.5 Sonnet zeigt, dass KI die betriebliche Effizienz erheblich verbessern kann, der Schlüssel zum Erfolg jedoch in der Wahl der richtigen Architektur liegt. Der Codegenerierungsansatz erwies sich als leistungsfähiger als die direkte KI-Verarbeitung und behielt gleichzeitig die Vorteile der Automatisierung bei.
Neben der korrekten Erstellung von Berichten ermöglicht die Codegenerierungsmethode den Ingenieuren auch, die Arbeit der KI zu überprüfen, was eine sehr gute Sache ist.
Um den Prozess vollständig zu automatisieren, menschliche Eingriffe zu eliminieren und größere Mengen an Berichten zu verarbeiten, wäre die Verteilung der Arbeit auf mehrere Agenteninstanzen – wobei jede weniger Tokens verarbeiten muss – eine natürliche Weiterentwicklung des Systems. Für architektonische Herausforderungen in solchen verteilten KI-Systemen kann ich Phil Calçados neuesten Artikel zum Aufbau von KI-Produkten wärmstens empfehlen.
Wichtige Erkenntnisse aus dieser Implementierung:
Das obige ist der detaillierte Inhalt vonVerwendung von Claude Sonnet von Anthropic zur Erstellung von Berichten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!