1. Genel Bakış
Bu kod laboratuvarında, Cloud Run sürüm notları hakkında soru sormanıza olanak tanımak için Gemini'ı kullanan bir LangChain uygulamasını nasıl dağıtacağınızı öğreneceksiniz.
Uygulamanın nasıl çalıştığına dair bir örnek: "Cloud Storage paketini Cloud Run'da bir birim olarak bağlayabilir miyim?" diye sorduğunuzda uygulama "Evet, 19 Ocak 2024'ten itibaren" veya benzer bir yanıt veriyor.
Uygulama, temellendirilmiş yanıtlar döndürmek için önce soruya benzer Cloud Run sürüm notlarını alır, ardından hem soru hem de sürüm notlarıyla Gemini'ı ister. (Bu, genellikle RAG olarak adlandırılan bir kalıptır.) Uygulamanın mimarisini gösteren bir diyagramı aşağıda bulabilirsiniz:

2. Kurulum ve şartlar
Öncelikle, geliştirme ortamınızın doğru şekilde ayarlandığından emin olalım.
- Uygulama için ihtiyacınız olan kaynakları dağıtmak üzere Google Cloud projesine ihtiyacınız vardır.
- Uygulamayı dağıtmak için yerel makinenizde gcloud'un yüklü, kimliği doğrulanmış ve projeyi kullanacak şekilde yapılandırılmış olması gerekir.
gcloud auth logingcloud config set project
- Uygulamayı yerel makinenizde çalıştırmak istiyorsanız (önerilir) 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 logingcloud 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 KSA'sını ve poetry'yi yalıtılmış sanal ortamlarda yüklemek ve çalıştırmak için pipx
Bu kılavuzda gereken araçları yüklemeye başlamanıza yardımcı olacak bir blog yazısını burada bulabilirsiniz.
Cloud İş İstasyonları
Yerel makineniz yerine Google Cloud'da Cloud Workstations'ı da kullanabilirsiniz. Nisan 2024 itibarıyla 3.11'den daha düşük bir Python sürümünün kullanıldığını unutmayın. Bu nedenle, başlamadan önce Python'u yükseltmeniz gerekebilir.
Cloud API'lerini etkinleştirme
Öncelikle, kullanılacak doğru Google Cloud projesini 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>
Şimdi 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
Bölge seçin
Google Cloud, dünya genelinde birçok konumda kullanılabilir. Bu laboratuvarda kullanacağınız kaynakları dağıtmak için bir konum seçmeniz gerekir. Bölgeyi kabuğunuzda ortam değişkeni olarak ayarlayın (sonraki komutlarda bu değişken kullanılır):
export REGION=us-central1
3. Vektör veritabanı örneğini oluşturma
Bu uygulamanın önemli bir parçası, kullanıcı sorusuyla alakalı sürüm notlarını almaktır. Örneğin, Cloud Storage hakkında bir soru soruyorsanız isteme aşağıdaki sürüm notunun eklenmesini istersiniz:
Anlamsal olarak benzer sürüm notlarını bulmak için metin yerleştirmelerini ve bir vektör veritabanını kullanabilirsiniz.
Cloud SQL'de PostgreSQL'i nasıl vektör veritabanı olarak kullanacağınızı göstereceğim. Yeni bir Cloud SQL örneği oluşturmak biraz zaman alır. Bu nedenle, şimdi yapalım.
gcloud sql instances create sql-instance \ --database-version POSTGRES_14 \ --tier db-f1-micro \ --region $REGION
Bu komutun çalışmasına izin verebilir ve sonraki adımlara geçebilirsiniz. Bir noktada veritabanı oluşturmanız ve kullanıcı eklemeniz gerekecek ancak şimdi yükleme simgesini izleyerek zaman kaybetmeyelim.
PostgreSQL, ilişkisel bir veritabanı sunucusudur ve her yeni Cloud SQL örneğinde varsayılan olarak pgvector uzantısı yüklüdür. Bu nedenle, PostgreSQL'i vektör veritabanı olarak da kullanabilirsiniz.
4. LangChain uygulamasını iskeleleme
Devam etmek için LangChain CLI'nın yüklü olması ve bağımlılıkları yönetmek için Poetry'nin kullanılması gerekir. Bunları pipx kullanarak nasıl yükleyeceğiniz aşağıda açıklanmıştır:
pipx install langchain-cli poetry
Aşağıdaki komutla LangChain uygulamasını oluşturun. İ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ıları yükleyin.
poetry install
LangServe uygulamanızı oluşturdunuz. LangServe, FastAPI'yi LangChain zinciri etrafında sarmalar. Bu model, istem göndermeyi ve tüm ara adımlar dahil sonuçları incelemeyi kolaylaştıran yerleşik bir oyun alanı içerir. Düzenleyicinizde run-rag klasörünü açıp içeriğini incelemenizi öneririm.
5. Dizin oluşturma işini oluşturma
Web uygulamasını oluşturmaya başlamadan önce Cloud Run sürüm notlarının Cloud SQL veritabanında dizine eklendiğinden emin olalım. Bu bölümde, aşağıdakileri yapan bir dizine ekleme işi oluşturacaksınız:

Dizin oluşturma işi, sürüm notlarını alır, metin yerleştirme modeli kullanarak bunları vektörlere dönüştürür ve vektör veritabanında saklar. Bu sayede, semantik anlamlarına göre benzer sürüm notları verimli bir şekilde aranabilir.
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
Cloud SQL örneğinde release-notes veritabanı oluşturun sql-instance:
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"
Dizin oluşturma 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 şöyledir:
--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 örnekte, Python'ı çalıştırmak için kullanılıyor.--args app/indexer.py: Python komutunun bağımsız değişkenlerini sağlar. Bu komut, uygulamanın dizininde indexer.py komut dosyasının çalıştırılmasını sağlar.--set-env-vars: Python komut dosyasının yürütme 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, işi dağıtıldıktan hemen sonra başlatmasını söyler.
İşin başarıyla tamamlandığını doğrulamak için aşağıdakileri yapabilirsiniz:
- Web konsolu üzerinden iş yürütme günlüklerini okuyun. "Kaydetme işlemi tamamlandı: xxx sürüm notu" (xxx, kaydedilen sürüm notlarının sayısıdır) mesajını bildirmelidir.
- Web konsolunda Cloud SQL örneğine de gidebilir ve
langchain_pg_embeddingtablosundaki kayıt sayısını sorgulamak için Cloud SQL Studio'yu kullanabilirsiniz.
6. Web uygulamasını yazma
Dosyayı app/server.py düzenleyicinizde açın. Aşağıdaki 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()
)
Ayrıca şu içe aktarmaları da 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'a dağıtma
Uygulamayı Cloud Run'a dağıtmak için run-rag dizininden 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 kodu Cloud Build'e yükleme
- docker build komutunu çalıştırın.
- Elde edilen container görüntüsünü Artifact Registry'ye aktarın.
- Container görüntüsünü kullanarak 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şfedin
Cloud Run hizmeti URL'sini açın ve /playground simgesine gidin. Metin alanı açılır. Bu aracı kullanarak Cloud Run sürüm notlarıyla ilgili sorular sorabilirsiniz. Örneğin:

9. Tebrikler
Cloud Run'da LangChain uygulamasını başarıyla oluşturup dağıttınız. Tebrikler!
Temel kavramlar şunlardır:
- Almayla Artırılmış Üretim (RAG) uygulaması oluşturmak 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.
- Daha uzun süren bir dizine ekleme işini Cloud Run işi olarak, 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şim kurmak için uygun 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 kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.
Projeyi tutmak istiyorsanız aşağıdaki kaynakları sildiğinizden emin olun:
- Cloud SQL örneği
- Cloud Run hizmeti
- Cloud Run işi