TR ▾
API anahtarı al

LangChain + LLM: Sansürsüz API'ye Bağlanın

LangChain, ChatOpenAI sınıfı aracılığıyla herhangi bir OpenAI uyumlu uç noktaya bağlanır. Temel URL'yi, anahtarı ve model kimliğini ayarlayın, zincirleriniz ve ajanlarınız bu API üzerinde çalışır.

Güncellendi

Merkezi parlak bir merkeze besleme oluşturan bağlantılı bloklar, LangChain boru hatlarının tek bir API'yi çağırmasını temsil eder

Temel noktalar

  1. Base_url'nin API'ye ve modelin uncensored'a ayarlandığı ChatOpenAI'yi kullanın.
  2. Zincirler, akış, araç çağırma ve JSON çıktısı tümü standart sohbet tamamlama uç noktası üzerinden çalışır.
  3. 429 hatalarından kaçınmak için tam anahtarda toplu eşzamanlılığı 8'e, deneme anahtarında 2'ye sınırlayın.
  4. Bu tek bir barındırılan modeldir, bir yönlendirici değildir; bu nedenle tedarikçi bazlı model geçişi yoktur.

Kısa kurulum

Yaygın langchain + llm sorusu, üçüncü taraf bir uç nokta için özel bir entegrasyona ihtiyacınız olup olmadığıdır. Hayır. LangChain'in OpenAI sohbet sarmalayıcısı özel bir base URL kabul eder ve bu API OpenAI sohbet tamamlama formatını takip eder, bu nedenle standart sınıf çalışır. Paketi yükleyin, üç değeri geçin ve herhangi bir zincire yerleştirebileceğiniz bir sohbet model nesnesine sahip olun.

pip install -U langchain-openai langchain-core
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nsfwllmrouter.com/v1",
    api_key="YOUR_API_KEY",
    temperature=0.7,
)

print(llm.invoke("Give me one sentence about LangChain.").content)

Anahtarı API anahtarı sayfasından alın. Yeni kullanıcılar, kayıt olduktan sonra tek tıkla burada $0.50 deneme kredisi talep edebilir; bu, bu makalede her şeyi birçok kez çalıştırmak için yeterlidir. Model ID'si her zaman uncensored'dir ve istekler POST /v1/chat/completions adresine gönderilir.

Site adı hakkında bir not: etki adında "router" kelimesi geçse de, bu bağımsız bir sağlayıcı tarafından yürütülen tek bir açık ağırlıklı modeldir, tedarikçiler arasında bir yönlendirici değildir ve herhangi bir tedarikçinin resmi API'si değildir. Burada modeller arasında seçim yapmazsınız. Kodunuz bir model adlandırır ve yanıt veren odur.

Anahtarı kaynaktan uzak tutun

Anahtarı kod içinde sabitlemek ilk test için çalışır ve dosyayı commit ettiğinizde sorun haline gelir. Bunun yerine ortam değişkenlerinden okuyun. LangChain'in sarmaladığı OpenAI istemci kütüphaneleri varsayılan olarak OPENAI_API_KEY ve OPENAI_BASE_URL'i arar, bu nedenle bunları kabuk ortamınızda ayarlayabilir ve modeli daha az argümanla oluşturabilirsiniz.

export OPENAI_API_KEY="YOUR_API_KEY"
export OPENAI_BASE_URL="https://api.nsfwllmrouter.com/v1"
import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="uncensored",
    base_url=os.environ.get("OPENAI_BASE_URL", "https://api.nsfwllmrouter.com/v1"),
    api_key=os.environ["OPENAI_API_KEY"],
)

Yukarıdaki gibi base URL'yi açıkça geçmenin bir avantajı vardır. Aynı makinedeki başka bir proje gerçek OpenAI hizmetini kullanır ve aynı ortam değişkenine güvenirse, açık argümanınız ikisinin çarpışmasını önler.

İstem şablonlu ilk zincir

Çoğu gerçek iş, boru işlecine bağlanan bir istem şablonu, model ve çıktı ayrıştırıcısı kullanır. Bu LangChain İfade Dili tarzıdır ve özel bir uç nokta için özel bir gereksinim gerektirmez.

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nsfwllmrouter.com/v1",
    api_key="YOUR_API_KEY",
)

prompt = ChatPromptTemplate.from_messages([
    ("system", "You write short story openings in the style the user asks for."),
    ("human", "Genre: {genre}\nSetting: {setting}\nWrite three sentences."),
])

chain = prompt | llm | StrOutputParser()
print(chain.invoke({"genre": "noir mystery", "setting": "a rainy harbor town"}))

Model, yasal yetişkin kullanımı için içerik reddi yapmaz; bu, zinciriniz daha temkinli bir modelin reddedeceği kurgu, rol yapma sahneleri veya arkadaş diyalogları oluşturduğunda önemlidir. Tek sabit kural, reşit olmayanlar içeren cinsel içerik asla üretilmemesidir. Ürününüz daha sıkı kurallara sahipse bunun üzerine kendi girdi doğrulamasını oluşturun.

Akış ve kullanım

API, stream: true ile Sunucu Tarafından Gönderilen Olaylar üzerinden akışı destekler ve kullanım akışın sonunda raporlanır. LangChain'de .stream() çağırır ve parçalar üzerinde yineleme yaparsınız.

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nsfwllmrouter.com/v1",
    api_key="YOUR_API_KEY",
)

for chunk in llm.stream("Write a four-line poem about debugging at night."):
    print(chunk.content, end="", flush=True)

Aklınızda bulundurmanız gereken bir ayrıntı: akışlı bir istek, akış bitene kadar eşzamanlılık slotlarınızdan birini işgal eder. Arayüzünüz bir akış açar ve kullanıcı kapanış yapmadan ayrılırsa, bu slot meşgul kalır. Tam anahtarınızda 8 eşzamanlı istek vardır, bu nedenle birkaç terk edilmiş akış yeni istekleri engelleyebilir. İstemci bağlantısı koptuğunda yineleyiciyi iptal edin.

Fonksiyon çağırma ve ajanlar

Fonksiyon çağırma desteklenir: tools geçersiniz ve isteğe bağlı olarak tool_choice, model tool_calls ile yanıt verir (bunlar da akış yapılabilir) ve sonuçları role: "tool" ile mesajlar olarak geri gönderirsiniz. LangChain'de, bind_tools iletim formatını sizin için halleder.

from langchain_core.tools import tool
from langchain_openai import ChatOpenAI

@tool
def word_count(text: str) -> int:
    'Count the words in a piece of text.'
    return len(text.split())

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nsfwllmrouter.com/v1",
    api_key="YOUR_API_KEY",
)
llm_with_tools = llm.bind_tools([word_count])

msg = llm_with_tools.invoke("How many words are in: the quick brown fox?")
for call in msg.tool_calls:
    print(call["name"], call["args"], word_count.invoke(call["args"]))

Tam bir ajan döngüsü için LangChain'in ajan yardımcıları veya LangGraph bu döngüyü sizin için çalıştırır: modeli çağır, istenen aracı çalıştır, araç mesajını ekle, tekrar çağır. Araç kullanımı standart OpenAI biçimini izler, bu nedenle uyumlu herhangi bir uç nokta için yazacağınız aynı kod çalışır. Her açık ağırlıklı modelde olduğu gibi, özel araç şemalarınızı test edin. Argüman adlarını basit tutun, açıklamaları kısa tutun ve araç listesini küçük tutun, çünkü uzun listeler daha zayıf modellerin yanlış olanı seçmesi için daha fazla alan bırakır.

JSON modu ile yapılandırılmış çıktı

JSON modu, response_format: {"type": "json_object"} aracılığıyla kullanılabilir. LangChain'de bunu bir model argümanı olarak iletebilir ve sonucu kendiniz ayrıştırabilirsiniz; bu da doğrulama ve yeniden denemeler üzerinde kontrol sağlar.

import json
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nsfwllmrouter.com/v1",
    api_key="YOUR_API_KEY",
    model_kwargs={"response_format": {"type": "json_object"}},
)

msg = llm.invoke(
    "Return a JSON object with keys title and tags (a list of three strings) "
    "for an article about hiking."
)
data = json.loads(msg.content)
print(data["title"], data["tags"])

İstemde "JSON" kelimesini söyleyin ve istediğiniz anahtarları tanımlayın. JSON modu çıktıyı geçerli JSON yapar ancak tam şemanızı garanti etmez, bu nedenle ayrıştırmadan sonra anahtarları kontrol edin ve başarısızlık durumunda yeniden deneyin. Başarısız istekler ücretlendirilmediğinden, bozuk çıktı için bir yeniden deneme döngüsü çok az maliyetlidir.

Eşzamanlılık, yeniden denemeler ve hız limitleri

LangChain, işleri .batch() ile dağıtmayı kolaylaştırır ve insanların çoğu ilk hız limitine burada takılır. Tam anahtar 8 eşzamanlı istek ve dakika başına 300 istek izni verir. Deneme anahtarı 2 eşzamanlı istek ve dakika başına 60 istek izni verir. Aşıp geçerseniz API HTTP 429 ile yanıt verir. Dakika başı istekleri aştığınızda hata kodu rate_limited'dir ve aynı anda çok fazla istek çalıştığında concurrency'dir. Geçici aşırı yüklenmede ayrıca Retry-After: 5 başlığı ile bir 429 alırsınız.

Toplu eşzamanlılığı kendiniz ayarlayın ve istemcinin geri çekilme ile yeniden denemesine izin verin:

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nsfwllmrouter.com/v1",
    api_key="YOUR_API_KEY",
    max_retries=4,
    timeout=120,
)

inputs = [f"Summarize idea number {i} in one line." for i in range(40)]
results = llm.batch(inputs, config={"max_concurrency": 6})
print(len(results))

Tam anahtarda 6'da kalmak aynı hesapta gelen diğer istekler için pay bırakır. Deneme anahtarında 2 kullanın. Hâlâ concurrency hataları görüyorsanız, her biri bir slot tutan ve asla bitmeyen akışları arayın. Her yanıt X-Request-Id taşır; bu, destekle iletişime geçerken referans vermeniz gereken değerdir ve X-Balance-USD, kalan kredinizi gösterir.

Web uygulamaları için eşzamansız çağrılar

Bir web sunucusunda bloke edici çağrıları nadiren istersiniz. Her LangChain sohbet modelinin yöntemlerinin eşzamansız ikizleri vardır, bunlar ainvoke, astream ve abatch olarak adlandırılır ve bu uç noktaya senkron versiyonlar gibi çalışırlar.

import asyncio
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nsfwllmrouter.com/v1",
    api_key="YOUR_API_KEY",
)

async def main():
    async for chunk in llm.astream("Describe a quiet harbor at dawn in two sentences."):
        print(chunk.content, end="", flush=True)

asyncio.run(main())

Eşzamansız bir serviste, uçta olan çağrı sayısını anahtarınıza boyutlandırılmış bir eşzamanlama kilidi ile sınırlandırın, örneğin tam bir anahtar için 8. Bu, kendi uygulamanızın meşgul bir uç noktasının tüm yuvaları doldurmasını ve diğerlerini aç bırakmasını engeller. Çağrı etrafında istisnaları yakalayın, varsa X-Request-Id başlığını günlüğe kaydedin ve kullanıcıya bir yığın izi yerine kısa bir yeniden deneme mesajı gösterin.

Hata ayıklama ipucu: Bir zincir tuhaf davrandığında, modelin aldığı tam mesajları yazdırın. İstem şablonları bazen ekstra boşluk ekler veya bir değişkeni atlayabilir ve model yalnızca kendisine gönderilenlere yanıt verebilir. LangChain'in verbose ve debug anahtarları veya zaten kullanıyorsanız LangSmith izleme, son mesaj listesini gösterir.

Bağlam penceresinin zincirler için anlamı

Bağlam penceresi istem ve tamamlama için birlikte 100,000 token içerebilir ve max_tokens isteğe bağlıdır. Bu, birçok belgeyi tek bir isteme yığan getirme zincirleri için veya uzun bir geçmişi koruyan bir sohbet hafızası için yeterince büyüktür. Her adımda tam bir geçmişi kırpmadan yeniden göndermek pahalıya mal olabilir.

Kısa bir hesaplama. 12.000 girdi tokenı gönderen ve 800 token alan bir bilgi erişim adımı 0.012 x $0.15 + 0.0008 x $0.50 = $0.0018 + $0.0004 = $0.0022 maliyetine sahiptir. Bunu 1.000 kez çalıştırırsanız $2.20 ödersiniz. Fiyatlandırma, 1M girdi tokenı başına $0.15 ve 1M çıktı tokenı başına $0.50'dir; abonelik yoktur, bu nedenle zincir gerçekten ne kullanıyorsa o kadar ödersiniz. Fiyatlandırma sayfası bakiye yükleme seçeneklerini içerir ve hızlı başlangıç dokümantasyonu desteklenen her parametreyi listeler. İstemler eğitim için kullanılmaz.

Sorular ve cevaplar

Bu uç nokta için özel bir LangChain paketine ihtiyacım var mı?

Hayır. langchain-openai paketi yeterlidir. Base URL'yi, anahtarınızı ve uncensored model ID'sini ChatOpenAI'ye iletin.

LangGraph ve ajanlarla çalışır mı?

Evet, standart OpenAI sohbet ve fonksiyon çağırma formatını kullandıkları sürece. Fonksiyon çağrıları, akışlı tool_calls ve role tool sonuçları desteklenir.

Bir zincir içinde modeller arasında geçiş yapabilir miyim?

Hayır. Sadece bir model, uncensored vardır ve hizmet tedarikçiler arasında bir yönlendirici değildir. Başka bir adım için farklı bir sağlayıcı gerekiyorsa ayrı bir LangChain model nesnesi kullanın.

429 hatalarıyla ilgili ne yapmalıyım?

Toplu eşzamanlılık düzeyinizi düşürün, varsa Retry-After başlığını dikkate alın ve tamamlanan akışların kapatıldığından emin olun. Tam anahtar 8 eşzamanlı istek ve dakikada 300 istek izni verir.

Vektör mağazam için embeddingler mevcut mu?

Hayır. API yalnızca metin içerir ve embedding uç noktasına sahip değildir, bu nedenle geri çağırma için ayrı bir embedding kaynağına ihtiyacınız vardır.

Anahtarınız tek bir formun uzağında

Bir hesap oluşturun, anahtarı kopyalayın ve base URL'yi değiştirin. Kurulum bu kadar basit.

API anahtarı al