46 Depo Arasında Tek Bir Bilgi Grafiği Oluşturmak

Ben Ryan, airCloset CTO'su.

code-graph'ı oluşturmak için üç ay harcadım. Bu, birden fazla servis genelindeki 46 depoyu birleştiren tek bir bilgi grafiğidir.

Birçok kişi tüm kodunuzu bir yapay zekaya verip soru sorabileceğinizi düşünür. Bu iki nedenden dolayı başarısız olur:

  • Bağlam pencereleri (Context windows): 46 depodan gelen yılların kodunu tek bir isteme (prompt) sığdıramazsınız.
  • Halüsinasyon: Yapay zeka, ilişkileri çıkarsamaya çalışırken hatalar yapar. Bağlantıları gözden kaçırır.

Bunu çözmek için bir doğruluk kaynağı (source of truth) oluşturmak amacıyla statik analiz kullandım.

Zorluk: Sınırları Aşmak

Büyük bir kod tabanı karmaşıktır. Bir API, beş farklı depo tarafından çağrılıyor olabilir. Bir veritabanı tablosu, üç farklı servis tarafından kullanılıyor olabilir.

Sadece tek bir depoya bakarsanız, resmin tamamını kaçırırsınız. Bu tehlikelidir. Kodu değiştirip gerçek etki alanını (blast radius) görmezseniz, sistemi bozarsınız.

Yaklaşımım, kodu sözdizimi ağaçlarına (syntax trees) ayrıştırmak için tree-sitter kullanıyor. Ancak tree-sitter tek başına depo sınırlarının ötesini göremez.

Bunu çözmek için sınır düğümleri (boundary nodes) oluşturdum.

Nasıl çalışır:

  • tree-sitter kullanarak bir depo içindeki ilişkileri çıkarıyoruz.
  • Tipleri ve değişkenleri çözümlemek için TypeScript Compiler API kullanıyoruz.
  • Araçların kaçırdığı dinamik durumları yönetmek için Gemini kullanıyoruz.

Yapay zekadan tahmin etmesini istemek yerine ona gerçekleri veriyoruz. Ona şunu söylüyoruz: "Bu API aynı zamanda Repo X'ten de çağrılıyor." Bu, halüsinasyonları önler.

Zor Kısım: Framework Karmaşası

Asıl mücadele bu sınırları tespit etmekti. Her framework sınırları farklı şekilde yazar.

Bir ekip NestJS dekoratörlerini kullanıyor. Bir diğeri Express rotalarını kullanıyor. Bir başkası ise ham jQuery kullanıyor. Her biri kodda farklı bir yapı oluşturuyor.

Bunu çalışır hale getirmek için şunlar için özel ayrıştırıcılar (parsers) oluşturmamız gerekti:

  • NestJS ve TypeORM
  • Express ve Fastify
  • AngularJS ve Redux
  • Çeşitli path-alias şemaları

%99 doğruluk hedeflememiz gerekiyordu. Bağlantı oranımız sadece %90 olursa, yapay zeka bağlantıların %10'unu kaçırır. Bir üretim (production) sisteminde, hatalar işte o %10'luk kısımda gizlenir.

Artık günlük bir kontrol çalıştırıyoruz. Bağlantı oranımız %5'ten fazla düşerse bir uyarı alıyoruz. Bu, yeni kod kalıplarının ayrıştırıcılarımızı bozduğu durumları yakalamamızı sağlıyor.

Mevcut Sınırlamalar

Grafik mükemmel değil.

  • Arama yapmak zor. Aramaya başlamak için genellikle bir fonksiyon adını bilmeniz gerekir.
  • Düğüm patlaması (Node explosion). Bir yolu takip etmek, binlerce küçük ve işe yaramaz yardımcı fonksiyonu içeri çekebilir.
  • Bakım. Teknoloji yığınımıza (stack) her yeni framework girdiğinde, yeni bir ayrıştırıcı yazmamız gerekiyor.

Bu 1. Bölüm. 2. Bölümde, bu boşlukları gidermek için oluşturduğum servis-ürün-grafiği (SPG) katmanını tartışacağım.

Source: https://dev.to/ryantsuji/building-one-knowledge-graph-across-46-repositories-with-static-analysis-part-1-egm

Optional learning community: https://t.me/GyaanSetuAi