LangChain — 3 (LangChain ve Büyük Dil Modelleri)

Zeki Ünyildiz
3 min readAug 2, 2023

--

LangChain konusundaki serimizin üçüncü yazısına hoş geldiniz. Bu yazıda, LangChain’in dil modelleme yeteneklerini ve özellikle Büyük Dil Modelleri (LLM) üzerindeki çalışmalarını derinlemesine inceleyeceğim.

LangChain ve Dil Modelleri

LangChain, iki tür model için arayüzler ve entegrasyonlar sağlar: LLM’ler ve Sohbet Modelleri. LLM’ler, bir metin dizesi alıp bir metin dizesi döndüren modellerdir. Sohbet Modelleri ise genellikle bir LLM tarafından desteklenir ve özellikle konuşma yapmak için ayarlanmıştır. Bu modeller, bir dizi sohbet mesajını girdi olarak alır ve bir sohbet mesajı döndürürler. LLM’ler ve Sohbet Modelleri arasında önemli farklar vardır ve her ikisi de belirli uygulamalar için daha uygun olabilir.

Büyük Dil Modelleri (LLM)

LLM’ler, LangChain’in çekirdek bileşenlerinden biridir. LangChain, kendi LLM’lerini sunmaz, ancak birçok farklı LLM ile etkileşim kurmak için standart bir arayüz sağlar. Bu, OpenAI, Cohere, Hugging Face gibi birçok LLM sağlayıcısıyla çalışmayı kolaylaştırır.

LLM’ler, bir metin dizesini alıp bir metin dizesi döndüren bir çağrılabilir olarak en basit şekilde kullanılabilir. Ayrıca, bir dizi metinle modeli çağırmanıza ve sadece metinden daha tam bir yanıt almanıza olanak sağlayan bir generate fonksiyonu da vardır.

Python’da bir OpenAI LLM’si ile çalışmak için öncelikle OpenAI Python paketini kurmanız gerekmektedir. Bunu aşağıdaki komut ile yapabilirsiniz:

pip install openai

API’ye erişim bir API anahtarı gerektirir, bu anahtarı bir hesap oluşturarak alabilirsiniz. Anahtarı aldıktan sonra, aşağıdaki gibi bir ortam değişkeni olarak ayarlamak istersiniz:

export OPENAI_API_KEY="..."

Ortam değişkeni ayarlamak istemiyorsanız, OpenAI LLM sınıfını başlatırken openai_api_key adlı parametre ile anahtarı doğrudan geçirebilirsiniz:

from langchain.llms import OpenAI llm = OpenAI(openai_api_key="...")

Alternatif olarak, herhangi bir parametre olmadan da başlatabilirsiniz:

from langchain.llms import OpenAI llm = OpenAI()

Bir metin dizesini alıp bir metin dizesi döndüren bir çağrılabilir olarak LLM’yi kullanmanın en basit yolu budur:

llm("Tell me a joke")

generate fonksiyonu ile bir dizi metni modelle çağırabilir ve sadece metinden daha tam bir yanıt alabilirsiniz. Bu tam yanıt, birden çok en iyi yanıtı ve diğer LLM sağlayıcıya özgü bilgileri içerebilir:

llm_result = llm.generate(["Tell me a joke", "Tell me a poem"]*15)

Bu tam yanıtı kullanarak, sağlayıcıya özgü bilgilere erişebilirsiniz. Bu bilgiler, sağlayıcılar arasında standartlaştırılmamıştır:

llm_result.llm_output

LLM Önbellekleme

LangChain, LLM’ler için isteğe bağlı bir önbellekleme katmanı sağlar. Bu, aynı tamamlamayı birden çok kez talep ediyorsanız API çağrılarının sayısını azaltarak size para tasarrufu sağlayabilir. Ayrıca, API çağrılarının sayısını azaltarak uygulamanızın hızını artırabilir.

Bellek içi önbellekleme için aşağıdaki kodu kullanabilirsiniz:

import langchain
from langchain.llms import OpenAI
from langchain.cache import InMemoryCache

# To make the caching really obvious, lets use a slower model.
llm = OpenAI(model_name="text-davinci-002", n=2, best_of=2)

langchain.llm_cache = InMemoryCache()

# The first time, it is not yet in cache, so it should take longer
llm.predict("Tell me a joke")

# The second time it is, so it goes faster
llm.predict("Tell me a joke")

SQLite önbellekleme için aşağıdaki kodu kullanabilirsiniz:

import os
from langchain.cache import SQLiteCache

os.system('rm .langchain.db')

# We can do the same thing with a SQLite cache
langchain.llm_cache = SQLiteCache(database_path=".langchain.db")

# The first time, it is not yet in cache, so it should take longer
llm.predict("Tell me a joke")

# The second time it is, so it goes faster
llm.predict("Tell me a joke")

Önbellekleme, belirli düğümlerde açılıp kapatılabilir. Aşağıdaki örnekte, bir özetleme map-reduce zinciri yüklenir. Map adımlarında sonuçları önbelleğe alırız, ancak combine adımı için dondurmayız.

from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.mapreduce import MapReduceChain
from langchain.chains.summarize import load_summarize_chain

llm = OpenAI(model_name="text-davinci-002")
no_cache_llm = OpenAI(model_name="text-davinci-002", cache=False)

text_splitter = CharacterTextSplitter()

with open('../../../state_of_the_union.txt') as f:
state_of_the_union = f.read()
texts = text_splitter.split_text(state_of_the_union)

from langchain.docstore.document import Document
docs = [Document(page_content=t) for t in texts[:3]]

chain = load_summarize_chain(llm, chain_type="map_reduce", reduce_llm=no_cache_llm)

chain.run(docs)

Akışlı LLM’ler

Bazı LLM’ler, akışlı bir yanıt sağlar. Bu, tüm yanıtın döndürülmesini beklemek yerine, yanıtın kullanılabilir olduğu anda işlemeye başlamanızı sağlar. Bu, yanıtı oluşturulurken kullanıcıya yanıtı göstermek veya yanıtı oluşturulurken yanıtı işlemek istiyorsanız yararlıdır.

from langchain.llms import OpenAI
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

llm = OpenAI(streaming=True, callbacks=[StreamingStdOutCallbackHandler()], temperature=0)
resp = llm("Write me a song about sparkling water.")

Akışlı yanıtlar, generate kullanılarak da elde edilebilir. Ancak, token_usage şu anda akış için desteklenmemektedir.

llm.generate(["Tell me a joke."])

Kaynakçalar:

LangChain resmi dökümanı:

https://python.langchain.com/docs/modules/model_io/models/ https://python.langchain.com/docs/modules/model_io/models/llms/ https://python.langchain.com/docs/modules/model_io/models/llms/llm_caching https://python.langchain.com/docs/modules/model_io/models/llms/streaming_llm

--

--