Fundierte Recherche im Bereich der künstlichen Intelligenz ist kein einzelnes monolithisches Modell – es ist vielmehr ein Prozess, ein iterativer Workflow, der Suchen, Lesen und Schlussfolgern beinhaltet, bis eine Antwort gefunden wird. Die proprietären Systeme von OpenAI, wie z. B. die, die ChatGPT oder GPT-4 antreiben, verwenden komplexe Pipelines, die Antworten kontinuierlich verfeinern. Stellen Sie sich nun vor, Sie könnten ein ähnliches System mit Open-Source-Tools erstellen. Dieser Artikel erklärt, wie Sie ein Deep Research-System mit dem Projekt jina-ai/node-DeepResearch nachbilden können. Wir werden den Code aufschlüsseln, jede Komponente detailliert beschreiben und Ihnen zeigen, wie Sie das System einrichten und erweitern können.
1. Überblick und Zweck
DeepResearch basiert auf einer einfachen, aber leistungsstarken Idee:
Suchen und lesen Sie Webseiten weiter, bis Sie die Antwort gefunden haben (oder das Token-Budget überschritten haben).
Das System nimmt eine Anfrage entgegen (z. B. „Wer ist größer? cohere, jina ai, voyage?“) und tritt in eine Schleife ein. In jedem Schritt entscheidet der Agent (ein intelligentes Modul) über eine Aktion. Er könnte nach neuen Schlüsselwörtern suchen, den Inhalt von URLs lesen, durch Generieren von Folgefragen reflektieren oder eine Antwort geben, wenn er sich sicher ist. Dieser iterative Zyklus wird fortgesetzt, bis die Antwort endgültig ist oder das Token-Budget (ein Proxy für Rechenressourcen) überschritten wird.
Installation und Einrichtung
Bevor Sie in den Code eintauchen, müssen Sie die erforderlichen Abhängigkeiten installieren und Ihre API-Schlüssel festlegen. Das Projekt verwendet Gemini für die Sprachmodellierung, Brave oder DuckDuckGo für die Websuche und den Jina Reader zum Abrufen von Webseiteninhalten. So richten Sie das Projekt ein:
export GEMINI_API_KEY=... # for Gemini API, ask Han
export JINA_API_KEY=jina_... # free Jina API key, get from https://jina.ai/reader
export BRAVE_API_KEY=... # optional; if not provided, it defaults to DuckDuckGo search
git clone https://github.com/jina-ai/node-DeepResearch.git
cd node-DeepResearch
npm install
Die README-Datei enthält sogar Beispiele für die Ausführung des Systems mit verschiedenen Abfragen:
- Simple Query:
npm run dev "1+1="ornpm run dev "what is the capital of France?" - Multi-step Query:
npm run dev "what is the latest news from Jina AI?"npm run dev "what is the twitter account of jina ai's founder" - Ambiguous, Research-like Query:
npm run dev "who is bigger? cohere, jina ai, voyage?"npm run dev "who will be president of US in 2028?"npm run dev "what should be jina ai strategy for 2025?"
Zusätzlich zu einer Befehlszeilenschnittstelle enthält das Projekt auch einen Webserver-API, der Endpunkte zum Übermitteln von Abfragen und zum Streamen von Fortschrittsaktualisierungen bereitstellt.
2. Architektur und Schlüsselkomponenten
Lassen Sie uns die Hauptkomponenten des Systems aufschlüsseln, indem wir die Kern-Dateien untersuchen:
2.1 agent.ts – Die Kernlogik
Die Datei agent.ts ist das Herzstück des Systems. Sie implementiert die Logik für den „Deep Research“-Zyklus: Generieren von Prompts, Entscheiden über Aktionen und Iterieren durch Such-, Lese-, Reflektier- und Antwortschritte.
Schlüsselelemente in agent.ts:
Imports and Setup:
Die Datei beginnt mit dem Import verschiedener Tools und Bibliotheken:
- GoogleGenerativeAI wird für die Spracherzeugung verwendet.
- readUrl aus
./tools/readruft Webseiteninhalte ab und verarbeitet sie. - duckSearch und braveSearch bieten externe Suchfunktionen.
- Dienstprogrammfunktionen wie rewriteQuery, dedupQueries, evaluateAnswer und analyzeSteps helfen, Abfragen zu verfeinern und Antworten zu bewerten.
- Konfigurationswerte (API-Schlüssel, Token-Budgets und Modellkonfigurationen) werden aus
config.tsimportiert. - Token- und Action-Tracker-Dienstprogramme überwachen die Token-Nutzung und den Zustand des Fortschritts des Agenten.
- Schließlich importiert die Datei Typen (z. B.
StepAction,ResponseSchema), die intypes.tsdefiniert sind.
Sleep Function:
async function sleep(ms: number) {
const seconds = Math.ceil(ms / 1000);
console.log(`Waiting ${seconds}s...`);
return new Promise(resolve => setTimeout(resolve, ms));
}
Diese Hilfsfunktion wird verwendet, um Operationen zu verzögern – nützlich, um eine Ratenbegrenzung beim Aufrufen externer APIs zu vermeiden.
Schema Generation:
Die Funktion getSchema definiert das JSON-Schema für die Antwort des Agenten. Sie erstellt dynamisch ein Schema, das Eigenschaften für Folgendes enthält:
- search: Benötigt eine schlüsselwortbasierte
searchQuery. - answer: Gibt an, dass eine endgültige Antwort Text in natürlicher Sprache und unterstützende Referenzen (genaue Zitate und URLs) enthalten muss.
- reflect: Listet klärende Unterfragen auf, um Wissenslücken zu schließen.
- visit: Enthält URL-Ziele zum Lesen externer Inhalte.
Durch die Durchsetzung eines strengen JSON-Schemas bleibt die Ausgabe des Agenten konsistent und maschinenlesbar.
Prompt Generation:
Die Funktion getPrompt erstellt einen detaillierten Prompt, der an das Sprachmodell gesendet wird. Sie aggregiert mehrere Abschnitte:
- Header: Er enthält das aktuelle Datum und die ursprüngliche Frage.
- Context and Knowledge: Alle vorherigen Aktionen und gesammelten Zwischenkenntnisse sind enthalten.
- Unsuccessful Attempts: Wenn frühere Aktionen keine definitive Antwort ergaben, werden diese Fehler (mit Gründen und Verbesserungen) aufgezeichnet.
- Actions: Eine Liste möglicher Aktionen wird angezeigt. Abhängig von Flags (wie
allowSearch,allowReadusw.) werden die zulässigen Operationen aufgezählt. Im „Beast Mode“ fordern die Anweisungen den Agenten auf, sich nach Kräften zu bemühen, eine Antwort zu produzieren, selbst wenn Unsicherheit besteht.
Dieser geschichtete Prompt leitet das generative KI-Modell an, Schritt für Schritt zu „denken“ und jeweils eine Aktion auszuwählen.
Main Loop in getResponse:
Die Funktion getResponse ist der Kern der iterativen Schleife des Agenten. Sie richtet den anfänglichen Kontext ein:
- Trackers: Es werden zwei Tracker verwendet – ein TokenTracker zur Überwachung der Anzahl der verwendeten Token (um zu verhindern, dass das System sein Budget überschreitet) und ein ActionTracker zur Verfolgung jedes Schritts und seiner Ergebnisse.
- Gaps and Knowledge: Es beginnt mit einer „Lücke“ (der ursprünglichen Frage) und fügt dann Zwischenfragen hinzu, wenn das System über seine Argumentation nachdenken muss.
Innerhalb einer While-Schleife gilt für den Agenten:
- Wartet (mit der Sleep-Funktion), um API-Ratenbegrenzungen zu vermeiden.
- Generiert einen Prompt basierend auf dem aktuellen Kontext.
- Ruft das generative Modell (über GoogleGenerativeAI) auf, um eine Antwort zu erzeugen.
- Analysiert die JSON-Antwort, um zu bestimmen, welche Aktion ausgeführt wurde (Antwort, Reflektieren, Suchen oder Besuchen).
- Abhängig von der Aktion:
- Answer: Es bewertet die Antwort und beendet die Schleife, wenn sie endgültig ist.
- Reflect: Es verarbeitet Unterfragen, um Wissenslücken zu schließen.
- Search: Es schreibt die Suchanfrage um, dedupliziert zuvor verwendete Schlüsselwörter und ruft neue URLs von DuckDuckGo oder Brave ab.
- Visit: Es liest den Inhalt von bereitgestellten URLs und aktualisiert die Wissensbasis.
Wenn der Schleife das Budget ausgeht oder zu viele schlechte Versuche auftreten, wechselt das System in den „Beast Mode“, in dem ein letzter, aggressiver Versuch unternommen wird, zu antworten.
Context Storage:
Die Funktion storeContext schreibt den aktuellen Prompt und verschiedene Speicherzustände (Kontext, Abfragen, Fragen und gesammeltes Wissen) in Dateien. Dieser Archivierungsprozess unterstützt das Debuggen und ermöglicht eine weitere Analyse des Entscheidungsprozesses.
Final Execution:
Die Funktion main() am Ende von agent.ts verwendet das Befehlszeilenargument (die Abfrage), ruft getResponse auf und gibt die endgültige Antwort zusammen mit einer Zusammenfassung der Token-Nutzung aus.
2.2 config.ts – Konfigurieren der Umgebung
Die Datei config.ts ist der Ort, an dem die Umgebungs- und Modellkonfigurationen definiert werden:
- Environment Variables: Mit
dotenvwerden API-Schlüssel für Gemini, Jina und Brave geladen. Es unterstützt auch die Konfiguration eines HTTPS-Proxys. - Search Provider: Das System wählt dynamisch den Suchanbieter aus, basierend darauf, ob ein Brave-API-Schlüssel bereitgestellt wird; andernfalls wird standardmäßig DuckDuckGo verwendet.
- Model Configurations: Die Datei richtet Standard- und spezifische Modellkonfigurationen für verschiedene Aufgaben ein, z. B. das Umschreiben von Abfragen, die Deduplizierung und die Bewertung. Beispielsweise wird das generative Modell des Agenten mit einer Temperatur von 0,7 konfiguriert, um Kreativität und Determinismus auszugleichen.
- Token Budget and Delay: Die Konstante
STEP_SLEEPwird auf 1000 Millisekunden gesetzt, wodurch eine Pause von einer Sekunde zwischen den Schritten sichergestellt wird.
Diese Konfigurationsdatei erleichtert das Ändern von Einstellungen und das Anpassen des Systems an verschiedene Umgebungen oder Modellverhalten.
2.3 server.ts – Die Webserver-API
Um Benutzern die Interaktion mit DeepResearch über HTTP-Anfragen zu ermöglichen, enthält das System einen einfachen Express-basierten Server in server.ts. Diese Datei richtet Endpunkte ein, die Abfrageübermittlungen verarbeiten und Fortschrittsaktualisierungen in Echtzeit streamen.
Wichtige Punkte in server.ts:
Express Setup:
Der Server verwendet Express und CORS, um Cross-Origin-Anforderungen zu unterstützen. Er lauscht auf Port 3000 (oder einem in der Umgebung angegebenen Port).
Query Endpoint (POST /api/v1/query):
- Clients senden eine JSON-Nutzlast, die die Abfrage, das Token-Budget und die maximal zulässigen schlechten Versuche enthält.
- Der Server erstellt einen neuen Tracker (für die Token-Nutzung und den Aktionsstatus) und weist eine eindeutige
requestIdzu. - Die Anfrage wird asynchron durch Aufrufen von
getResponseverarbeitet. - Nach Abschluss wird die endgültige Antwort gespeichert und der Fortschritt mithilfe eines
EventEmitterausgegeben.
Streaming Endpoint (GET /api/v1/stream/:requestId):
- Dieser Endpunkt verwendet Server-Sent Events (SSE), um kontinuierlich Aktualisierungen an den Client zurückzuschieben.
- Wenn der Agent Aktionen ausführt (Suchen, Reflektieren, Besuchen, Antworten), werden Fortschrittsereignisse ausgegeben. Jedes Ereignis enthält aktuelle Schrittinformationen, Token-Nutzung und Aktionsdetails.
- Dies ermöglicht es Clients, den Forschungsprozess in Echtzeit zu überwachen.
Task Storage and Retrieval:
Der Server schreibt Aufgabenresultate in das Dateisystem (unter einem tasks-Verzeichnis) und stellt einen Endpunkt (GET /api/v1/task/:requestId) zum Abrufen eines gespeicherten Ergebnisses bereit.
Diese Webserver-Komponente macht den Forschungsagenten über HTTP zugänglich und ermöglicht sowohl interaktive Experimente als auch die Integration in größere Systeme.
2.4 test-duck.ts – Ein Dienstprogramm zum Testen der Suche
Die Datei test-duck.ts ist ein eigenständiges Skript, das Axios verwendet, um eine HTTP-GET-Anfrage an eine externe API (in diesem Fall jsonplaceholder.typicode.com) als Test zu senden. Obwohl seine Hauptfunktion darin besteht, zu überprüfen, ob HTTP-Anfragen korrekt funktionieren (einschließlich des Festlegens der richtigen Header und der Fehlerbehandlung), dient es als Beispiel dafür, wie externe Anfragen innerhalb des Systems verarbeitet werden. In einem komplexeren Setup werden ähnliche Muster verwendet, wenn Such-APIs wie DuckDuckGo oder Brave abgefragt werden.
2.5 types.ts – Definieren konsistenter Datenstrukturen
Die Datei types.ts definiert alle benutzerdefinierten Typen, die im gesamten Projekt verwendet werden:
Action Types:
Diese umfassen die verschiedenen Aktionen, die der Agent ausführen kann:
- SearchAction: Enthält eine
searchQuery-Zeichenfolge. - AnswerAction: Benötigt eine
answer-Zeichenfolge und unterstützendereferences. - ReflectAction: Enthält ein Array von
questionsToAnswer. - VisitAction: Enthält eine Liste von
URLTargets.
Response Types:
Die Datei definiert strukturierte Antworten für Suchergebnisse, URL-Lesen, Auswertung, Fehleranalyse und mehr. Dies trägt dazu bei, die Konsistenz zu wahren und sicherzustellen, dass jedes Modul die Daten auf die gleiche Weise interpretiert.
Schema Types:
Die JSON-Schemadefinitionen stellen sicher, dass Antworten, die vom Sprachmodell generiert werden, strikt dem erwarteten Format entsprechen. Dies ist für die nachgelagerte Verarbeitung von entscheidender Bedeutung.
Tracker Context:
Benutzerdefinierte Typen für die Token- und Action-Tracker werden ebenfalls definiert, die verwendet werden, um den Zustand der Konversation und des Forschungsprozesses zu überwachen.
3. Der iterative Deep Research-Prozess
Das Gesamtsystem folgt einem methodischen, iterativen Prozess, der nachahmt, wie ein menschlicher Forscher arbeiten könnte:
Initialization:
Der Prozess beginnt mit der ursprünglichen Frage, die einer „Lücken“-Liste hinzugefügt wird (d. h. den Unbekannten, die gefüllt werden müssen).
Prompt Generation:
Der Agent erstellt einen Prompt unter Verwendung der aktuellen Frage, des vorherigen Kontexts, des gesammelten Wissens und sogar erfolgloser Versuche. Dieser Prompt wird dann an das generative KI-Modell gesendet.
Action Selection:
Basierend auf der Ausgabe des Modells wählt der Agent eine von mehreren Aktionen aus:
- Search: Formulieren Sie eine neue Abfrage, um mehr Daten zu sammeln.
- Visit: Rufen Sie detaillierte Inhalte von einer bestimmten URL ab.
- Reflect: Generieren Sie klärende Unterfragen, um Wissenslücken zu schließen.
- Answer: Geben Sie eine endgültige Antwort, wenn die Informationen als endgültig erachtet werden.
Context Update:
Jeder Schritt aktualisiert die internen Tracker (Token-Nutzung und Aktionsstatus) und archiviert den aktuellen Zustand in Dateien. Dies gewährleistet Transparenz und ermöglicht das Debuggen oder die spätere Überprüfung.
Evaluation and Looping:
Wenn eine Antwort vorgeschlagen wird, prüft ein Auswertungsschritt, ob sie endgültig ist. Wenn nicht, speichert das System die Details des fehlgeschlagenen Versuchs und passt seine Strategie an. Der Zyklus wird fortgesetzt, bis eine zufriedenstellende Antwort gefunden oder das Token-Budget erschöpft ist.
Beast Mode:
Wenn normale Schritte innerhalb der Einschränkungen keine definitive Antwort ergeben, wechselt das System in den „Beast Mode“. In diesem Modus wird die generative KI gezwungen, eine Antwort basierend auf dem akkumulierten Kontext zu erzeugen – selbst wenn dies bedeutet, eine fundierte Vermutung anzustellen.
4. Echtzeit-Fortschritt und Feedback
Ein wesentliches Merkmal des DeepResearch-Systems ist sein Echtzeit-Feedback-Mechanismus. Über den Streaming-Endpunkt des Webservers:
- Clients erhalten Fortschrittsaktualisierungen, die detailliert angeben, welche Aktion ausgeführt wurde, Statistiken zur Token-Nutzung und den aktuellen Status des Action-Trackers.
- Die Fortschrittsereignisse (wie in den README-Beispielen gezeigt) umfassen sowohl den Denkprozess des Agenten als auch Details wie den aktuellen Schritt und die Token-Aufschlüsselung.
- Diese Live-Feedback-Schleife ist von unschätzbarem Wert für das Debuggen, die Überwachung der Ressourcenauslastung und das Verständnis, wie das System argumentiert.
Ein Fortschrittsereignis könnte beispielsweise so aussehen:
data: {
"type": "progress",
"trackers": {
"tokenUsage": 74950,
"tokenBreakdown": {
"agent": 64631,
"read": 10319
},
"actionState": {
"action": "search",
"thoughts": "The text mentions several investors in Jina AI but doesn’t specify ownership percentages. A direct search is needed.",
"URLTargets": [],
"answer": "",
"questionsToAnswer": [],
"references": [],
"searchQuery": "Jina AI investor ownership percentages"
},
"step": 7,
"badAttempts": 0,
"gaps": []
}
}
Diese detaillierte Fortschrittsberichterstattung ermöglicht es Entwicklern, zu sehen, wie sich die Argumentation des Agenten im Laufe der Zeit entwickelt, und liefert Einblicke in Erfolge und Bereiche, die verbessert werden müssen.
5. Erweitern und Anpassen von DeepResearch
Die Open-Source-Natur dieses Projekts bedeutet, dass Sie das System an Ihre Bedürfnisse anpassen können. Hier sind einige Ideen zur Erweiterung von DeepResearch:
Custom Search Providers:
Sie könnten zusätzliche Suchanbieter integrieren oder den Prozess des Umschreibens von Abfragen für domänenspezifische Suchen anpassen.
Enhanced Reading Modules:
Wenn Sie eine detailliertere Textverarbeitung benötigen, können Sie alternative NLP-Modelle integrieren oder die Jina Reader-Komponente anpassen, um neue Inhaltstypen zu verarbeiten.
Improved Evaluation:
Das Evaluierungsmodul prüft derzeit, ob eine Antwort endgültig ist. Sie könnten dies erweitern, um differenziertere Metriken wie Stimmungsanalyse oder Faktencheck-Algorithmen zu integrieren.
User Interface:
Während das aktuelle System eine Befehlszeilenschnittstelle und einen einfachen Webserver für das Streaming von Ereignissen verwendet, könnten Sie eine vollwertige Web- oder mobile Oberfläche für interaktive Forschungssitzungen erstellen.
Scalability Enhancements:
Die aktuelle Implementierung wird als Single-Node-Dienst ausgeführt. Für den Produktionseinsatz sollten Sie die Anwendung in Containern verpacken und sie mithilfe von Kubernetes oder einer anderen Orchestrierungsplattform bereitstellen, um hohen Datenverkehr und verteilte Verarbeitung zu bewältigen.
6. Sicherheit, Leistung und Best Practices
Beim Einsatz eines KI-gesteuerten Systems wie DeepResearch sind einige zusätzliche Überlegungen zu beachten:
API Key Management:
Stellen Sie sicher, dass Ihre API-Schlüssel (für Gemini, Jina und Brave) sicher gespeichert und niemals in Ihrem Quellcode fest codiert werden. Umgebungsvariablen und sichere Tresore werden empfohlen.
Rate Limiting:
Die eingebaute sleep-Funktion hilft, Ratenbegrenzungen zu vermeiden, indem aufeinanderfolgende Anfragen verzögert werden. Erwägen Sie jedoch, zusätzliche Ratenbegrenzungsmechanismen auf Server- oder API-Gateway-Ebene zu implementieren.
Data Validation:
Überprüfen Sie Eingabeabfragen und -antworten streng. Das im Agenten definierte JSON-Schema hilft, aber Sie sollten auch eingehende HTTP-Anfragen validieren, um böswillige Eingaben zu verhindern.
Error Handling:
Eine robuste Fehlerbehandlung (wie im Servercode und in test-duck.ts zu sehen) ist entscheidend. Dies stellt sicher, dass unerwartete API-Fehler oder fehlerhafte Antworten das System nicht zum Absturz bringen.
Resource Monitoring:
Das Verfolgen der Token-Nutzung ist unerlässlich. Die Klassen TokenTracker und ActionTracker geben Einblicke in den Ressourcenverbrauch. Die Überwachung dieser Metriken kann dazu beitragen, die Leistung des Systems zu optimieren und eine übermäßige Nutzung zu vermeiden.
7. Fazit
Das DeepResearch-Projekt von Jina AI veranschaulicht, wie komplexe, iterative Forschungsprozesse mit Open-Source-Tools erstellt werden können. Durch die Integration von Suchmaschinen, generativen KI-Modellen und intelligenten Argumentationsschleifen verfeinert das System seine Antwort kontinuierlich, bis es sicher ist – oder bis die Ressourcenlimits erreicht sind.
In diesem Artikel haben wir untersucht, wie man OpenAI Deep Research mit einem Open-Source-Ansatz nachbilden kann:
- Wir haben die Installationsschritte und die Umgebungseinrichtung besprochen.
- Wir haben die Kernmodule aufgeschlüsselt, von der iterativen Agentenlogik in
agent.tsbis zur Konfiguration, der Webserver-API und den Typdefinitionen. - Wir haben den Echtzeit-Feedback-Mechanismus untersucht, der Fortschrittsaktualisierungen streamt und Transparenz in den Argumentationsprozess bietet.
- Schließlich haben wir uns potenzielle Erweiterungen, Anpassungsoptionen und Best Practices für den Einsatz eines solchen Systems angesehen.
Indem diese fortschrittlichen Forschungstechniken als Open Source verfügbar gemacht werden, demokratisieren Projekte wie DeepResearch den Zugang zu modernsten KI-Methoden. Egal, ob Sie Forscher, Entwickler oder Unternehmen sind, die Deep-Research-Funktionen in Ihre Workflows integrieren möchten, dieses Projekt dient sowohl als Inspiration als auch als praktische Grundlage für den Aufbau Ihrer eigenen Lösung.
Das iterative Design – die Kombination von Suchen, Lesen, Reflektieren und Antworten in einer kontinuierlichen Schleife – stellt sicher, dass selbst mehrdeutige oder komplexe Abfragen mit mehreren Ebenen der Prüfung behandelt werden. Und mit einer detaillierten Architektur, die die Token-Nutzung verfolgt und Live-Feedback liefert, erhalten Sie tiefe Einblicke in den Argumentationsprozess hinter jeder Antwort.
Wenn Sie gerne experimentieren, klonen Sie das Repository, richten Sie Ihre Umgebung wie beschrieben ein und führen Sie Abfragen aus, die von einfacher Arithmetik bis hin zu facettenreichen Forschungsfragen reichen. Mit ein wenig Anpassung können Sie das System an neue Domänen anpassen und sogar seine Argumentationsfähigkeiten verbessern. Open-Source-Projekte wie dieses ebnen den Weg für gemeinschaftsgetriebene Innovationen in der KI-Forschung.
Indem Sie dieser detaillierten Aufschlüsselung und Analyse folgen, können Sie die Ideen hinter OpenAI’s Deep Research auf vollständig Open-Source-Weise nachbilden und erweitern. Egal, ob Sie auf der bestehenden Codebasis aufbauen oder ähnliche Methoden in Ihre Projekte integrieren möchten, die Roadmap ist klar: iterieren, verfeinern und die Grenzen der automatisierten Forschung verschieben.



