Cloud Run'da LangChain uygulaması oluşturup dağıtmayı öğrenin

Cloud Run'da LangChain uygulaması oluşturmayı ve dağıtmayı öğrenin

Bu codelab hakkında

subjectSon güncelleme Eyl 30, 2024
account_circleBir Google çalışanı tarafından yazılmıştır

1. Genel Bakış

Bu kod laboratuvarında, Cloud Run sürüm notları hakkında soru sormak için Gemini'yi kullanan bir LangChain uygulamasını nasıl dağıtacağınızı öğreneceksiniz.

Uygulamanın nasıl çalıştığına dair bir örnek: "Cloud Run'da bir Cloud Storage paketini birim olarak bağlayabilir miyim?" sorusunu sorarsanız uygulama "Evet, 19 Ocak 2024'ten beri" veya benzer bir yanıt verir.

Güvenilir yanıtlar döndürmek için uygulama önce soruya benzer Cloud Run sürüm notlarını alır. Ardından Gemini'a hem soru hem de sürüm notlarını içeren bir istem gönderir. (Bu, genellikle RAG olarak adlandırılan bir modeldir.) Uygulamanın mimarisini gösteren bir şemayı aşağıda bulabilirsiniz:

2. Kurulum ve şartlar

Öncelikle, geliştirme ortamınızın doğru ayarlandığından emin olalım.

  • Uygulama için ihtiyaç duyacağınız kaynakları dağıtmak üzere bir Google Cloud projesine ihtiyacınız vardır.
  • Uygulamayı dağıtmak için yerel makinenize gcloud yüklenmiş, kimliği doğrulanmış ve projeyi kullanacak şekilde yapılandırılmış olmalıdır.
    • gcloud auth login
    • gcloud config set project
  • Uygulamayı yerel makinenizde çalıştırmak istiyorsanız (bunu öneririz) kota projesini ayarlama da dahil olmak üzere uygulama varsayılan kimlik bilgilerinizin doğru şekilde ayarlandığından emin olmanız gerekir.
    • gcloud auth application-default login
    • gcloud auth application-default set-quota-project
  • Ayrıca aşağıdaki yazılımları da yüklemiş olmanız gerekir:
    • Python (3.11 veya sonraki sürümler gereklidir)
    • LangChain CLI
    • Bağımlılık yönetimi için poetry
    • LangChain CLI'ı ve şiiri izole sanal ortamlarda yükleyip çalıştırmak için pipx

Bu adım adım açıklamalı kılavuz için gereken araçları yüklemeye başlamanıza yardımcı olacak bir blogu burada bulabilirsiniz.

Cloud İş İstasyonları

Yerel makineniz yerine Google Cloud'daki Cloud Workstations'ı da kullanabilirsiniz. Nisan 2024'ten itibaren 3.11'den eski bir Python sürümü çalıştırılacağı için başlamadan önce Python'u yükseltmeniz gerekebilir.

Cloud API'lerini etkinleştirme

Öncelikle, doğru Google Cloud projesini kullanacak şekilde yapılandırdığınızdan emin olmak için aşağıdaki komutu çalıştırın:

gcloud config list project

Doğru proje gösterilmiyorsa şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Ardından aşağıdaki API'leri etkinleştirin:

gcloud services enable \
  bigquery.googleapis.com \
  sqladmin.googleapis.com \
  aiplatform.googleapis.com \
  cloudresourcemanager.googleapis.com \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com \
  secretmanager.googleapis.com

Bir bölge seçin

Google Cloud dünya genelinde birçok yerde kullanılabilir. Bu laboratuvar için kullanacağınız kaynakları dağıtmak üzere bir konum seçmeniz gerekir. Bölgeyi kabuğunuzda ortam değişkeni olarak ayarlayın (sonraki komutlar bu değişkeni kullanır):

export REGION=us-central1

3. Vektör veritabanı örneğini oluşturma

Bu uygulamanın önemli bir kısmı, kullanıcının sorduğu soruyla alakalı sürüm notlarını almaktır. Bunu daha somut hale getirmek için Cloud Storage hakkında soru soruyorsanız istem kutusuna aşağıdaki sürüm notunun eklenmesini istersiniz:

Anlamsal olarak benzer sürüm notlarını bulmak için metin gömmelerini ve bir vektör veritabanını kullanabilirsiniz.

PostgreSQL'i Cloud SQL'de vektör veritabanı olarak nasıl kullanacağınızı göstereceğim. Yeni bir Cloud SQL örneği oluşturmak biraz zaman aldığından bunu hemen yapalım.

gcloud sql instances create sql-instance \
  --database-version POSTGRES_14 \
  --tier db-f1-micro \
  --region $REGION

Bu komutun çalışmasına izin verip sonraki adımlara geçebilirsiniz. Bir noktada veritabanı oluşturmanız ve kullanıcı eklemeniz gerekecek. Ancak şimdilik dönen simgeyi izleyerek zaman kaybetmeyelim.

PostgreSQL ilişkisel bir veritabanı sunucusudur ve her yeni Cloud SQL örneğinde varsayılan olarak pgvector uzantısı yüklenmiştir. Bu sayede onu vektör veritabanı olarak da kullanabilirsiniz.

4. LangChain uygulaması için iskelet oluşturma

Devam etmek için LangChain CLI'nin yüklü ve bağımlılıkları yönetmek için poetry'nin yüklü olması gerekir. Pipx'i kullanarak bunları nasıl yükleyeceğiniz aşağıda açıklanmıştır:

pipx install langchain-cli poetry

LangChain uygulamasını aşağıdaki komutla iskeletlendirin. İstendiğinde klasöre run-rag adını verin ve Enter tuşuna basarak paket yüklemeyi atlayın:

langchain app new

run-rag dizinine geçin ve bağımlılıkları yükleyin

poetry install

Az önce bir LangServe uygulaması oluşturdunuz. LangServe, FastAPI'yi bir LangChain zincirinin etrafına sarar. İstem göndermeyi ve tüm ara adımlar dahil olmak üzere sonuçları incelemeyi kolaylaştıran yerleşik bir oyun alanı bulunur. Düzenleyicinizde run-rag klasörünü açıp içindekileri incelemenizi öneririm.

5. Dizine ekleme işi oluşturma

Web uygulamasını derlemeye başlamadan önce Cloud Run sürüm notlarının Cloud SQL veritabanına dizine eklendiğinden emin olalım. Bu bölümde, aşağıdakileri yapan bir dizine ekleme işi oluşturacaksınız:

Dizine ekleme işi, sürüm notlarını alır, bir metin gömme modeli kullanarak vektörlere dönüştürür ve bir vektör veritabanında depolar. Bu sayede, benzer sürüm notlarını semantik anlamlarına göre verimli bir şekilde arayabilirsiniz.

run-rag/app klasöründe aşağıdaki içeriğe sahip bir indexer.py dosyası oluşturun:

import os
from google.cloud.sql.connector import Connector
import pg8000
from langchain_community.vectorstores.pgvector import PGVector
from langchain_google_vertexai import VertexAIEmbeddings
from google.cloud import bigquery


# Retrieve all Cloud Run release notes from BigQuery
client
= bigquery.Client()
query
= """
SELECT
  CONCAT(FORMAT_DATE("
%B %d, %Y", published_at), ": ", description) AS release_note
FROM `bigquery-public-data.google_cloud_release_notes.release_notes`
WHERE product_name= "
Cloud Run"
ORDER BY published_at DESC
"""

rows
= client.query(query)

print(f"Number of release notes retrieved: {rows.result().total_rows}")

# Set up a PGVector instance
connector
= Connector()

def getconn() -> pg8000.dbapi.Connection:
    conn
: pg8000.dbapi.Connection = connector.connect(
        os
.getenv("DB_INSTANCE_NAME", ""),
       
"pg8000",
        user
=os.getenv("DB_USER", ""),
        password
=os.getenv("DB_PASS", ""),
        db
=os.getenv("DB_NAME", ""),
   
)
   
return conn

store
= PGVector(
    connection_string
="postgresql+pg8000://",
    use_jsonb
=True,
    engine_args
=dict(
        creator
=getconn,
   
),
    embedding_function
=VertexAIEmbeddings(
        model_name
="textembedding-gecko@003"
   
),
    pre_delete_collection
=True  
)

# Save all release notes into the Cloud SQL database
texts
= list(row["release_note"] for row in rows)
ids
= store.add_texts(texts)

print(f"Done saving: {len(ids)} release notes")

Gerekli bağımlılıkları ekleyin:

poetry add \
  "cloud-sql-python-connector[pg8000]" \
  langchain-google-vertexai==1.0.5 \
  langchain-community==0.2.5 \
  pgvector

Veritabanı ve kullanıcı oluşturma

sql-instance Cloud SQL örneğinde release-notes veritabanı oluşturun:

gcloud sql databases create release-notes --instance sql-instance

app adlı bir veritabanı kullanıcısı oluşturun:

gcloud sql users create app --instance sql-instance --password "myprecious"

Dizine ekleme işini dağıtma ve çalıştırma

Şimdi işi dağıtın ve çalıştırın:

DB_INSTANCE_NAME=$(gcloud sql instances describe sql-instance --format="value(connectionName)")

gcloud run jobs deploy indexer \
  --source . \
  --command python \
  --args app/indexer.py \
  --set-env-vars=DB_INSTANCE_NAME=$DB_INSTANCE_NAME \
  --set-env-vars=DB_USER=app \
  --set-env-vars=DB_NAME=release-notes \
  --set-env-vars=DB_PASS=myprecious \
  --region=$REGION \
  --execute-now

Bu uzun bir komut. Neler olduğuna bakalım:

İlk komut, bağlantı adını (project:region:instance olarak biçimlendirilmiş benzersiz bir kimlik) alır ve DB_INSTANCE_NAME ortam değişkeni olarak ayarlar.

İkinci komut Cloud Run işini dağıtır. İşaretlerin işlevi:

  • --source .: İşin kaynak kodunun mevcut çalışma dizininde (komutu çalıştırdığınız dizin) olduğunu belirtir.
  • --command python: Kapsayıcı içinde yürütülecek komutu ayarlar. Bu durumda, Python'u çalıştırmak için kullanılır.
  • --args app/indexer.py: Python komutuna bağımsız değişkenleri sağlar. Bu, uygulama dizininde indexer.py komut dosyasını çalıştırmasını söyler.
  • --set-env-vars: Python komut dosyasının yürütülme sırasında erişebileceği ortam değişkenlerini ayarlar.
  • --region=$REGION: İşin dağıtılması gereken bölgeyi belirtir.
  • --execute-now: Cloud Run'a, dağıtıldıktan hemen sonra işi başlatmasını söyler.

İşin başarıyla tamamlandığını doğrulamak için aşağıdakileri yapabilirsiniz:

  • Web konsolunu kullanarak iş yürütme günlüklerini okuyabilirsiniz. "Kayıt tamamlandı: xxx sürüm notu" (xxx, kaydedilen sürüm notu sayısıdır) mesajı gösterilir.
  • Ayrıca, web konsolunda Cloud SQL örneğine gidebilir ve langchain_pg_embedding tablosundaki kayıt sayısını sorgulamak için Cloud SQL Studio'yu kullanabilirsiniz.

6. Web uygulamasını yazma

app/server.py dosyasını düzenleyicinizde açın. Şu ifadeyi içeren bir satır görürsünüz:

# Edit this to add the chain you want to add

Bu yorumu aşağıdaki snippet ile değiştirin:

# (1) Initialize VectorStore
connector
= Connector()


def getconn() -> pg8000.dbapi.Connection:
    conn
: pg8000.dbapi.Connection = connector.connect(
        os
.getenv("DB_INSTANCE_NAME", ""),
       
"pg8000",
        user
=os.getenv("DB_USER", ""),
        password
=os.getenv("DB_PASS", ""),
        db
=os.getenv("DB_NAME", ""),
   
)
   
return conn


vectorstore
= PGVector(
    connection_string
="postgresql+pg8000://",
    use_jsonb
=True,
    engine_args
=dict(
        creator
=getconn,
   
),
    embedding_function
=VertexAIEmbeddings(
        model_name
="textembedding-gecko@003"
   
)
)

# (2) Build retriever


def concatenate_docs(docs):
   
return "\n\n".join(doc.page_content for doc in docs)


notes_retriever
= vectorstore.as_retriever() | concatenate_docs

# (3) Create prompt template
prompt_template
= PromptTemplate.from_template(
   
"""You are a Cloud Run expert answering questions.
Use the retrieved release notes to answer questions
Give a concise answer, and if you are unsure of the answer, just say so.

Release notes: {notes}

Here is your question: {query}
Your answer: """
)

# (4) Initialize LLM
llm
= VertexAI(
    model_name
="gemini-1.0-pro-001",
    temperature
=0.2,
    max_output_tokens
=100,
    top_k
=40,
    top_p
=0.95
)

# (5) Chain everything together
chain
= (
   
RunnableParallel({
       
"notes": notes_retriever,
       
"query": RunnablePassthrough()
   
})
   
| prompt_template
   
| llm
   
| StrOutputParser()
)

Aşağıdaki içe aktarma işlemlerini de eklemeniz gerekir:

import pg8000
import os
from google.cloud.sql.connector import Connector
from langchain_google_vertexai import VertexAI
from langchain_google_vertexai import VertexAIEmbeddings
from langchain_core.runnables import RunnablePassthrough, RunnableParallel
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_community.vectorstores.pgvector import PGVector

Son olarak, "NotImplemented" yazan satırı şu şekilde değiştirin:

# add_routes(app, NotImplemented)
add_routes
(app, chain)

7. Web uygulamasını Cloud Run&#39;a dağıtma

Uygulamayı Cloud Run'a dağıtmak için run-rag dizininde aşağıdaki komutu kullanın:

DB_INSTANCE_NAME=$(gcloud sql instances describe sql-instance --format="value(connectionName)")

gcloud run deploy run-rag \
  --source . \
  --set-env-vars=DB_INSTANCE_NAME=$DB_INSTANCE_NAME \
  --set-env-vars=DB_USER=app \
  --set-env-vars=DB_NAME=release-notes \
  --set-env-vars=DB_PASS=myprecious \
  --region=$REGION \
  --allow-unauthenticated

Bu komut şunları yapar:

  • Kaynak kodunu Cloud Build'e yükleme
  • Docker derlemesini çalıştırın.
  • Elde edilen kapsayıcı görüntüsünü Artifact Registry'ye aktarın.
  • Container görüntüsünü kullanarak bir Cloud Run hizmeti oluşturun.

Komut tamamlandığında run.app alanında bir HTTPS URL'si listelenir. Bu, yeni Cloud Run hizmetinizin herkese açık URL'sidir.

8. Oyun alanını keşfetme

Cloud Run hizmet URL'sini açıp /playground adresine gidin. Bir metin alanı açılır. Bu aracı kullanarak aşağıdaki gibi Cloud Run sürüm notları aracılığıyla soru sorabilirsiniz:

9. Tebrikler

Cloud Run'da LangChain uygulaması oluşturma ve dağıtma işlemlerini başarıyla tamamladınız. Tebrikler!

Temel kavramlar şunlardır:

  • Retrieval Artırılmış Oluşturma (RAG) uygulaması derlemek için LangChain çerçevesini kullanma.
  • Cloud SQL'de varsayılan olarak yüklü olan pgvector ile Cloud SQL'de PostgreSQL'i vektör veritabanı olarak kullanma
  • Cloud Run işleri olarak daha uzun süre çalışan bir dizine ekleme işini, bir web uygulamasını ise Cloud Run hizmeti olarak çalıştırın.
  • LangServe ile bir LangChain zincirini FastAPI uygulamasına sarmalayarak RAG uygulamanızla etkileşimde bulunmak için kullanışlı bir arayüz sağlayın.

Temizleme

Bu eğiticide kullanılan kaynaklar için Google Cloud Platform hesabınızın ücretlendirilmesini istemiyorsanız şunları yapın:

  • Cloud Console'da "Kaynakları yönetin" sayfasına gidin.
  • Proje listesinde projenizi seçin ve Sil'i tıklayın.
  • İletişim kutusuna proje kimliğini yazın ve ardından projeyi silmek için Kapat'ı tıklayın.

Projeyi saklamak istiyorsanız aşağıdaki kaynakları sildiğinizden emin olun:

  • Cloud SQL örneği
  • Cloud Run hizmeti
  • Cloud Run işi