Spring AI ile OpenAI Entegrasyonu
Spring AI, yapay zeka uygulamaları geliştirirken Spring ekosisteminin taşınabilirlik ve modüler tasarım ilkelerini AI alanına uygular. Java objeleri kullanarak AI uygulamaları geliştirmeye yardım eder.
Temel Özellikler ve Yetenekler
1. Taşınabilir API Desteği:
- Model Türleri: Chat, text-to-image, embedding.
- Senkron ve akış API seçenekleri.
- Model sağlayıcıları: OpenAI, Microsoft, Amazon, Google, Hugging Face, Anthropic, AI21 Labs, Meta, Azure Open AI, PaLM2, Gemini, Groq, MistralAI, MiniMax, Moonshot AI, Ollama, QianFan, ZhiPu AI, Watsonx.AI.
2. Vector Store API:
- Veritabanları: Azure AI Service, Apache Cassandra, Chroma, Elasticsearch, GemFire, Milvus, MongoDB Atlas, Neo4j, OpenSearch, Oracle, PGvector, Pinecone, Qdrant, Redis, SAP Hana, Typesense, Weaviate.
- SQL-benzeri metadata filtreleme API’si.
3. Spring Boot Entegrasyonu:
- AI modelleri ve vektör depoları için otomatik yapılandırma ve başlatıcılar.
4. ETL Çerçevesi:
- Belge aktarımı ve veri mühendisliği için.
- Çeşitli formatlarda belgeleri okuma (PDF, JSON vb.).
- Veri manipülasyonu ve vektör veritabanında depolama.
Desteklenen Modeller ve Sağlayıcılar
Chat Modelleri:
- Amazon Bedrock, Anthropic, Cohere’s Command, AI21 Labs’ Jurassic-2, Meta’s LLama, Amazon’s Titan, Anthropic Claud, Azure Open AI, Google Vertex AI, PaLM2, Gemini, Groq, HuggingFace, MistralAI, MiniMax, Moonshot AI, Ollama, OpenAI, QianFan, ZhiPu AI, Watsonx.AI.
Text-to-Image Modelleri:
- OpenAI (DALL-E), StabilityAI.
Embedding Modelleri:
- Azure OpenAI, Amazon Bedrock, Cohere, Titan, Mistral AI, MiniMax, Ollama, (ONNX) Transformers, OpenAI, PostgresML, QianFan, VertexAI, ZhiPu AI.
Prompt Yazarken Neye Dikkat Edilmeli
1. Açıklık ve Netlik
- Belirsizlikten Kaçının: Ne istediğinizi net bir şekilde belirtin. Belirsiz ifadelerden kaçının.
- Net Sorular: Sorularınızı açık ve doğrudan bir şekilde sorun.
2. Bağlam ve Detaylar
- Bağlam Sağlayın: Sorunuzun veya isteğinizin bağlamını verin. Bu, daha iyi ve bağlamsal olarak doğru yanıtlar alınmasını sağlar.
- Özellikler ve Kriterler: Yanıtın belirli bir şekilde formatlanması veya belirli kriterlere uyması gerekiyorsa, bunu açıkça belirtin.
3. Örnekler ve Beklentiler
- Örnek Verin: Mümkünse, nasıl bir yanıt beklediğinize dair örnekler verin.
- Beklentilerinizi Belirtin: Yanıtın uzunluğu, detayı veya belirli bir formatta olması gibi beklentilerinizi belirtin.
4. Konu ve Amacı Belirtin
- Konu Başlığı: Konu hakkında bilgi verin, böylece model konuyla ilgili bilgilerini daha iyi kullanabilir.
- Amaç: Yanıtın ne amaçla kullanılacağını belirtin. Örneğin, bir makale yazıyorsanız veya bir kod örneği istiyorsanız bunu belirtmek faydalı olur.
Örnekler
- Kod Örneği İsteği:
- Kötü Prompt: “Bana Java kodu ver.”
- İyi Prompt: “Bir Java programı yazmak istiyorum. Kullanıcıdan bir sayı alıp, bu sayının faktöriyelini hesaplayan bir fonksiyon yazabilir misin? Lütfen kodu açıklamalarıyla birlikte ver.”
- Makale Yazımı:
- Kötü Prompt: “Bana bir makale yaz.”
- İyi Prompt: “Yapay zeka ve sağlık alanındaki uygulamaları hakkında bir makale yazabilir misin? Özellikle yapay zekanın hastalık teşhisi ve tedavisindeki rolüne odaklan. Makale 1000 kelime civarında olsun ve güncel araştırma sonuçlarına yer versin.”
- Bilgi Talebi:
- Kötü Prompt: “Vektör veritabanı nedir?”
- İyi Prompt: “Vektör veritabanlarının ne olduğunu ve nasıl çalıştığını açıklar mısın? Özellikle makine öğrenimi ve yapay zeka uygulamalarındaki kullanımına değinir misin?”
Dikkat Edilmesi Gereken Diğer Noktalar
- Nazik ve Saygılı Olmak: Her zaman nazik ve saygılı bir dil kullanmak.
- Daha Fazla Bilgi Gerektiğinde: Eğer sorunuzun yanıtı daha fazla bilgi gerektiriyorsa, bu bilgileri isteyin veya mevcut bilgilerinizi paylaşın.
- Tekrarlardan Kaçınmak: Aynı bilgiyi tekrarlamaktan kaçının, gereksiz detaylarla soruyu karıştırmayın.
Lets Code
Spring AI bir web uygulaması yazacağız. Bir sipariş oluşturup, sipariş geçmişine göre bize ürün önermesini isteyeceğim ve yine aldığım ürünlere göre benim nasıl bir yazılımcıya benzediğimi
gösteren bir resim yapmasını isteyeceğim.
pom.xml
1 2 3 4 5 6 7 8 |
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency> |
Sadece OpenAI ile nasıl bağlantı kuracağımızdan bahsediyor olacağım. Bütün detayları yazının sonundaki github linkte bulabilirsiniz.
Öneri Servisi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import com.bilisimio.aidemo.order.Order; import com.bilisimio.aidemo.order.OrderRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.openai.OpenAiChatModel; import org.springframework.stereotype.Service; import java.util.List; import java.util.stream.Collectors; @Service @RequiredArgsConstructor @Slf4j public class RecommendationService { private final OrderRepository orderRepository; private final OpenAiChatModel openAiChatModel; public String recommend() { List<Order> orders = orderRepository.findAll(); String orderHistory = orders.stream() .map(Order::getProductName) .collect(Collectors.joining(", ")); String prompt = "I'm a software engineer. Based on my following order history: " + orderHistory + ", can you suggest 10 new products that I might like and explain why you recommend each of them? " + "Please consider my preferences and previous purchases. Reply in Turkish"; String response = openAiChatModel.call(prompt); log.info(response); return response; } } |
OpenAIChatModel objesini kullanmak için sadece yapmanız gereken OpenAI API Key oluşturmak. Aşağıdaki gibi bir tanım yapmanız yeterli.
1 2 3 4 5 |
spring.ai.openai.api-key=#your-openai-api-key |
Burada önemli olan doğru promt girebilmek. Bunun için yukarıdaki maddelere dikkate etmelisiniz.
Prompt hazırladıktan sonra tek yapmanız gereken call methodunu çağırmak. Karşılığında ise aşağıdaki gibi bir cevabı alıyor olacağız.
Response
1 2 3 4 5 6 7 8 9 10 11 |
Elbette, satın alma geçmişinize bakarak, aşağıdaki ürünlerin ilginizi çekebileceğini düşünüyorum. İşte önerilerim: 1. **Apple Magic Keyboard**: MacBook Pro 13 M2 Pro ile uyumlu ve rahat yazı yazma deneyimi sunar. Ayrıca, taşınabilirliği ile de ofis dışında çalışırken işinizi kolaylaştırır. 2. **Apple Magic Trackpad 2**: MacBook Pro'nuz ile mükemmel uyum sağlar ve trackpad kullanmayı sevenler için geniş bir yüzey sunar. Logitech MX Master 3S'in yanında kullanmak hoşunuza gidebilir. 3. **Dell UltraSharp U2720Q 27" 4K USB-C Monitör**: MacBook Pro’nuzun ekranını genişletmek için ideal. 4K çözünürlük ve USB-C bağlantısı ile yüksek kaliteli görüntü ve kolay bağlantı sağlar. |
Resim Servisi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
@Service @RequiredArgsConstructor @Slf4j public class ImageGenerationService { private final OpenAiImageModel openAiImageModel; private final OrderRepository orderRepository; public String generate() { List<Order> orders = orderRepository.findAll(); String orderHistory = orders.stream().map(Order::getProductName).collect(Collectors.joining(", ")); String promptWhoAmI = "I'm a software engineer."; String promptWhatIWear = "and i wear always basic t-shirt and sunglasses or eyeglasses."; String promptWhatIUse = " Based on my following order history: " + orderHistory; String promptWhatIWant = " Can you draw me"; ImagePrompt imagePrompt = new ImagePrompt(List.of(new ImageMessage(promptWhoAmI), new ImageMessage(promptWhatIWear), new ImageMessage(promptWhatIUse), new ImageMessage(promptWhatIWant))); ImageResponse response = openAiImageModel.call(imagePrompt); log.info(response.getMetadata().toString()); return response.getResult().getOutput().getUrl(); } } |
Aşağıdaki yazılımcı size benziyor mu? 🙂
Bütün kodlara aşağıdaki linkten ulaşabilirsiniz.
https://github.com/cemdrman/spring-ai-demo
- https://bilisim.io/2023/07/03/vektor-veritabanlari-vector-databases/
- https://bilisim.io/2024/07/15/yapay-zekaya-giris/
Faydalı olması dileğiyle.