1. Anasayfa
  2. Eğitimler

Yapay Zeka Ajanları Sıfırdan Uzmanlığa – Bölüm 3 Son

Yapay Zeka Ajanları Sıfırdan Uzmanlığa – Bölüm 3 Son
0

İleri Seviye Yapay Zeka Ajanları

İlk bölümde yapay zeka ajanlarının temel kavramlarını ve basit uygulamalarını incelemiştik. Bu üçüncü bölümde, daha ileri seviye yapay zeka ajanı konseptlerini, teknolojilerini ve uygulamalarını ele alacağız. Özellikle ajanların hafıza yönetimi, daha karmaşık görevlerin çözümü ve çoklu ajan sistemleri üzerinde duracağız.

Günümüzde yapay zeka ajanları, basit görevlerin ötesine geçerek birçok karmaşık sorunu ele alabilecek yeteneklere sahip. Bu bölümde, bu ileri yeteneklerin nasıl geliştirileceğini ve uygulanacağını adım adım inceleyeceğiz.

Gelişmiş Hafıza Sistemleri

İleri seviye ajanlar, basit bilgi depolamanın ötesinde, geçmiş deneyimlerinden öğrenebilen ve bu deneyimleri kullanabilen sistemlere ihtiyaç duyarlar. Bunun için farklı hafıza türleri geliştirilmiştir:

1. Kısa ve Uzun Süreli Hafıza

class AdvancedMemoryAgent:
    def __init__(self, name):
        self.name = name
        self.short_term_memory = []  # Kısa süreli hafıza
        self.long_term_memory = {}   # Uzun süreli hafıza
        self.stm_capacity = 5        # Kısa süreli hafıza kapasitesi
        
    def add_to_short_term_memory(self, item):
        """Kısa süreli hafızaya öğe ekle"""
        self.short_term_memory.append(item)
        # Kapasite aşıldığında en eski öğeyi çıkar
        if len(self.short_term_memory) > self.stm_capacity:
            removed_item = self.short_term_memory.pop(0)
            # Önemli bilgiyi uzun süreli hafızaya transfer et
            if self._is_important(removed_item):
                self._transfer_to_long_term_memory(removed_item)
    
    def _is_important(self, item):
        """Bir öğenin önemli olup olmadığını değerlendir"""
        # Gerçek uygulamada daha karmaşık bir mantık kullanılabilir
        # Örneğin, duygusal değer, tekrar sıklığı, ilişkili bilgi miktarı gibi
        return "önemli" in str(item).lower() or "kritik" in str(item).lower()
    
    def _transfer_to_long_term_memory(self, item):
        """Öğeyi uzun süreli hafızaya aktar"""
        # Basit bir kategorizasyon
        category = self._categorize(item)
        if category not in self.long_term_memory:
            self.long_term_memory[category] = []
        self.long_term_memory[category].append(item)
        print(f"{self.name}: '{item}' uzun süreli hafızaya aktarıldı.")
    
    def _categorize(self, item):
        """Öğeyi kategorize et"""
        # Basit bir kategorizasyon örneği
        if "kişi" in str(item).lower():
            return "kişiler"
        elif "yer" in str(item).lower():
            return "yerler"
        elif "tarih" in str(item).lower():
            return "tarihler"
        else:
            return "genel"
    
    def retrieve_from_long_term_memory(self, query):
        """Uzun süreli hafızadan ilgili bilgileri getir"""
        results = []
        
        # Basit bir arama mekanizması
        for category, items in self.long_term_memory.items():
            for item in items:
                if query.lower() in str(item).lower():
                    results.append((category, item))
        
        return results
    
    def think(self, query=None):
        """Mevcut durumu değerlendir ve kararlar al"""
        # Kısa süreli hafızadaki en güncel bilgilere öncelik ver
        context = self.short_term_memory.copy()
        
        # İlgili uzun süreli hafızadan bilgileri getir
        if query:
            ltm_results = self.retrieve_from_long_term_memory(query)
            context.extend([f"{cat}: {item}" for cat, item in ltm_results])
        
        # Gerçek bir uygulamada burada daha karmaşık bir çıkarım süreci olabilir
        if context:
            return f"Mevcut bağlam: {context}"
        else:
            return "Yeterli bilgi yok, daha fazla veri topla."

2. Vektör Tabanlı Hafıza

Modern ajanlar, semantik benzerliğe dayalı bilgi erişimi için vektör tabanlı hafıza kullanır. Bu, bilgilerin sayısal vektörler olarak temsil edilmesi ve benzerlik hesaplamasıyla erişilmesi anlamına gelir.

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

class VectorMemoryAgent(AdvancedMemoryAgent):
    def __init__(self, name, embedding_model):
        super().__init__(name)
        self.embedding_model = embedding_model  # Metin gömme modeli
        self.vector_memory = []  # (metin, vektör) çiftleri
    
    def add_to_vector_memory(self, text):
        """Metni vektör hafızasına ekle"""
        # Metinden vektör oluştur
        vector = self.embedding_model.encode(text)
        self.vector_memory.append((text, vector))
        print(f"{self.name}: '{text}' vektör hafızasına eklendi.")
    
    def query_vector_memory(self, query, top_k=3):
        """Sorguya en benzer metinleri bul"""
        if not self.vector_memory:
            return []
        
        # Sorgu vektörünü oluştur
        query_vector = self.embedding_model.encode(query)
        
        # Tüm vektörlerle benzerlik hesapla
        similarities = []
        for text, vector in self.vector_memory:
            similarity = cosine_similarity([query_vector], [vector])[0][0]
            similarities.append((text, similarity))
        
        # En benzer top_k öğeyi döndür
        similarities.sort(key=lambda x: x[1], reverse=True)
        return similarities[:top_k]

# Basit bir gömme modeli simülasyonu
class SimpleEmbedding:
    def encode(self, text):
        """Basit bir gömme simülasyonu (gerçek uygulamada daha gelişmiş bir model kullanılır)"""
        # Her kelime için rastgele bir vektör oluşturarak basit bir gömme
        words = text.lower().split()
        # Her kelime için tutarlı rastgele vektör oluşturmak için hash kullan
        vectors = [np.array([hash(word) % 100 / 100 for _ in range(10)]) for word in words]
        if vectors:
            return np.mean(vectors, axis=0)
        return np.zeros(10)

Çoklu Ajan Sistemleri

Gerçek dünya problemleri genellikle tek bir ajanın çözebileceğinden daha karmaşıktır. Bu nedenle, birden fazla ajanın işbirliği yaparak çalıştığı çoklu ajan sistemleri kullanılır.

1. Temel Çoklu Yapay Zeka Ajanları Mimarisi

class AgentTeam:
    def __init__(self, name):
        self.name = name
        self.agents = {}  # ajan_adı: ajan_nesnesi
        self.tasks = {}   # görev_adı: görev_tanımı
        self.coordinator = None
    
    def add_agent(self, agent, role):
        """Ekibe bir ajan ekle"""
        self.agents[role] = agent
        print(f"{agent.name} ekibe {role} rolüyle eklendi.")
    
    def set_coordinator(self, coordinator_role):
        """Ekip koordinatörünü belirle"""
        if coordinator_role in self.agents:
            self.coordinator = self.agents[coordinator_role]
            print(f"{self.coordinator.name} ekip koordinatörü olarak atandı.")
        else:
            raise ValueError(f"{coordinator_role} rolünde bir ajan bulunamadı.")
    
    def add_task(self, task_name, task_description, assigned_roles=None):
        """Ekibe bir görev ekle"""
        self.tasks[task_name] = {
            "description": task_description,
            "assigned_roles": assigned_roles or [],
            "status": "beklemede",
            "result": None
        }
        print(f"'{task_name}' görevi ekibe eklendi.")
    
    def assign_task(self, task_name, role):
        """Görevi bir role ata"""
        if task_name in self.tasks and role in self.agents:
            if role not in self.tasks[task_name]["assigned_roles"]:
                self.tasks[task_name]["assigned_roles"].append(role)
                print(f"'{task_name}' görevi {role} rolüne atandı.")
        else:
            print(f"Görev veya rol bulunamadı.")
    
    def execute_task(self, task_name):
        """Görevi yürüt"""
        if task_name not in self.tasks:
            return f"'{task_name}' adında bir görev bulunamadı."
        
        task = self.tasks[task_name]
        if not task["assigned_roles"]:
            return f"'{task_name}' görevine atanmış rol yok."
        
        task["status"] = "yürütülüyor"
        print(f"'{task_name}' görevi yürütülüyor...")
        
        # Tüm atanmış ajanları çağır
        results = []
        for role in task["assigned_roles"]:
            agent = self.agents[role]
            # Gerçek uygulamada, ajanlar görev tanımına göre özel işlevler çağırabilir
            result = agent.think(task["description"])
            results.append(f"{role}: {result}")
        
        task["status"] = "tamamlandı"
        task["result"] = results
        
        # Sonuçları birleştir (koordinatör varsa koordinatör tarafından)
        if self.coordinator:
            final_result = self.coordinator.think(f"Görev: {task['description']}, Sonuçlar: {results}")
        else:
            final_result = f"Görev sonuçları: {results}"
        
        print(f"'{task_name}' görevi tamamlandı.")
        return final_result

2. Uzmanlaşmış Yapay Zeka Ajanları

Çoklu ajan sistemlerinde, her ajan belirli bir alanda uzmanlaşabilir:

class ResearchAgent(AdvancedMemoryAgent):
    """Bilgi toplama ve araştırma konusunda uzmanlaşmış ajan"""
    def research(self, topic):
        print(f"{self.name} şu konuda araştırma yapıyor: {topic}")
        # Gerçek bir uygulamada, internet araması yapılabilir veya bir veritabanı sorgulanabilir
        return f"{topic} hakkında araştırma sonuçları"

class AnalysisAgent(AdvancedMemoryAgent):
    """Veri analizi konusunda uzmanlaşmış ajan"""
    def analyze(self, data):
        print(f"{self.name} veri analizi yapıyor")
        # Gerçek bir uygulamada, veri analizi algoritmaları kullanılabilir
        return f"Analiz sonuçları: {data} içinde önemli kalıplar bulundu"

class DecisionAgent(AdvancedMemoryAgent):
    """Karar verme konusunda uzmanlaşmış ajan"""
    def decide(self, options):
        print(f"{self.name} karar veriyor")
        # Gerçek bir uygulamada, karar verme algoritmaları kullanılabilir
        if options:
            return f"En iyi seçenek: {options[0]}"
        return "Karar vermek için yeterli seçenek yok"

# Çoklu ajan sistemini oluşturma ve kullanma örneği
team = AgentTeam("Araştırma Ekibi")

# Ajanları oluştur ve ekibe ekle
researcher = ResearchAgent("Ali")
analyst = AnalysisAgent("Ayşe")
decision_maker = DecisionAgent("Mehmet")

team.add_agent(researcher, "araştırmacı")
team.add_agent(analyst, "analist")
team.add_agent(decision_maker, "karar_verici")

# Koordinatör belirle
team.set_coordinator("karar_verici")

# Görev ekle ve ata
team.add_task("pazar_araştırması", "Elektrikli araçlar pazarındaki büyüme trendlerini analiz et")
team.assign_task("pazar_araştırması", "araştırmacı")
team.assign_task("pazar_araştırması", "analist")
team.assign_task("pazar_araştırması", "karar_verici")

# Görevi yürüt
result = team.execute_task("pazar_araştırması")
print(f"Sonuç: {result}")

LangChain ile Gelişmiş Ajan Zincirleri

LangChain, Yapay Zeka Ajanları arasında karmaşık etkileşimler ve iş akışları oluşturmak için ideal bir araçtır. Şimdi, LangChain kullanarak gelişmiş ajan zincirleri nasıl oluşturulur görelim:

from langchain.llms import OpenAI
from langchain.agents import Tool, AgentExecutor, LLMSingleActionAgent
from langchain.prompts import StringPromptTemplate
from langchain.memory import ConversationBufferMemory
import re

# LLM'yi (Dil Modeli) tanımlayın
llm = OpenAI(temperature=0)

# Araçları tanımlayın
tools = [
    Tool(
        name="Arama",
        func=lambda x: f"'{x}' için arama sonuçları",
        description="İnternet üzerinde bilgi aramak için kullanılır"
    ),
    Tool(
        name="Hesaplama",
        func=lambda x: str(eval(x)),
        description="Matematiksel hesaplamalar yapmak için kullanılır"
    ),
    Tool(
        name="Veritabanı",
        func=lambda x: f"'{x}' veritabanı sorgusu sonuçları",
        description="Veritabanı sorguları yapmak için kullanılır"
    )
]

# Özel bir şablon tanımlayın
class CustomPromptTemplate(StringPromptTemplate):
    template = """Bir yapay zeka asistanı olarak görevin kullanıcının isteklerini yerine getirmek. 
    
    Aşağıdaki araçlara erişimin var:
    {tools}
    
    Kullanıcının isteğini düşünmek için şu adımları izle:
    1. Kullanıcının isteğini analiz et
    2. Hangi araçları kullanman gerektiğine karar ver
    3. Aracı kullan
    4. Sonuçları değerlendir
    
    Şimdiye kadar olan konuşma:
    {history}
    
    Kullanıcı isteği: {input}
    Düşünce süreci:"""
    
    def format(self, **kwargs):
        # Araçların açıklamalarını biçimlendir
        tools_str = "\n".join([f"{tool.name}: {tool.description}" for tool in kwargs.pop("tools")])
        kwargs["tools"] = tools_str
        return self.template.format(**kwargs)

# Hafıza tanımlayın
memory = ConversationBufferMemory(memory_key="history")

# Şablonu oluşturun
prompt = CustomPromptTemplate(
    template=CustomPromptTemplate.template,
    tools=tools,
    input_variables=["input", "history"]
)

# Çıktı ayrıştırıcı tanımlayın
def output_parser(text):
    # Eylemi ve girdiyi ayrıştır
    match = re.search(r"Eylem: (\w+)\nGirdi: (.+)", text, re.DOTALL)
    if match:
        action = match.group(1)
        action_input = match.group(2)
        return {"action": action, "action_input": action_input}
    else:
        return {"action": "Düşünce", "action_input": text}

# Ajanı oluşturun
agent = LLMSingleActionAgent(
    llm_chain=prompt,
    output_parser=output_parser,
    stop=["\nGözlem:"],
    allowed_tools=[tool.name for tool in tools]
)

# Ajan yürütücüsü oluşturun
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent,
    tools=tools,
    verbose=True,
    memory=memory
)

# Ajanı çalıştırın
agent_executor.run("3 ile 4'ün toplamı nedir ve yapay zeka hakkında bilgi arar mısın?")

Yapay Zeka Ajanları Bellek Eklentileri ve Bilgi Alımı

Modern ajanlar, büyük miktarda bilgiyi işlemek ve gerektiğinde erişmek için gelişmiş bellek sistemlerine ihtiyaç duyarlar. LangChain, bu amaçla çeşitli bellek eklentileri sunar:

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains import RetrievalQA

# Belge yükleme ve işleme
texts = [
    "Yapay zeka, insan zekasını taklit eden ve toplanan verilere göre yinelemeli olarak kendini iyileştirebilen sistemlerdir.",
    "Makine öğrenimi, bilgisayarların açıkça programlanmadan öğrenmesini sağlayan yapay zekanın bir alt kümesidir.",
    "Derin öğrenme, yapay sinir ağlarını kullanan bir makine öğrenimi tekniğidir.",
    "Doğal dil işleme, bilgisayarların insan dilini anlamasını, yorumlamasını ve üretmesini sağlar."
]

# Metin bölücü
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
docs = text_splitter.create_documents(texts)

# Gömme modeli
embeddings = OpenAIEmbeddings()

# Vektör veritabanı oluştur
db = Chroma.from_documents(docs, embeddings)

# Bilgi alımı zinciri
retriever = db.as_retriever()
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=retriever
)

# Sorgu yapma
query = "Derin öğrenme nedir?"
result = qa_chain.run(query)
print(f"Soru: {query}")
print(f"Cevap: {result}")

İleri Seviye Kullanım Örneği: Yazılım Geliştirme Asistanı

Şimdi, öğrendiğimiz tüm konseptleri birleştirerek gerçek bir kullanım örneği oluşturalım: Bir yazılım geliştirme asistanı.

from langchain.llms import OpenAI
from langchain.agents import Tool, initialize_agent, AgentType
from langchain.memory import ConversationBufferMemory
from langchain.tools import BaseTool

# LLM tanımlama
llm = OpenAI(temperature=0.2)

# Hafıza tanımlama
memory = ConversationBufferMemory(memory_key="chat_history")

# Kod analizi aracı
class CodeAnalysisTool(BaseTool):
    name = "CodeAnalysis"
    description = "Verilen kodu analiz eder ve geliştirilmesi gereken alanları belirler"
    
    def _run(self, code: str) -> str:
        # Gerçek bir uygulamada, statik kod analizi, güvenlik taraması gibi işlemler yapılabilir
        analysis = f"Kod analizi sonuçları:\n"
        analysis += "1. Kod genel olarak iyi yapılandırılmış.\n"
        
        # Basit hata kontrolü
        if "import" not in code.lower() and len(code.split("\n")) > 5:
            analysis += "2. Gerekli kütüphaneler import edilmemiş olabilir.\n"
        
        if "def " in code.lower() and "docstring" not in code.lower() and '"""' not in code:
            analysis += "3. Fonksiyonlar için docstring eksik.\n"
        
        if "try" in code.lower() and "except" not in code.lower():
            analysis += "4. Try bloğu var ama exception handling eksik.\n"
        
        return analysis

# Unit test oluşturma aracı
class UnitTestGeneratorTool(BaseTool):
    name = "UnitTestGenerator"
    description = "Verilen kod için unit test oluşturur"
    
    def _run(self, code: str) -> str:
        # Gerçek bir uygulamada, daha sofistike bir test oluşturma sistemi kullanılabilir
        
        # Fonksiyonları tespit etme
        functions = []
        lines = code.split("\n")
        for line in lines:
            if line.strip().startswith("def "):
                func_name = line.strip()[4:].split("(")[0].strip()
                functions.append(func_name)
        
        # Test kodu oluşturma
        if not functions:
            return "Test oluşturulamadı: Fonksiyon bulunamadı."
        
        test_code = "import unittest\n"
        test_code += f"# Test için gerekli importlar\n\n"
        test_code += "class TestFunctions(unittest.TestCase):\n"
        
        for func in functions:
            test_code += f"    def test_{func}(self):\n"
            test_code += f"        # {func} fonksiyonu için test\n"
            test_code += f"        result = {func}()\n"
            test_code += f"        self.assertEqual(result, expected_value)  # Beklenen değer ile karşılaştırma\n\n"
        
        test_code += "if __name__ == '__main__':\n"
        test_code += "    unittest.main()\n"
        
        return test_code

# Kod optimizasyonu aracı
class CodeOptimizationTool(BaseTool):
    name = "CodeOptimization"
    description = "Verilen kodu optimize eder"
    
    def _run(self, code: str) -> str:
        # Gerçek bir uygulamada, kod optimizasyonu algoritmaları kullanılabilir
        optimized_code = "# Optimize edilmiş kod\n"
        
        lines = code.split("\n")
        for line in lines:
            # Basit optimizasyonlar
            # List comprehension kullanımı
            if "for" in line and "append" in line:
                optimized_code += "# Bu döngü list comprehension ile optimize edilebilir\n"
            # Gereksiz değişken kontrolü
            if "=" in line and line.strip().split("=")[0].strip() not in "\n".join(lines[lines.index(line)+1:]):
                optimized_code += "# Bu değişken daha sonra kullanılmıyor olabilir\n"
            
            optimized_code += line + "\n"
        
        optimized_code += "\n# Performans önerileri:\n"
        optimized_code += "# 1. Döngüler yerine vektörel işlemler kullanılabilir\n"
        optimized_code += "# 2. Gereksiz hesaplamalar döngü dışına alınabilir\n"
        
        return optimized_code

# Araçları tanımlama
tools = [
    CodeAnalysisTool(),
    UnitTestGeneratorTool(),
    CodeOptimizationTool(),
    Tool(
        name="PythonExecutor",
        func=lambda code: "Kod çalıştırma sonucu: [burada gerçek sonuç olurdu]",
        description="Python kodunu çalıştırır ve sonucu döndürür"
    )
]

# Ajanı oluşturma
dev_assistant = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
    memory=memory,
    verbose=True
)

# Ajanı kullanma örneği
def_code = """
def fibonacci(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

result = fibonacci(10)
print(f"Fibonacci(10): {result}")
"""

query = f"Bu kodu analiz et ve optimize edilmiş bir versiyon öner:\n{def_code}"
response = dev_assistant.run(query)
print(response)

# İkinci bir soru sorma
query2 = "Bu kod için unit testler oluşturabilir misin?"
response2 = dev_assistant.run(query2)
print(response2)

Modern Ajan Mimarisi: ReAct ve diğer Yaklaşımlar

ReAct (Reasoning + Acting), ajanların düşünme süreçlerini ve eylemlerini birleştiren güçlü bir yaklaşımdır:

from langchain.agents import load_tools, initialize_agent, AgentType

# LLM ve araçlar
llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# ReAct tabanlı ajan
react_agent = initialize_agent(
    tools, 
    llm, 
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

# Örnek sorgu
query = "Türkiye'nin başkentinin nüfusu kaçtır ve bu sayının karekökü nedir?"
result = react_agent.run(query)
print(f"Sonuç: {result}")

Yapay Zeka Ajanları Değerlendirilmesi ve İyileştirilmesi

Gelişmiş ajanları değerlendirmek ve iyileştirmek için bazı stratejiler:

def evaluate_agent(agent, test_cases):
    """Bir ajanı test durumlarına göre değerlendir"""
    results = []
    
    for i, case in enumerate(test_cases):
        print(f"\nTest Durumu {i+1}: {case['query']}")
        try:
            start_time = time.time()
            response = agent.run(case["query"])
            end_time = time.time()
            
            execution_time = end_time - start_time
            
            # Cevabı değerlendir
            success = any(expected in response for expected in case["expected_keywords"])
            
            results.append({
                "query": case["query"],
                "response": response,
                "success": success,
                "execution_time": execution_time
            })
            
            print(f"Başarı: {'✓' if success else '✗'}")
            print(f"Çalışma Süresi: {execution_time:.2f} saniye")
            
        except Exception as e:
            print(f"Hata: {str(e)}")
            results.append({
                "query": case["query"],
                "response": str(e),
                "success": False,
                "execution_time": -1
            })
    
    # Sonuçları özetle
    success_count = sum(1 for r in results if r["success"])
    success_rate = success_count / len(test_cases) * 100
    avg_time = sum(r["execution_time"] for r in results if r["execution_time"] > 0) / len(results)
    
    print(f"\nDeğerlendirme Özeti:")
    print(f"Başarı Oranı: {success_rate:.2f}%")
    print(f"Ortalama Çalışma Süresi: {avg_time:.2f} saniye")
    
    return results

# Test durumları
test_cases = [
    {
        "query": "2 + 2 kaçtır?",
        "expected_keywords": ["4", "dört"]
    },
    {
        "query": "Türkiye'nin başkenti neresidir?",
        "expected_keywords": ["Ankara"]
    },
    {
        "query": "Fibonacci serisinin ilk 5 elemanı nedir?",
        "expected_keywords": ["0, 1, 1, 2, 3", "0,1,1,2,3"]
    }
]

import time
# Ajanı değerlendir
evaluation_results = evaluate_agent(dev_assistant, test_cases)

Yapay zeka ajanlarının etkin çalışması için sürekli değerlendirme ve iyileştirme kritik öneme sahiptir. Bir ajanın gerçek dünya problemlerini ne kadar iyi çözebildiğini anlamak için çeşitli yöntemler kullanabiliriz.

Değerlendirme Metrikleri

# Ajan değerlendirme metrikleri için örnek bir sınıf
class AjanDeğerlendirici:
    def __init__(self):
        self.görev_tamamlama = []
        self.doğruluk_puanları = []
        self.verimlilik_metrikleri = []
        self.kullanıcı_memnuniyeti = []
    
    def görev_başarısını_ölç(self, ajan, görev_listesi):
        başarı_sayısı = 0
        for görev in görev_listesi:
            sonuç = ajan.görevi_çalıştır(görev)
            if sonuç.başarılı:
                başarı_sayısı += 1
        
        başarı_oranı = başarı_sayısı / len(görev_listesi)
        self.görev_tamamlama.append(başarı_oranı)
        return başarı_oranı
    
    def doğruluğu_ölç(self, ajan_yanıtları, gerçek_yanıtlar):
        doğruluk = 0
        for ajan_yanıt, gerçek_yanıt in zip(ajan_yanıtları, gerçek_yanıtlar):
            benzerlik = self.benzerlik_hesapla(ajan_yanıt, gerçek_yanıt)
            doğruluk += benzerlik
        
        ortalama_doğruluk = doğruluk / len(ajan_yanıtları)
        self.doğruluk_puanları.append(ortalama_doğruluk)
        return ortalama_doğruluk
    
    def benzerlik_hesapla(self, yanıt1, yanıt2):
        # Burada metinsel benzerlik için bir algoritma kullanılabilir
        # Örneğin: cosine similarity, BLEU skoru, vb.
        # Basit bir örnek:
        return 0.8  # Gerçek uygulamada hesaplanmalı
    
    def rapor_oluştur(self):
        return {
            "ortalama_görev_tamamlama": sum(self.görev_tamamlama) / len(self.görev_tamamlama),
            "ortalama_doğruluk": sum(self.doğruluk_puanları) / len(self.doğruluk_puanları),
            "trend": "İyileşiyor" if self.görev_tamamlama[-1] > self.görev_tamamlama[0] else "Kötüleşiyor"
        }

Değerlendirme sürecinde şu ana metriklere odaklanmalıyız:

  1. Görev Tamamlama Oranı: Ajanın verilen görevleri doğru şekilde tamamlama yüzdesi
  2. Doğruluk: Ajanın ürettiği yanıtların veya sonuçların doğruluğu
  3. Verimlilik: API çağrı sayısı, işlem süresi, bellek kullanımı gibi kaynak tüketimi ölçümleri
  4. Kullanıcı Memnuniyeti: Gerçek kullanıcılardan alınan geri bildirimler ve puanlamalar

A/B Testleri ve Deneysel Değerlendirme

Farklı ajan konfigürasyonlarını karşılaştırmak için A/B testleri yapabilirsiniz:

# Farklı ajan stratejilerini karşılaştırmak için A/B test fonksiyonu
def ab_test_ajanları(ajan_a, ajan_b, test_senaryoları):
    sonuçlar_a = []
    sonuçlar_b = []
    
    for senaryo in test_senaryoları:
        # İlk ajan için ölçüm
        başlangıç_zamanı_a = time.time()
        yanıt_a = ajan_a.çalıştır(senaryo)
        bitiş_zamanı_a = time.time()
        süre_a = bitiş_zamanı_a - başlangıç_zamanı_a
        
        # İkinci ajan için ölçüm
        başlangıç_zamanı_b = time.time()
        yanıt_b = ajan_b.çalıştır(senaryo)
        bitiş_zamanı_b = time.time()
        süre_b = bitiş_zamanı_b - başlangıç_zamanı_b
        
        # Sonuçları değerlendir
        doğruluk_a = değerlendirme_fonksiyonu(yanıt_a, senaryo.beklenen_yanıt)
        doğruluk_b = değerlendirme_fonksiyonu(yanıt_b, senaryo.beklenen_yanıt)
        
        sonuçlar_a.append({"doğruluk": doğruluk_a, "süre": süre_a})
        sonuçlar_b.append({"doğruluk": doğruluk_b, "süre": süre_b})
    
    # Sonuçları analiz et
    ortalama_doğruluk_a = sum(sonuç["doğruluk"] for sonuç in sonuçlar_a) / len(sonuçlar_a)
    ortalama_doğruluk_b = sum(sonuç["doğruluk"] for sonuç in sonuçlar_b) / len(sonuçlar_b)
    
    ortalama_süre_a = sum(sonuç["süre"] for sonuç in sonuçlar_a) / len(sonuçlar_a)
    ortalama_süre_b = sum(sonuç["süre"] for sonuç in sonuçlar_b) / len(sonuçlar_b)
    
    return {
        "ajan_a": {
            "ortalama_doğruluk": ortalama_doğruluk_a,
            "ortalama_süre": ortalama_süre_a
        },
        "ajan_b": {
            "ortalama_doğruluk": ortalama_doğruluk_b,
            "ortalama_süre": ortalama_süre_b
        },
        "kazanan": "A" if ortalama_doğruluk_a > ortalama_doğruluk_b else "B"
    }

Ajanları İyileştirme Teknikleri

Prompt Mühendisliği ve Optimizasyon

Ajanlarınızın performansını artırmak için prompt’ları sürekli geliştirmeniz gerekir:

class PromptOptimizasyonu:
    def __init__(self, temel_prompt_şablonu):
        self.temel_şablon = temel_prompt_şablonu
        self.varyasyonlar = []
        self.performans_sonuçları = []
    
    def yeni_varyasyon_ekle(self, değişiklik, açıklama):
        yeni_prompt = self.temel_şablon.copy()
        # Prompt üzerinde değişiklik yap
        for anahtar, değer in değişiklik.items():
            if anahtar in yeni_prompt:
                yeni_prompt[anahtar] = değer
        
        self.varyasyonlar.append({
            "prompt": yeni_prompt,
            "açıklama": açıklama
        })
    
    def varyasyonları_değerlendir(self, test_verileri, değerlendirme_fonksiyonu):
        for idx, varyasyon in enumerate(self.varyasyonlar):
            sonuçlar = []
            for test in test_verileri:
                # Varyasyonu kullanarak ajanı çalıştır
                yanıt = ajan_çalıştır(varyasyon["prompt"], test.girdi)
                # Sonucu değerlendir
                puan = değerlendirme_fonksiyonu(yanıt, test.beklenen)
                sonuçlar.append(puan)
            
            ortalama_puan = sum(sonuçlar) / len(sonuçlar)
            self.performans_sonuçları.append({
                "varyasyon_idx": idx,
                "ortalama_puan": ortalama_puan,
                "açıklama": varyasyon["açıklama"]
            })
    
    def en_iyi_varyasyonu_bul(self):
        en_iyi_puan = -1
        en_iyi_idx = -1
        
        for sonuç in self.performans_sonuçları:
            if sonuç["ortalama_puan"] > en_iyi_puan:
                en_iyi_puan = sonuç["ortalama_puan"]
                en_iyi_idx = sonuç["varyasyon_idx"]
        
        return {
            "en_iyi_prompt": self.varyasyonlar[en_iyi_idx]["prompt"],
            "açıklama": self.varyasyonlar[en_iyi_idx]["açıklama"],
            "performans": en_iyi_puan
        }

İnsan Geri Bildirimi ve Güçlendirmeli Öğrenme

İnsan geri bildirimi, ajanları iyileştirmenin etkili bir yoludur. Bu geri bildirimleri yapılandırılmış bir şekilde toplamak ve kullanmak için:

class İnsanGeriBildirimToplayıcı:
    def __init__(self):
        self.geri_bildirimler = []
    
    def geri_bildirim_al(self, ajan_yanıtı, kullanıcı_değerlendirmesi, etiketler=None):
        """
        Kullanıcıdan geri bildirim alır.
        
        Args:
            ajan_yanıtı: Ajanın ürettiği çıktı
            kullanıcı_değerlendirmesi: 1-5 arasında bir puan
            etiketler: Yanıtın güçlü veya zayıf yönlerini belirten etiketler
        """
        if etiketler is None:
            etiketler = []
        
        self.geri_bildirimler.append({
            "yanıt": ajan_yanıtı,
            "puan": kullanıcı_değerlendirmesi,
            "etiketler": etiketler,
            "zaman": datetime.now()
        })
    
    def düşük_puanlı_yanıtları_analiz_et(self, eşik=3):
        """Düşük puan alan yanıtları ve bunların ortak özelliklerini analiz eder."""
        düşük_puanlı = [gb for gb in self.geri_bildirimler if gb["puan"] <= eşik]
        
        if not düşük_puanlı:
            return {"mesaj": "Düşük puanlı yanıt bulunamadı"}
        
        # Ortak etiketleri bul
        tüm_etiketler = {}
        for gb in düşük_puanlı:
            for etiket in gb["etiketler"]:
                tüm_etiketler[etiket] = tüm_etiketler.get(etiket, 0) + 1
        
        # En yaygın sorunları bul
        yaygın_sorunlar = sorted(tüm_etiketler.items(), key=lambda x: x[1], reverse=True)
        
        return {
            "düşük_puanlı_sayısı": len(düşük_puanlı),
            "toplam_yanıt_sayısı": len(self.geri_bildirimler),
            "düşük_puan_oranı": len(düşük_puanlı) / len(self.geri_bildirimler),
            "yaygın_sorunlar": yaygın_sorunlar[:5]  # En yaygın 5 sorunu göster
        }
    
    def iyileştirme_önerileri_oluştur(self):
        """Geri bildirimlere dayanarak iyileştirme önerileri oluşturur."""
        analiz = self.düşük_puanlı_yanıtları_analiz_et()
        
        öneriler = []
        if "yaygın_sorunlar" in analiz:
            for sorun, sıklık in analiz["yaygın_sorunlar"]:
                if sorun == "yanıt_çok_uzun":
                    öneriler.append("Yanıtları daha kısa ve öz hale getirin")
                elif sorun == "yanıt_yanlış":
                    öneriler.append("Doğruluk kontrolü mekanizmaları ekleyin")
                elif sorun == "yavaş_yanıt":
                    öneriler.append("Yanıt süresini optimize etmek için ara önbellekleme kullanın")
                # Diğer olası sorunlar için çözümler...
        
        return öneriler

Yapay Zeka Ajanları Çok Amaçlı ve Uzmanlaşmış Ajanlar

Karmaşık görevler için, her biri belirli bir alanda uzmanlaşmış çok amaçlı ajan sistemleri oluşturabilirsiniz:

class ÇokAmaçlıAjanSistemi:
    def __init__(self):
        self.ajanlar = {}
        self.orkestratör = None
    
    def yeni_ajan_ekle(self, ajan_id, ajan, uzmanlık_alanları):
        """Sisteme yeni bir uzman ajan ekler."""
        self.ajanlar[ajan_id] = {
            "ajan": ajan,
            "uzmanlık": uzmanlık_alanları
        }
    
    def orkestratör_tanımla(self, orkestratör_ajan):
        """Ana koordinatör ajanı belirler."""
        self.orkestratör = orkestratör_ajan
    
    def görevi_işle(self, görev):
        """Görevi orkestratöre gönderir ve uygun ajanları atamayı ona bırakır."""
        if not self.orkestratör:
            raise ValueError("Orkestratör ajan tanımlanmamış")
        
        # Görevin analiziyle başla
        görev_analizi = self.orkestratör.görevi_analiz_et(görev)
        
        # Gerekli uzmanlıkları belirle
        gereken_uzmanlıklar = görev_analizi["gereken_uzmanlıklar"]
        
        # Uygun ajanları seç
        seçilen_ajanlar = []
        for ajan_id, ajan_bilgisi in self.ajanlar.items():
            for uzmanlık in ajan_bilgisi["uzmanlık"]:
                if uzmanlık in gereken_uzmanlıklar:
                    seçilen_ajanlar.append(ajan_id)
                    break
        
        # Alt görevleri oluştur ve dağıt
        alt_görevler = görev_analizi["alt_görevler"]
        ajan_sonuçları = {}
        
        for alt_görev in alt_görevler:
            uygun_ajan = self.en_uygun_ajanı_bul(alt_görev, seçilen_ajanlar)
            sonuç = self.ajanlar[uygun_ajan]["ajan"].görevi_çalıştır(alt_görev)
            ajan_sonuçları[alt_görev["id"]] = sonuç
        
        # Sonuçları birleştir
        final_yanıt = self.orkestratör.sonuçları_birleştir(ajan_sonuçları, görev)
        
        return final_yanıt
    
    def en_uygun_ajanı_bul(self, alt_görev, aday_ajanlar):
        """Alt görev için en uygun ajanı seçer."""
        en_yüksek_uyumluluk = -1
        en_uygun_ajan = None
        
        for ajan_id in aday_ajanlar:
            ajan_bilgisi = self.ajanlar[ajan_id]
            uyumluluk = 0
            
            # Uzmanlık alanı uyumluluğunu değerlendir
            for uzmanlık in ajan_bilgisi["uzmanlık"]:
                if uzmanlık in alt_görev["gereken_uzmanlık"]:
                    uyumluluk += 1
            
            if uyumluluk > en_yüksek_uyumluluk:
                en_yüksek_uyumluluk = uyumluluk
                en_uygun_ajan = ajan_id
        
        return en_uygun_ajan

Yapay Zeka Ajanları Hafıza ve Birikimli Öğrenme

Uzun süreli etkileşimlerde ajanların hafızasını geliştirmek için vektör veritabanları ve bilgi grafikleri kullanabilirsiniz:

import numpy as np
from datetime import datetime

class AjanHafızası:
    def __init__(self, vektör_boyutu=1536):
        self.anılar = []
        self.vektör_gömmeleri = []
        self.vektör_boyutu = vektör_boyutu
    
    def anı_ekle(self, içerik, meta_veri=None, vektör=None):
        """Ajana yeni bir anı ekler ve vektör gömmesini saklar."""
        if meta_veri is None:
            meta_veri = {}
        
        zaman_damgası = datetime.now()
        
        # Eğer vektör sağlanmadıysa, varsayılan olarak rastgele bir vektör oluştur
        # Not: Gerçek uygulamada, metin gömme API'si kullanarak uygun vektörü oluşturmalısınız
        if vektör is None:
            vektör = np.random.rand(self.vektör_boyutu)
            vektör = vektör / np.linalg.norm(vektör)  # Birim vektöre normalize et
        
        anı = {
            "içerik": içerik,
            "meta_veri": meta_veri,
            "zaman_damgası": zaman_damgası,
            "erişim_sayısı": 0,
            "önem_puanı": 1.0  # Başlangıçta standart önem
        }
        
        self.anılar.append(anı)
        self.vektör_gömmeleri.append(vektör)
        
        return len(self.anılar) - 1  # Anı indeksi döndür
    
    def semantik_ara(self, sorgu_vektörü, k=5):
        """En benzer k anıyı bulur ve döndürür."""
        benzerlikler = []
        
        for idx, vektör in enumerate(self.vektör_gömmeleri):
            benzerlik = np.dot(sorgu_vektörü, vektör)  # Kosinüs benzerliği
            benzerlikler.append((idx, benzerlik))
        
        # En yüksek benzerliğe göre sırala
        benzerlikler.sort(key=lambda x: x[1], reverse=True)
        
        en_benzer_anılar = []
        for idx, benzerlik in benzerlikler[:k]:
            anı = self.anılar[idx].copy()
            anı["benzerlik_puanı"] = benzerlik
            anı["indeks"] = idx
            en_benzer_anılar.append(anı)
            
            # Erişim sayacını artır
            self.anılar[idx]["erişim_sayısı"] += 1
        
        return en_benzer_anılar
    
    def anıları_tazele(self, zayıflama_faktörü=0.99, minimum_önem=0.1):
        """Zamanla anıların önemini azaltır ve çok az önemli olanları siler."""
        güncel_zaman = datetime.now()
        silinecek_indeksler = []
        
        for idx, anı in enumerate(self.anılar):
            # Anının yaşını hesapla (gün cinsinden)
            yaş = (güncel_zaman - anı["zaman_damgası"]).days
            
            # Zamanla azalan önem faktörü
            zaman_faktörü = zayıflama_faktörü ** yaş
            
            # Erişim sayısına göre önem artışı
            erişim_faktörü = min(1.0 + (anı["erişim_sayısı"] * 0.1), 2.0)
            
            # Yeni önem puanını hesapla
            yeni_önem = anı["önem_puanı"] * zaman_faktörü * erişim_faktörü
            self.anılar[idx]["önem_puanı"] = max(yeni_önem, minimum_önem)
            
            # Minimum önemin altına düşen anıları işaretle
            if self.anılar[idx]["önem_puanı"] <= minimum_önem and yaş > 30:
                silinecek_indeksler.append(idx)
        
        # İşaretli anıları sil (sondan başa doğru)
        for idx in sorted(silinecek_indeksler, reverse=True):
            del self.anılar[idx]
            del self.vektör_gömmeleri[idx]
        
        print(f"{len(silinecek_indeksler)} adet düşük önemli anı temizlendi.")

Gerçek Dünya Uygulamaları

Yapay Zeka Ajanları İş Süreçleri Otomasyonu

İş süreçlerini otomatikleştiren ve optimize eden ajanlar oluşturabilirsiniz:

class İşSüreciOtomasyonAjanı:
    def __init__(self, süreç_tanımı, araçlar=None):
        self.süreç = süreç_tanımı
        self.araçlar = araçlar or {}
        self.süreç_durumu = "başlatılmadı"
        self.mevcut_adım = 0
        self.adım_sonuçları = []
    
    def süreci_başlat(self, girdiler):
        """İş sürecini başlatır ve ilk adımı çalıştırır."""
        self.süreç_durumu = "devam_ediyor"
        self.mevcut_adım = 0
        self.adım_sonuçları = []
        
        return self.sonraki_adımı_çalıştır(girdiler)
    
    def sonraki_adımı_çalıştır(self, girdiler):
        """Süreçteki bir sonraki adımı çalıştırır."""
        if self.süreç_durumu != "devam_ediyor":
            return {"durum": self.süreç_durumu, "mesaj": "Süreç şu anda çalıştırılamaz"}
        
        # Mevcut adımı al
        try:
            mevcut_adım = self.süreç["adımlar"][self.mevcut_adım]
        except IndexError:
            self.süreç_durumu = "tamamlandı"
            return {"durum": "tamamlandı", "sonuçlar": self.adım_sonuçları}
        
        # Adımı çalıştır
        try:
            adım_fonksiyonu = getattr(self, f"adım_{mevcut_adım['tip']}")
            sonuç = adım_fonksiyonu(mevcut_adım, girdiler)
            self.adım_sonuçları.append(sonuç)
            
            # Başarılıysa bir sonraki adıma geç
            self.mevcut_adım += 1
            
            # Son adım mı kontrol et
            if self.mevcut_adım >= len(self.süreç["adımlar"]):
                self.süreç_durumu = "tamamlandı"
                return {"durum": "tamamlandı", "sonuçlar": self.adım_sonuçları}
            
            return {"durum": "devam_ediyor", "sonraki_adım": self.mevcut_adım}
            
        except Exception as e:
            self.süreç_durumu = "hata"
            return {"durum": "hata", "mesaj": str(e)}
    
    def adım_veri_toplama(self, adım, girdiler):
        """Veri toplama adımını gerçekleştirir."""
        kaynak = adım.get("veri_kaynağı")
        
        if kaynak not in self.araçlar:
            raise ValueError(f"Gerekli veri kaynağı bulunamadı: {kaynak}")
        
        veri_aracı = self.araçlar[kaynak]
        toplanan_veri = veri_aracı.veri_topla(adım.get("parametreler", {}))
        
        return {
            "adım_tipi": "veri_toplama",
            "kaynak": kaynak,
            "veri": toplanan_veri
        }
    
    def adım_analiz(self, adım, girdiler):
        """Analiz adımını gerçekleştirir."""
        analiz_tipi = adım.get("analiz_tipi")
        veri = self.son_adımdan_veri_al() or girdiler.get("veri")
        
        if not veri:
            raise ValueError("Analiz için veri bulunamadı")
        
        # Analiz aracını seç
        analiz_aracı = self.araçlar.get("analiz_motoru")
        if not analiz_aracı:
            raise ValueError("Analiz motoru bulunamadı")
        
        sonuçlar = analiz_aracı.analiz_yap(veri, analiz_tipi, adım.get("parametreler", {}))
        
        return {
            "adım_tipi": "analiz",
            "analiz_tipi": analiz_tipi,
            "sonuçlar": sonuçlar
        }
    
    def adım_rapor_oluşturma(self, adım, girdiler):
        """Rapor oluşturma adımını gerçekleştirir."""
        şablon = adım.get("rapor_şablonu")
        analiz_sonuçları = self.önceki_adımları_bul("analiz")
        
        if not analiz_sonuçları:
            raise ValueError("Rapor için analiz sonuçları bulunamadı")
        
        # Rapor oluşturma aracını seç
        rapor_aracı = self.araçlar.get("rapor_oluşturucu")
        if not rapor_aracı:
            raise ValueError("Rapor oluşturucu bulunamadı")
        
        rapor = rapor_aracı.rapor_oluştur(şablon, analiz_sonuçları)
        
        return {
            "adım_tipi": "rapor_oluşturma",
            "rapor": rapor
        }
    
    def son_adımdan_veri_al(self):
        """Son adımın sonucundan veri alır."""
        if not self.adım_sonuçları:
            return None
        
        son_sonuç = self.adım_sonuçları[-1]
        return son_sonuç.get("veri") or son_sonuç.get("sonuçlar")
    
    def önceki_adımları_bul(self, adım_tipi):
        """Belirli tipteki önceki adımların sonuçlarını bulur."""
        sonuçlar = []
        for sonuç in self.adım_sonuçları:
            if sonuç.get("adım_tipi") == adım_tipi:
                sonuçlar.append(sonuç)
        
        return sonuçlar

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir