LangChain'in yenilikçi dünyasındaki yolculuğumuz, onun veri yönetimi ve uygulama işlevselliğini dönüştürme konusundaki önemli yeteneklerini ortaya çıkardı.
Önceki tartışmalarda LangChain'in karmaşık yeteneklerini keşfederken çeşitli konulara değindik. Bu makalede, ek yetenekleri kapsüllemek ve özel aracıyı LangServe aracılığıyla dağıtmak için bir MinIO aracısının işlevselliğini genişletirken, "Langchain Aracılarını MinIO ile Güçlendirme" bölümünde ele alınan konseptler üzerine inşa edeceğiz.
Bu içgörülere dayanarak şimdi odak noktamızı şuna çeviriyoruz:
Otomatik API Uç Noktası Oluşturma: LangServe'in otomasyon yetenekleri, gerekli API uç noktalarını zahmetsizce oluşturarak geliştirme çabalarını kolaylaştırır ve dağıtım süresini önemli ölçüde azaltır.
Şema Oluşturma ve Doğrulama: Akıllı şema çıkarımıyla LangServe, API'lerin iyi tanımlanmış arayüzler sunmasını sağlayarak daha kolay entegrasyonu ve kusursuz bir kullanıcı deneyimini kolaylaştırır.
Özelleştirilebilir Uç Nokta Yapılandırması: LangServe, senkronize işlemlerden gerçek zamanlı güncellemelere kadar çeşitli uygulama ihtiyaçlarına uyacak çeşitli uç noktalar sunarak geliştiricilere benzersiz bir esneklik sağlar.
Zahmetsiz Entegrasyon: Belki de en ilgi çekici özelliği olan LangServe'in mevcut LangChain koduyla sorunsuz bir şekilde entegre olma yeteneği, geliştiricilerin önemli değişiklikler olmadan mevcut kod tabanlarından ve uzmanlıklarından yararlanabilecekleri anlamına gelir.
Aşağıdaki adımlarda MinIO'yu LangChain ile entegre etme sürecine daha derinlemesine bakacağız.
langchain-cli
ile bir LangChain Uygulaması oluşturun.agent.py
dosyasında özel bir LangChain aracısı geliştirin.server.py
uygulayın.LangChain uygulamalarını LangServe ile dağıtmak, karmaşık AI işlevleri ile RESTful API'ye maruz kalma arasındaki boşluğu dolduran kusursuz bir entegrasyon yolculuğu getirir, geliştiricilerin LangChain yeteneklerinin tüm yelpazesini verimli bir şekilde kullanmalarına olanak tanır ve günümüzün hızlı dijital ortamında akıllı uygulamaların dağıtımı için yeni bir standart belirler. .
LangChain, langchain-cli
kullanarak uygulama oluşturmanın kullanışlı ve basit bir yöntemini sunarpip
ile kurulabilir. Bu paket, kullanıcıların mevcut uygulamaları kullanarak kolayca yeni uygulamalar oluşturmasına olanak tanıyan bir arayüz sağlar.
Not: Gerekli tüm dosyalar “minio-langserve-deployment ” adlı dizin altındaki MinIO “blog-assets” deposunda bulunmaktadır.
Yeni bir LangChain uygulaması oluşturmak için sanal bir ortam oluşturmak ve langchain-cli
paketini kurmak için aşağıdaki komutlarla başlayabiliriz:
mkdir minio-langserve-testing cd minio-Langserve-testing python -m venv .myenv source .myenv/bin/activate pip install langchain-cli
langchain-cli
kullanarak yeni bir uygulama oluşturmak için terminalimizde langchain
yazabiliriz, my-app
adında yeni bir uygulama dizini oluşturmak için aşağıdaki komutu yazıyoruz.
langchain app new my-app
Yukarıdaki komutlarla oluşturulan langchain uygulaması, geliştirme için tutarlı bir ortam yaratarak tüm ağır işleri yapar. Yeni bir LangChain uygulamasının yapısı doğrudan şuna benzer:
./my-app ├── Dockerfile ├── README.md ├── app │ ├── __init__.py │ └── server.py ⇐ (This is where we will import our agent into) ├── packages ⇐ (This directory is where we will write our agent) │ └── README.md └── pyproject.toml
Sonraki adımlarda, package/agent.py adında yeni bir dosya yazıp app/server.py
dosyasında değişiklikler yaparak yeni oluşturulan LangChain uygulamasında ( my-app
) değişiklikler yapacağız.
Bu makalede ele alacağımız dosyalar şunlardır:
my-app/packages/agent.py
my-app/app/server.py
MinIO ile entegre bir LangChain aracısının LangServe ile dağıtımını göstermek için, aracı zinciri kodunu agent.py
kaydederek başlayacağız.
Öncelikle "play.min.io:443" genel sunucusuna bağlanan bir minio_client
başlatalım. Bu dosya sonunda LangChain'in agent_executor
çağıracak ve onu LangServe'in add_route
sarmalayıcısına aktarmamıza olanak tanıyacak.
Not: Önceki yayının okunması "
Başlamak için bir metin düzenleyici kullanarak Agent.py dosyasını açın:
sudo nano packages/agent.py
Dosyanın başında os
, io
, minio
ve ChatOpenAI
gibi gerekli paketleri içe aktarın:
import os import io from minio import Minio from minio.error import S3Error from langchain_openai import ChatOpenAI os.environ["OPENAI_API_KEY"] = "<<Your API Key Here>>" # Initialize llm llm = ChatOpenAI(api_key=os.environ["OPENAI_API_KEY"]) # Initialize MinIO client minio_client = Minio('play.min.io:443', access_key='minioadmin', secret_key='minioadmin', secure=True)
Bu kod parçasında gerekli paketleri içe aktarıyoruz ve OPENAI_API_KEY
ortam değişkeninde saklanan OpenAI API anahtarı ile ChatOpenAI dil modelini başlatıyoruz. Ayrıca "play.min.io" genel sunucusuna gerekli bağlantı detaylarını sağlayarak minio_client'i başlatıyoruz.
Daha sonra MinIO paketini tanımlayalım ve mevcut değilse oluşturalım:
# This variable will check if bucket exists bucket_name = "test" try: # Check if bucket exists if not minio_client.bucket_exists(bucket_name): # Create the bucket because it does not exist minio_client.make_bucket(bucket_name) print(f"Bucket '{bucket_name}' created successfully.") else: print(f"Bucket '{bucket_name}' already exists.") except S3Error as err: print(f"Error encountered: {err}")
Burada bucket_name
"test" olarak tanımlıyoruz ve minio_client.bucket_exists()
yöntemini kullanarak zaten var olup olmadığını kontrol ediyoruz. Kova mevcut değilse minio_client.make_bucket()
kullanarak oluştururuz. Paket zaten mevcutsa bunu belirten bir mesaj yazdırırız. Ayrıca, işlem sırasında oluşabilecek herhangi bir S3Error
yakalamak ve yazdırmak için try-hariç bloğu kullanarak hata işlemeyi de dahil ediyoruz.
Temel kurulum tamamlandıktan sonra artık MinIO araç işlevlerini tanımlamaya ve sonraki adımlarda ele alacağımız aracı yürütücüyü oluşturmaya devam edebiliriz.
Langchain ve Langserve, mantık ve işlevselliğin kapsüllenmesine benzer bir yaklaşım sunarak bunun aracı ve zincir mantığına kusursuz bir şekilde entegre edilmesini sağlar. Bu, tanımlanmış işlevin içinde, işlevleri yapay zeka aracısı tarafından kullanılabilen ve yorumlanabilen yeniden kullanılabilir bileşenler olarak işaretleyen ayrıntılı bir belge dizisine sahip @tool
dekoratörünün kullanılmasıyla gerçekleştirilir.
Sağlanan kod örneklerine daha yakından bakalım:
from langchain.agents import tool @tool def upload_file_to_minio(bucket_name: str, object_name: str, data_bytes: bytes): """ Uploads a file to MinIO. Parameters: bucket_name (str): The name of the bucket. object_name (str): The name of the object to create in the bucket. data_bytes (bytes): The raw bytes of the file to upload. """ data_stream = io.BytesIO(data_bytes) minio_client.put_object(bucket_name, object_name, data_stream, length=len(data_bytes)) return f"File {object_name} uploaded successfully to bucket {bucket_name}."
upload_file_to_minio
işlevi, yeniden kullanılabilir bir bileşen olduğunu belirten @tool
ile süslenmiştir. Bir dosyayı MinIO paketine yüklemek için paket adı, nesne adı ve dosyanın ham baytları gibi gerekli parametreleri alır. İşlev, dosya yükleme işlemini gerçekleştirmek için minio_client
kullanır ve tamamlandığında bir başarı mesajı döndürür.
@tool def download_file_from_minio(file_info): """ Custom function to download a file from MinIO. Expects file_info dict with 'bucket_name', 'object_name', and 'save_path' keys. 'save_path' should be the local path where the file will be saved. """ bucket_name = file_info['bucket_name'] object_name = file_info['object_name'] save_path = file_info['save_path'] minio_client.get_object(bucket_name, object_name, save_path)
Benzer şekilde download_file_from_minio
işlevi de @tool
ile işaretlenmiştir. Bir MinIO paketinden bir dosyayı indirmek için paket adı, nesne adı ve dosyanın kaydedilmesi gereken yerel yol gibi gerekli bilgileri içeren bir file_info
sözlüğü bekler. İşlev, nesneyi belirtilen gruptan almak ve belirlenen yerel yola kaydetmek için minio_client
kullanır.
@tool def list_objects_in_minio_bucket(file_info): """ Custom function to list objects in a MinIO bucket. Expects file_info dict with 'bucket_name' key. Returns a list of dictionaries containing 'ObjectKey' and 'Size' keys. """ bucket_name = file_info['bucket_name'] response = minio_client.list_objects(bucket_name) return [{'ObjectKey': obj.object_name, 'Size': obj.size} for obj in response.items]
Yine @tool
ile donatılmış list_objects_in_minio_bucket
işlevi, bir MinIO kümesinde bulunan nesnelerin listelenmesinden sorumludur. bucket_name
anahtarına sahip bir file_info
sözlüğü bekler. İşlev, belirtilen gruptaki nesnelerin listesini almak için minio_client
kullanır ve her nesne için nesne anahtarını ve boyutunu içeren sözlüklerin bir listesini döndürür.
Langchain ve Langserve, bu işlevleri araçlar olarak kapsayarak, yapay zeka aracısının bunları kendi mantığına ve karar verme sürecine sorunsuz bir şekilde dahil etmesini sağlar. Aracı, elindeki göreve göre uygun aracı akıllıca seçip çalıştırabilir, yeteneklerini geliştirebilir ve MinIO depolama sistemiyle daha karmaşık ve dinamik etkileşimlere olanak tanıyabilir.
LangChain, özel mantıkla inşa etmek için sayısız yöntem sunar; bu yaklaşımlardan biri de "RunnableLambda
.
from langchain_core.runnables import RunnableLambda upload_file_runnable = RunnableLambda(upload_file_to_minio) download_file_runnable = RunnableLambda(download_file_from_minio) list_objects_runnable = RunnableLambda(list_objects_in_minio_bucket)
Araç fonksiyonlarını RunnableLambda ile sararak, aracı tarafından yürütülmesi sırasında çağrılabilecek çalıştırılabilir örnekler ( upload_file_runnable
, download_file_runnable
ve list_objects_runnable
) oluştururuz. Bu çalıştırılabilirler, karşılık gelen araç işlevlerini kapsar ve aracının bunlarla etkileşime girmesi için tek tip bir arayüz sağlar.
tools = [upload_file_to_minio, download_file_from_minio, list_objects_in_minio_bucket] llm_with_tools = llm.bind_tools(tools)
Araçlar listesi, aracının yetenekleri için yapı taşları görevi gören orijinal araç işlevlerini ( upload_file_to_minio
, download_file_from_minio
ve list_objects_in_minio_bucket
) içerir. llm.bind_tools(tools)
satırı, araçları dil modeline ( llm
) bağlayarak modelin muhakeme yetenekleri ile araçlar tarafından sağlanan belirli işlevler arasında bir bağlantı kurar. Ortaya çıkan llm_with_tools
bağlı araçları kullanma bilgisi ve yeteneği ile geliştirilmiş dil modelini temsil eder.
RunnableLambda
kullanımı ve araçların dil modeline bağlanması, LangChain ve LangServe'nin güçlü ve özelleştirilebilir yapay zeka aracıları oluşturmadaki esnekliğini ve genişletilebilirliğini göstermektedir. Yapay zeka aracısı, dil modelinin gücünü araçlarda yer alan belirli işlevlerle birleştirerek, dosyaları MinIO'ya yüklemek, MinIO'dan dosya indirmek ve bir MinIO kümesindeki nesneleri listelemek gibi karmaşık görevleri gerçekleştirme yeteneği kazanır.
Daha sonra odak noktamızı, yapay zeka aracısına kullanıcı girdilerini anlama ve yanıt verme konusunda rehberlik eden bilgi istemi şablonuna kaydırıyoruz. Rolü ve mesaj içeriğini içeren demetler olarak temsil edilen mesajların bir listesini alan ChatPromptTemplate.from_messages()
yöntemi kullanılarak tanımlanır.
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.agents.format_scratchpad.openai_tools import format_to_openai_tool_messages from langchain.agents.output_parsers.openai_tools import OpenAIToolsAgentOutputParser from langchain_core.messages import AIMessage, HumanMessage prompt_template = ChatPromptTemplate.from_messages([ ("system", "You are a powerful assistant equipped with file management capabilities."), ("user", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad"), ])
İstem üç mesajdan oluşur:
Dosya yönetimi yeteneklerine sahip güçlü bir asistan olarak AI aracısının bağlamını belirleyen bir "sistem" mesajı.
{input}
yer tutucusunu kullanan, kullanıcının girişini temsil eden bir "kullanıcı" mesajı.
Aracının ara adımlarını ve düşünce sürecini depolamak için "agent_scratchpad" adlı bir MessagesPlaceholder
.
format_to_openai_tool_messages
işlevi, aracının karalama defterini OpenAI araçları için uyumlu bir formatta formatlarken, OpenAIToolsAgentOutputParser sınıfı, modelin yanıtını aracı tarafından yorumlanabilen yapılandırılmış bir formata ayrıştırır.
AIMessage
ve HumanMessage
sınıfları, aracı ile kullanıcı arasında alınıp verilen mesajları temsil ederek, aracının mantığı dahilinde iletişimi yönetmek için standartlaştırılmış bir yol sağlar.
Bilgi istemi şablonunu tanımlayarak, görevi çözerken ara adımlarını ve düşünce sürecini takip etmek için "agent_scratchpad" yer tutucusunu kullanarak yapay zeka aracısına kullanıcı girdilerini anlaması ve yanıt vermesi için net bir yapı ve bağlam sağlıyoruz.
Son olarak, agent.py
dosyamızı tamamlamak için aracımızı tanımlıyoruz ve LangServe kütüphanesindeki add_route
fonksiyonunu kullanarak bir server.py
betiğinden içe aktarılabilen ve çağrılabilen bir AgentExecutor oluşturuyoruz.
Gerekli bileşenleri başlatıyoruz ve tek bir etmen değişkeni oluşturmak için bunları birbirine zincirliyoruz.
agent = ( { "input": lambda x: x["input"], "agent_scratchpad": lambda x: format_to_openai_tool_messages(x["intermediate_steps"]), } | prompt_template | llm_with_tools | OpenAIToolsAgentOutputParser() )
Aracı, sözlüklerin ve zincirleme işlemlerin bir kombinasyonu kullanılarak tanımlanır. Giriş anahtarı, kullanıcı girdisini gelen verilerden ayıklarken, agent_scratchpad
anahtarı, format_to_openai_tool_messages
işlevini kullanarak aracının düşünce sürecinin ara adımlarını biçimlendirir. Aracı ayrıca bilgi istemi şablonunu ( prompt_template
), araçlarla birlikte dil modelini ( llm_with_tools
) ve çıktı ayrıştırıcısını ( OpenAIToolsAgentOutputParser()
) içerir.
Bir AgentExecutor
oluşturmak için, ona tanımlanmış aracıyı, mevcut araçları sağlarız ve ayrıntılı çıktı için verbose=True
ayarını yaparız.
from langchain.agents import tool, AgentExecutor agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
AgentExecutor
görevi anlamak ve kullanıcının girdisine göre uygun aracı seçmek için sağlanan aracıyı ve araçları kullanır. Aracı, her araç için ayrı istemlere sahip olmak yerine, verilen girdiye dayalı olarak araçların nasıl kullanılacağı konusunda kendisine rehberlik eden tek bir bilgi istemi şablonu kullanır. Aracı, yürütme süreci sırasında uygun aracı dinamik olarak seçer.
Uygulamamızı LangServe ile entegre ederek ayarlamak, LangChain uygulamalarımızı API'ler olarak dağıtmak ve yönetmek için basit bir yol sağlar. FastAPI, performansı ve kullanım kolaylığı, eşzamansız işlemleri desteklemesi ve API belgelerini otomatik olarak oluşturması nedeniyle seçilmiştir.
Daha ayrıntılı/kullanım durumu gösterileri için şu adresi ziyaret ederek incelenebilir:
langchain-ai/langserve GitHub deposu altındaörnekler dizini .
from fastapi import FastAPI app = FastAPI( title="MinIO Agent API", version="1.0", description="A conversational agent facilitating data storage and retrieval with MinIO", )
CORS başlıklarını ayarlamak için güvenliğimizi artırmak amacıyla aşağıdaki satırları ekleyebiliriz:
from fastapi.middleware.cors import CORSMiddleware # Set all CORS enabled origins app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], expose_headers=["*"], )
Artık packages/agent.py
ile işimiz bittiğine göre onu içe aktarabilir ve app/server.py
betiğimizdeki LangServe kütüphanesindeki add_route
fonksiyonunu kullanabiliriz.
from packages.agent import agent_executor from langserve import add_routes add_routes( app, agent_executor.with_types(input_type=Input, output_type=Output).with_config( {"run_name": "agent"} ), path=”/invoke” )
add_route(app, agent_executor(…), path="/invoke")
çağırarak, sunucu uygulamamıza ( app
), /invoke
yolunu agent_executor()
işlevine eşleyen bir rota ekliyoruz. Bu, /invoke
uç noktasına bir istek yapıldığında aracı yürütücünün çağrılmasına olanak tanır.
Bu kurulumla sunucu, gelen istekleri işleyebilir, bunları aracı yürütücüye iletebilir ve aracının yanıtını istemciye geri gönderebilir. Aracı yürütücü, kullanıcı girişini işlemek ve mevcut araçlara dayalı olarak uygun bir yanıt oluşturmak için bilgi istemi şablonunu, araçlarla birlikte dil modelini ve çıktı ayrıştırıcıyı birleştiren tanımlanmış aracıyı kullanır.
LangServe uygulamasını başlatmak için ASGI sunucusu olarak Uvicorn'u kullanıyoruz ve uygulamamızın çalışması için zemin hazırlıyoruz. Bu kod parçacığı, evrensel ana bilgisayarı ve uygulamanın erişim noktaları için belirlenen bağlantı noktasını belirterek sunucuyu etkinleştirdiği için çok önemlidir.
if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)
Bu bloğu uygulamanın ana girişine yerleştirerek, komut dosyası doğrudan çalıştırıldığında Uvicorn'un kontrolü ele almasını sağlıyoruz, böylece FastAPI uygulamamızı önceden tanımlanmış bir ana bilgisayar ve bağlantı noktasında aydınlatıyoruz. Bu yaklaşım yalnızca dağıtım sürecini basitleştirmekle kalmaz, aynı zamanda uygulamanın bir geliştirme veya üretim ortamında çalıştırılmasına yönelik açık bir girişi de işaret eder.
Yukarıdaki kod, "langchain-cli" kitaplığının kullanılmasını, yeni bir langchain uygulaması oluşturulmasını ve FastAPI ve LangServe uygulaması server.py
kaydedilirken zincir mantığını agent.py
kaydetmeyi içeren modüler bir yaklaşım gösterilmiştir.
Bu bizim son adımımız olarak, uygulamamızı oluşturmanın tanıtım amacıyla uygulama kodumuzu server.py
kaydedeceğiz.
Hizmetimizi çalıştırmanın en basit yolu şudur:
python server.py
Bu komut, uygulamayı çalıştıracak ve hala hata ayıklanması gereken günlükleri veya hata mesajlarını döndürecektir.
Python çıktısında LangServe günlükleri /invoke/playground
uygulama uç noktası olarak tanımlar. Artık oyun alanı WebUI'yi ve API'mizin /docs
yolunu ziyaret ederek erişilebilen API'miz için otomatik belgeleri ziyaret edebiliriz; WebUI'dan yürütebileceğimiz önceden tanımlanmış cURL isteklerinin yanı sıra, uygulama özelliklerimizin her biri için Deneyin düğmesini ekleyerek test etme ve yapılandırma konusunda bize basitleştirilmiş bir yaklaşım sağlıyor.
Sonuç olarak, MinIO ile entegre LangChain aracımız artık ustaca konuşlandırılabilir bir API'ye dönüştürüldü; toplu işlemeden gerçek zamanlı etkileşimlere kadar çeşitli işlevlere sahip kullanıcılar için geliştirilmeye ve genişletilmeye hazır.
LangServe uygulaması çalışır durumdayken, uç noktamızı hedefleyerek ve onu Langserve'in RemoteRunnable
modülüne sararak onu server.py
dosyamızın dışından kullanabiliriz:
from langserve import RemoteRunnable remote_runnable = RemoteRunnable("http://localhost:8000/<path>/")
Eklemek
LangChain, kütüphanelerinde çok çeşitli modüller barındırıyor ve geliştiricilere gelişmiş yapay zeka destekli uygulamalar oluşturma konusunda güç vermek için tasarlanmış çeşitli araç kitlerini sergiliyor. LangChain'in modüler mimarisi, karmaşık zincir yapılarından çeşitli yapay zeka modelleriyle kusursuz entegrasyona kadar çok çeşitli işlevleri kolaylaştırarak yapay zeka ve makine öğrenimi alanında son derece özelleştirilebilir ve gelişmiş çözümlerin oluşturulmasına olanak tanır.
LangServe, LangChain uygulamalarını dağıtma sürecini yalnızca gizemi açığa çıkarmakla kalmaz, aynı zamanda önemli ölçüde basitleştirir. Geliştirme ve dağıtım arasındaki boşluğu doldurarak, MinIO ve LangChain'den yararlanan yenilikçi uygulamaların konseptten gerçeğe hızlı bir şekilde geçmesini, daha geniş ekosisteme entegre olmaya hazır olmasını ve kullanıcı deneyimlerini geliştirmesini sağlar.
Araştırmalarımız kapsamındaki geliştirmeler sayesinde MinIO'nun kusursuz entegrasyonunu gördük.
MinIO olarak, teknoloji açısından zengin bu çağda geliştirici topluluğunun yaratıcılığından ve potansiyelinden güç alıyoruz. İşbirliği ve bilgi alışverişi için daha iyi bir zaman olamaz. Sizinle bağlantı kurmaya can atıyoruz! Bize katılın