Türkçe ihale şartnameleri için PDF çıkarımı, yapay zekâ destekli risk analizi, kaynakla soru-cevap ve raporlama bileşenlerini birleştiren Streamlit prototipi.
Prototip
Python
Streamlit
OpenAI
Gemini
FAISS
SQLAlchemy
Docker
Kategori için özgün kod tabanlı illüstrasyon; ürün ekran görüntüsü değildir.
Genel bakış
TenderAI, uzun ihale belgelerini yapılandırılmış biçimde incelemeyi amaçlayan bir Streamlit uygulaması. PDF metin çıkarımı, OpenAI/Gemini adaptörleri, FAISS tabanlı retrieval, firma eşleştirme ve belge karşılaştırma bileşenleri içeriyor. Analiz kayıtları SQLAlchemy ile tutuluyor; rapor modülleri farklı çıktı biçimleri üretiyor. Ortaya çıkan bulgular karar destek taslaklarıdır; kaynak metnin ve hesapların insan tarafından kontrol edilmesi gerekir.
Problem ve amaç
İhale şartnameleri çok sayıda koşul, tarih, yeterlilik gereksinimi ve çapraz referans içeriyor. Birden fazla belgeyi karşılaştırmak veya belirli bir sorunun yanıtına ulaşmak için aynı metinler tekrar tekrar okunuyor. Otomatik özet ise kaynağından koparsa kritik şartları atlayabilir. Bu nedenle analiz, belge bağlamı, firma bilgisi ve inceleme çıktıları birlikte ele alınmalı.
Çalışmadaki rolüm
Belge analizi, retrieval ve kullanıcı arayüzü bileşenlerinin yazılım geliştirmesi.
Çözüm yaklaşımı
Uygulama PDF metnini çıkarıp analiz bileşenlerine aktarıyor; seçilen akışa göre OpenAI veya Gemini adaptörleri kullanılıyor. FAISS retrieval katmanı belge parçalarını soru-cevap için geri getiriyor. Firma eşleştirme ve karşılaştırma modülleri farklı inceleme ihtiyaçlarını aynı arayüzde topluyor. SQLAlchemy kullanıcı ve analiz kayıtlarını saklıyor; PDF, Excel ve DOCX rapor bileşenleri sonuçları dışarı taşıyor. Sentetik demo modu, gerçek doküman veya servis anahtarı kullanmadan arayüzü inceleme olanağı sağlıyor.
Uygulama ayrıntıları
01
Şartname yapısına göre retrieval
IhaleAnalizAI, metni varsayılan 1.500 karakterlik parçalara ve 200 karakter örtüşmeye ayırıyor. RecursiveCharacterTextSplitter, genel boşluk ayırıcılarından önce Madde, BÖLÜM ve Ek gibi şartname başlıklarını deniyor. OpenAI embedding’leriyle bellekte FAISS index kuruluyor; her analiz sorusu kendi en yakın parçalarını çekip ilgili prompt’a ekliyor. Örtüşme sınırda bölünen maddeler için bağlam taşıyor, fakat benzerlik araması bütün şartların bulunduğunu garanti etmiyor. Bu yol, tek bir genel özet yerine belirli inceleme sorularına odaklanan bir analiz yaklaşımı.
02
Altı inceleme adımı ve sonuç birleştirme
Ana analiz hattı risk, gerekli belgeler, ceza maddeleri, mali özet ve zaman çizelgesini sırayla çalıştırıyor; yönetici özeti bu önceki sonuçları da bağlam olarak alıyor. Sıralı yürütme rate-limit kaygısını görünür kılıyor, fakat bağımsız çağrıların toplam bekleme süresini ortadan kaldırmıyor. Yanıt ayrıştırıcısı düz JSON, fenced JSON ve sonda virgül temizleme yollarını deniyor; çözülemeyen yanıtta raw_response ve parse_error alanları bırakıyor. Bu yapı biçim hatasını saklamadan değerlendirmeyi sürdürmeye yarıyor; içerik doğruluğunun yerini almıyor.
03
Analiz retrieval’i ile sohbet bağlamının ayrımı
Chatbot bileşeni ana FAISS analiz yolundan farklı: yüklenen metni sınırlı bir context içinde tutuyor ve Gemini isteğine metnin ilk 20.000 karakteriyle son beş sohbet mesajını ekliyor. Bu nedenle uygulamadaki her soru-cevap akışını aynı retrieval mimarisi olarak anlatmak doğru olmaz. API anahtarı yoksa demo yoluna geçiliyor; kota ve servis hatalarında uyarılı demo yanıtı dönebiliyor. Bu ayrım, arayüzü incelemeyi kolaylaştırırken uzun belgenin sonundaki bilgilerin chatbot bağlamına girmeyebileceğini de açıkça gösteriyor.