Yapay zekâ alanındaki derin araştırma, tek bir monolitik model değildir; daha ziyade, bir cevap bulunana kadar arama, okuma ve akıl yürütmeyi içeren, yinelemeli bir iş akışıdır. ChatGPT veya GPT-4'e güç verenler gibi OpenAI'nin tescilli sistemleri, yanıtları sürekli olarak iyileştiren karmaşık boru hatları kullanır. Şimdi, açık kaynaklı araçları kullanarak benzer bir sistem oluşturabildiğinizi hayal edin. Bu makale, jina-ai/node-DeepResearch projesini kullanarak bir Derin Araştırma sisteminin nasıl yeniden oluşturulacağını açıklamaktadır. Kodu parçalayacak, her bir bileşeni detaylandıracak ve sistemi nasıl kurup genişleteceğinizi göstereceğiz.
1. Genel Bakış ve Amaç
DeepResearch, basit ama güçlü bir fikir üzerine kurulmuştur:
Cevabı bulana kadar (veya token bütçesini aşana kadar) web sayfalarını aramaya ve okumaya devam edin.
Sistem bir sorgu alır (örneğin, “kim daha büyük? cohere, jina ai, voyage?”) ve bir döngüye girer. Her adımda, aracı (akıllı bir modül) bir eyleme karar verir. Yeni anahtar kelimeler arayabilir, URL'lerin içeriğini okuyabilir, takip soruları üreterek düşünebilir veya eminse bir cevap sağlayabilir. Bu yinelemeli döngü, cevap kesinleşene veya token bütçesi (hesaplama kaynakları için bir vekil) aşılana kadar devam eder.
Kurulum ve Ayarlama
Koda dalmadan önce, gerekli bağımlılıkları yüklemeniz ve API anahtarlarınızı ayarlamanız gerekir. Proje, dil modellemesi için Gemini'yi, web araması için Brave veya DuckDuckGo'yu ve web sayfası içeriğini getirmek için Jina Reader'ı kullanır. İşte projeyi nasıl kuracağınız:
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
README, sistemi farklı sorgularla çalıştırmak için örnekler bile sağlar:
- Basit Sorgu:
npm run dev "1+1="
veyanpm run dev "what is the capital of France?"
- Çok Adımlı Sorgu:
npm run dev "what is the latest news from Jina AI?"
npm run dev "what is the twitter account of jina ai's founder"
- Belirsiz, Araştırma Benzeri Sorgu:
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?"
Proje, bir komut satırı arayüzüne ek olarak, sorgu göndermek ve ilerleme güncellemelerini yayınlamak için uç noktalar sunan bir web sunucusu API'si de içerir.
2. Mimari ve Temel Bileşenler
Sistemin ana bileşenlerini, temel dosyaları inceleyerek parçalayalım:
2.1 agent.ts – Temel Mantık
agent.ts
dosyası, sistemin kalbidir. "Derin araştırma" döngüsünün mantığını uygular: istemler oluşturma, eylemlere karar verme ve arama, okuma, düşünme ve cevap adımlarından geçme.
agent.ts'deki Temel Öğeler:
İçe Aktarmalar ve Kurulum:
Dosya, çeşitli araçları ve kitaplıkları içe aktararak başlar:
- GoogleGenerativeAI dil üretimi için kullanılır.
./tools/read
'den readUrl, web sayfası içeriğini getirir ve işler.- duckSearch ve braveSearch harici arama yetenekleri sağlar.
- rewriteQuery, dedupQueries, evaluateAnswer ve analyzeSteps gibi yardımcı işlevler, sorguları iyileştirmeye ve yanıtları değerlendirmeye yardımcı olur.
- Yapılandırma değerleri (API anahtarları, token bütçeleri ve model yapılandırmaları)
config.ts
'den içe aktarılır. - Token ve Eylem İzleyici yardımcıları, token kullanımını ve aracının ilerlemesinin durumunu izler.
- Son olarak, dosya
types.ts
'de tanımlanan türleri (örneğin,StepAction
,ResponseSchema
) içe aktarır.
Uyku İşlevi:
async function sleep(ms: number) {
const seconds = Math.ceil(ms / 1000);
console.log(`Waiting ${seconds}s...`);
return new Promise(resolve => setTimeout(resolve, ms));
}
Bu yardımcı işlev, işlemleri geciktirmek için kullanılır; harici API'leri çağırırken hız sınırlamasından kaçınmak için kullanışlıdır.
Şema Oluşturma:
getSchema
işlevi, aracının yanıtı için JSON şemasını tanımlar. Aşağıdakiler için özellikler içeren bir şema dinamik olarak oluşturur:
- search: Anahtar kelime tabanlı bir
searchQuery
gerektirir. - answer: Nihai bir cevabın doğal dil metni ve destekleyici referanslar (kesin alıntılar ve URL'ler) içermesi gerektiğini belirtir.
- reflect: Bilgi boşluklarını doldurmak için açıklayıcı alt soruları listeler.
- visit: Harici içerikleri okumak için URL hedeflerini içerir.
Katı bir JSON şeması uygulayarak, aracın çıktısı tutarlı ve makine tarafından okunabilir kalır.
İstem Oluşturma:
getPrompt
işlevi, dil modeline gönderilen ayrıntılı bir istem oluşturur. Birkaç bölümü toplar:
- Başlık: Geçerli tarihi ve orijinal soruyu içerir.
- Bağlam ve Bilgi: Önceki eylemler ve toplanan ara bilgiler dahil edilir.
- Başarısız Denemeler: Önceki eylemler kesin bir sonuç vermezse, bu başarısızlıklar (nedenleri ve iyileştirmeleri ile birlikte) kaydedilir.
- Eylemler: Olası eylemlerin bir listesi gösterilir. Bayraklara (
allowSearch
,allowRead
, vb. gibi) bağlı olarak, izin verilen işlemleri numaralandırır. "Canavar Modu"nda, talimatlar aracı, belirsizlik devam etse bile bir cevap üretmek için elinden gelenin en iyisini yapmaya teşvik eder.
Bu katmanlı istem, üretken yapay zeka modelini adım adım "düşünmeye" ve bir seferde bir eylem seçmeye yönlendirir.
getResponse'daki Ana Döngü:
getResponse
işlevi, aracın yinelemeli döngüsünün çekirdeğidir. İlk bağlamı ayarlar:
- İzleyiciler: İki izleyici kullanılır; kullanılan token sayısını izlemek (sistemin bütçesini aşmasını önlemek) için bir TokenTracker ve her adımı ve sonuçlarını izlemek için bir ActionTracker.
- Boşluklar ve Bilgi: Bir "boşluk" (orijinal soru) ile başlar ve sistem akıl yürütmesi üzerinde düşünmesi gerekiyorsa ara sorular ekler.
Bir while döngüsünün içinde, aracı:
- API hız sınırlarından kaçınmak için bekler (uyku işlevini kullanarak).
- Geçerli bağlama göre bir istem oluşturur.
- Bir yanıt üretmek için üretken modeli (GoogleGenerativeAI aracılığıyla) çağırır.
- Hangi eylemin (cevap, düşün, ara veya ziyaret et) yapıldığını belirlemek için JSON yanıtını ayrıştırır.
- Eyleme bağlı olarak:
- Cevap: Cevabı değerlendirir ve kesinse döngüyü sonlandırır.
- Düşün: Bilgi boşluklarını doldurmak için alt soruları işler.
- Ara: Arama sorgusunu yeniden yazar, daha önce kullanılan anahtar kelimeleri yineler ve DuckDuckGo veya Brave'den yeni URL'ler alır.
- Ziyaret Et: Sağlanan URL'lerden içeriği okur ve bilgi tabanını günceller.
Döngü bütçeden taşarsa veya çok fazla kötü deneme olursa, sistem "Canavar Modu"na girer; burada, cevap vermek için son, agresif bir girişimde bulunulur.
Bağlam Depolama:
storeContext
işlevi, geçerli istemi ve çeşitli bellek durumlarını (bağlam, sorgular, sorular ve toplanan bilgiler) dosyalara yazar. Bu arşivleme süreci, hata ayıklamaya yardımcı olur ve karar verme sürecinin daha fazla analiz edilmesini sağlar.
Son Yürütme:
agent.ts
'nin sonundaki main()
işlevi, komut satırı argümanını (sorgu) kullanır, getResponse
'ı çağırır ve son cevabı token kullanımının bir özetiyle birlikte yazdırır.
2.2 config.ts – Ortamı Yapılandırma
config.ts
dosyası, ortam ve model yapılandırmalarının tanımlandığı yerdir:
- Ortam Değişkenleri:
dotenv
kullanılarak, Gemini, Jina ve Brave için API anahtarları yüklenir. Ayrıca bir HTTPS proxy'sinin yapılandırılmasını da destekler. - Arama Sağlayıcısı: Sistem, Brave API anahtarının sağlanıp sağlanmadığına bağlı olarak arama sağlayıcısını dinamik olarak seçer; aksi takdirde, varsayılan olarak DuckDuckGo'ya döner.
- Model Yapılandırmaları: Dosya, sorgu yeniden yazma, yinelenenleri kaldırma ve değerlendirme gibi çeşitli görevler için varsayılan ve özel model yapılandırmaları ayarlar. Örneğin, aracın üretken modeli, yaratıcılık ve determinizm arasında denge kurmak için 0,7 sıcaklıkla yapılandırılmıştır.
- Token Bütçesi ve Gecikme: Sabit
STEP_SLEEP
, adımlar arasında bir saniyelik bir duraklama sağlayarak 1000 milisaniyeye ayarlanmıştır.
Bu yapılandırma dosyası, ayarları değiştirmeyi ve sistemi farklı ortamlara veya model davranışlarına uyarlamayı kolaylaştırır.
2.3 server.ts – Web Sunucusu API'si
Kullanıcıların HTTP istekleri aracılığıyla DeepResearch ile etkileşim kurmasına izin vermek için, sistem server.ts
'de basit bir Express tabanlı sunucu içerir. Bu dosya, sorgu gönderimlerini işleyen ve ilerleme güncellemelerini gerçek zamanlı olarak yayınlayan uç noktalar ayarlar.
server.ts'deki Temel Noktalar:
Express Kurulumu:
Sunucu, çapraz kökenli istekleri desteklemek için Express ve CORS kullanır. 3000 numaralı bağlantı noktasını (veya ortamda belirtilen bir bağlantı noktasını) dinler.
Sorgu Uç Noktası (POST /api/v1/query
):
- İstemciler, sorguyu, token bütçesini ve izin verilen maksimum kötü deneme sayısını içeren bir JSON yükü gönderir.
- Sunucu, yeni bir izleyici (token kullanımı ve eylem durumu için) oluşturur ve benzersiz bir
requestId
atar. - İstek,
getResponse
çağrılarak zaman uyumsuz olarak işlenir. - Tamamlandığında, son cevap depolanır ve ilerleme bir
EventEmitter
kullanılarak yayınlanır.
Akış Uç Noktası (GET /api/v1/stream/:requestId
):
- Bu uç nokta, istemciye sürekli olarak güncellemeler geri göndermek için Sunucu Tarafından Gönderilen Olayları (SSE) kullanır.
- Aracı eylemler (ara, düşün, ziyaret et, cevap ver) gerçekleştirdikçe, ilerleme olayları yayınlanır. Her olay, geçerli adım bilgilerini, token kullanımını ve eylem ayrıntılarını içerir.
- Bu, istemcilerin araştırma sürecini gerçek zamanlı olarak izlemesini sağlar.
Görev Depolama ve Alma:
Sunucu, görev sonuçlarını dosya sistemine (tasks
dizini altında) yazar ve depolanmış bir sonucu almak için bir uç nokta (GET /api/v1/task/:requestId
) sağlar.
Bu web sunucusu bileşeni, araştırma aracını HTTP üzerinden erişilebilir hale getirerek hem etkileşimli deneyleri hem de daha büyük sistemlere entegrasyonu sağlar.
2.4 test-duck.ts – Arama Test Etmek İçin Bir Yardımcı Program
test-duck.ts
dosyası, bir test olarak harici bir API'ye (bu durumda, jsonplaceholder.typicode.com
) bir HTTP GET isteği göndermek için Axios kullanan bağımsız bir komut dosyasıdır. Birincil işlevi, HTTP isteklerinin (uygun başlıkların ayarlanması ve hataların işlenmesi dahil) doğru şekilde çalıştığını doğrulamak olsa da, sistem içinde harici isteklerin nasıl işlendiğine dair bir örnek olarak hizmet eder. Daha karmaşık bir kurulumda, DuckDuckGo veya Brave gibi arama API'lerini sorgularken benzer desenler kullanılır.
2.5 types.ts – Tutarlı Veri Yapılarını Tanımlama
types.ts
dosyası, proje genelinde kullanılan tüm özel türleri tanımlar:
Eylem Türleri:
Bunlar, aracın gerçekleştirebileceği çeşitli eylemleri içerir:
- SearchAction: Bir
searchQuery
dizesi içerir. - AnswerAction: Bir
answer
dizesi ve destekleyicireferences
gerektirir. - ReflectAction: Bir
questionsToAnswer
dizisi içerir. - VisitAction: Bir
URLTargets
listesi içerir.
Yanıt Türleri:
Dosya, arama sonuçları, URL okuma, değerlendirme, hata analizi ve daha fazlası için yapılandırılmış yanıtlar tanımlar. Bu, tutarlılığın korunmasına yardımcı olur ve her modülün verileri aynı şekilde yorumlamasını sağlar.
Şema Türleri:
JSON şema tanımları, dil modeli tarafından üretilen yanıtların beklenen biçime sıkı sıkıya bağlı kalmasını sağlar. Bu, sonraki işlem için çok önemlidir.
İzleyici Bağlamı:
Token ve eylem izleyiciler için özel türler de tanımlanır; bunlar, konuşmanın ve araştırma sürecinin durumunu izlemek için kullanılır.
3. Yinelemeli Derin Araştırma Süreci
Genel sistem, bir insan araştırmacının nasıl çalışabileceğini taklit eden metodik, yinelemeli bir süreç izler:
Başlatma:
Süreç, orijinal soruyla başlar ve bu soru bir "boşluklar" listesine (yani, doldurulması gereken bilinmeyenler) eklenir.
İstem Oluşturma:
Aracı, geçerli soruyu, önceki bağlamı, toplanan bilgileri ve hatta başarısız denemeleri kullanarak bir istem oluşturur. Bu istem daha sonra üretken yapay zeka modeline gönderilir.
Eylem Seçimi:
Modelin çıktısına bağlı olarak, aracı birkaç eylemden birini seçer:
- Ara: Daha fazla veri toplamak için yeni bir sorgu oluşturun.
- Ziyaret Et: Belirli bir URL'den ayrıntılı içerik alın.
- Düşün: Herhangi bir bilgi boşluğunu gidermek için açıklayıcı alt sorular oluşturun.
- Cevap: Bilgilerin kesin olduğu kabul edilirse nihai bir cevap sağlayın.
Bağlam Güncellemesi:
Her adım, dahili izleyicileri (token kullanımı ve eylem durumu) günceller ve geçerli durumu dosyalara arşivler. Bu, şeffaflığı sağlar ve hata ayıklamaya veya daha sonra incelemeye olanak tanır.
Değerlendirme ve Döngü:
Bir cevap önerildiğinde, bir değerlendirme adımı bunun kesin olup olmadığını kontrol eder. Değilse, sistem başarısız deneme ayrıntılarını depolar ve stratejisini ayarlar. Döngü, tatmin edici bir cevap bulunana veya token bütçesi tükenene kadar devam eder.
Canavar Modu:
Normal adımlar, kısıtlamalar dahilinde kesin bir cevap vermezse, sistem "Canavar Modu"na girer. Bu modda, üretken yapay zeka, bir tahminde bulunmak anlamına gelse bile, birikmiş bağlama dayanarak bir cevap üretmeye zorlanır.
4. Gerçek Zamanlı İlerleme ve Geri Bildirim
DeepResearch sisteminin ayrılmaz bir özelliği, gerçek zamanlı geri bildirim mekanizmasıdır. Web sunucusunun akış uç noktası aracılığıyla:
- İstemciler, hangi eylemin yapıldığını, token kullanım istatistiklerini ve eylem izleyicisinin geçerli durumunu ayrıntılandıran ilerleme güncellemeleri alır.
- README örneklerinde gösterildiği gibi, ilerleme olayları hem aracın düşünce sürecini hem de geçerli adım ve token dökümü gibi ayrıntıları içerir.
- Bu canlı geri bildirim döngüsü, hata ayıklama, kaynak kullanımını izleme ve sistemin nasıl akıl yürüttüğünü anlama açısından paha biçilmezdir.
Örneğin, bir ilerleme olayı şöyle görünebilir:
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": []
}
}
Bu ayrıntılı ilerleme raporlaması, geliştiricilerin aracın akıl yürütmesinin zaman içinde nasıl geliştiğini görmesini sağlar ve hem başarılar hem de iyileştirme gerektiren alanlar hakkında içgörüler sağlar.
5. DeepResearch'ü Genişletme ve Özelleştirme
Bu projenin açık kaynaklı doğası, sistemi ihtiyaçlarınız için uyarlayabileceğiniz anlamına gelir. İşte DeepResearch'ü genişletmek için bazı fikirler:
Özel Arama Sağlayıcıları:
Ek arama sağlayıcılarını entegre edebilir veya etki alanına özgü aramalar için sorgu yeniden yazma sürecini özelleştirebilirsiniz.
Gelişmiş Okuma Modülleri:
Daha ayrıntılı metin işleme gerektiriyorsanız, alternatif NLP modellerini entegre edebilir veya yeni içerik türlerini işlemek için Jina Reader bileşenini ayarlayabilirsiniz.
Geliştirilmiş Değerlendirme:
Değerlendirici modülü şu anda bir cevabın kesin olup olmadığını kontrol ediyor. Bunu, duygu analizi veya gerçek kontrol algoritmaları gibi daha nüanslı ölçümleri içerecek şekilde genişletebilirsiniz.
Kullanıcı Arayüzü:
Mevcut sistem, komut satırı arayüzünü ve olayları yayınlamak için basit bir web sunucusunu kullanırken, etkileşimli araştırma oturumları için tam teşekküllü bir web veya mobil arayüz oluşturabilirsiniz.
Ölçeklenebilirlik İyileştirmeleri:
Mevcut uygulama, tek düğümlü bir hizmet olarak çalışır. Üretim kullanımı için, yüksek trafik ve dağıtılmış işlemeyi yönetmek üzere uygulamayı kapsayıcı hale getirmeyi ve Kubernetes veya başka bir orkestrasyon platformu kullanarak dağıtmayı düşünün.
6. Güvenlik, Performans ve En İyi Uygulamalar
DeepResearch gibi yapay zeka destekli bir sistem dağıtırken, birkaç ek husus vardır:
API Anahtarı Yönetimi:
API anahtarlarınızın (Gemini, Jina ve Brave için) güvenli bir şekilde saklandığından ve kaynak kodunuzda asla sabit kodlanmadığından emin olun. Ortam değişkenleri ve güvenli kasalar önerilir.
Hız Sınırlaması:
Yerleşik sleep
işlevi, art arda gelen istekleri geciktirerek hız sınırlamasından kaçınmaya yardımcı olur. Ancak, sunucu veya API ağ geçidi düzeyinde ek hız sınırlama mekanizmaları uygulamayı düşünün.
Veri Doğrulama:
Girdi sorgularını ve yanıtları sıkı bir şekilde doğrulayın. Aracıda tanımlanan JSON şeması yardımcı olur, ancak ayrıca kötü niyetli girdileri önlemek için gelen HTTP isteklerini de doğrulamalısınız.
Hata İşleme:
Sağlam hata işleme (server kodu ve test-duck.ts'de görüldüğü gibi) kritik öneme sahiptir. Bu, beklenmedik API hatalarının veya hatalı biçimlendirilmiş yanıtların sistemi çökertmemesini sağlar.
Kaynak İzleme:
Token kullanımını izlemek esastır. TokenTracker ve ActionTracker sınıfları, kaynak tüketimi hakkında içgörüler sağlar. Bu ölçümleri izlemek, sistemin performansını ince ayarlamaya ve aşırı kullanımdan kaçınmaya yardımcı olabilir.
7. Sonuç
Jina AI tarafından yapılan DeepResearch projesi, açık kaynaklı araçlar kullanılarak karmaşık, yinelemeli araştırma süreçlerinin nasıl oluşturulabileceğini örneklendiriyor. Arama motorlarını, üretken yapay zeka modellerini ve akıllı akıl yürütme döngülerini entegre ederek, sistem kesinleşene kadar veya kaynak sınırlarına ulaşılana kadar cevabını sürekli olarak iyileştirir.
Bu makalede, OpenAI Derin Araştırmasını açık kaynaklı bir yaklaşımla nasıl yeniden oluşturacağımızı inceledik:
- Kurulum adımlarını ve ortam kurulumunu tartıştık.
agent.ts
'deki yinelemeli aracı mantığından yapılandırmaya, web sunucusu API'sine ve tür tanımlarına kadar temel modülleri parçaladık.- İlerleme güncellemelerini yayınlayan, akıl yürütme sürecine şeffaflık sağlayan gerçek zamanlı geri bildirim mekanizmasını inceledik.
- Son olarak, böyle bir sistemi dağıtmak için potansiyel uzantılara, özelleştirme seçeneklerine ve en iyi uygulamalara baktık.
Bu gelişmiş araştırma tekniklerini açık kaynak olarak kullanılabilir hale getirerek, DeepResearch gibi projeler, son teknoloji yapay zeka yöntemlerine erişimi demokratikleştirir. İster bir araştırmacı, ister bir geliştirici veya derin araştırma yeteneklerini iş akışlarınıza entegre etmek isteyen bir kuruluş olun, bu proje hem kendi çözümünüzü oluşturmak için bir ilham kaynağı hem de pratik bir temel görevi görür.
Yinelemeli tasarım (arama, okuma, düşünme ve cevaplamayı sürekli bir döngüde birleştirmek), belirsiz veya karmaşık sorguların bile çok katmanlı incelemeyle ele alınmasını sağlar. Ve token kullanımını izleyen ve canlı geri bildirim sağlayan ayrıntılı bir mimari ile, her cevabın arkasındaki akıl yürütme süreci hakkında derinlemesine bilgi edinirsiniz.
Deney yapmak istiyorsanız, depoyu klonlayın, ortamınızı açıklandığı gibi ayarlayın ve basit aritmetikten çok yönlü araştırma sorularına kadar değişen sorgular çalıştırın. Biraz özelleştirmeyle, sistemi yeni etki alanlarına uyarlayabilir ve hatta akıl yürütme yeteneklerini geliştirebilirsiniz. Bunun gibi açık kaynaklı projeler, yapay zeka araştırmalarında topluluk odaklı inovasyonun yolunu açıyor.
Bu ayrıntılı dökümü ve analizi izleyerek, OpenAI'nin Derin Araştırmasının arkasındaki fikirleri tamamen açık kaynaklı bir şekilde yeniden oluşturabilir ve genişletebilirsiniz. İster mevcut kod tabanını oluşturmak ister benzer yöntemleri projelerinize entegre etmek isteyin, yol haritası açıktır: yineleyin, iyileştirin ve otomatik araştırma sınırlarını zorlayın.