1. ภาพรวม
ในโค้ดแล็บนี้ คุณจะได้เรียนรู้วิธีการติดตั้งใช้งานแอป LangChain ที่ใช้ Gemini เพื่อให้คุณถามคำถามเกี่ยวกับหมายเหตุประจำรุ่นของ Cloud Run ได้
ตัวอย่างการทำงานของแอปมีดังนี้ หากคุณถามว่า "ฉันจะติดตั้งที่เก็บข้อมูลในระบบคลาวด์เป็นวอลุ่มใน Cloud Run ได้ไหม" แอปจะตอบว่า "ได้ ตั้งแต่วันที่ 19 มกราคม 2024" หรือคำตอบที่คล้ายกัน
หากต้องการแสดงคำตอบที่อิงตามข้อมูลจริง แอปจะดึงบันทึกประจำรุ่นของ Cloud Run ที่คล้ายกับคำถามก่อน จากนั้นจะแจ้ง Gemini ด้วยทั้งคำถามและบันทึกประจำรุ่น (ซึ่งเป็นรูปแบบที่มักเรียกว่า RAG) แผนภาพต่อไปนี้แสดงสถาปัตยกรรมของแอป

2. การตั้งค่าและข้อกำหนด
ก่อนอื่น ให้ตรวจสอบว่าได้ตั้งค่าสภาพแวดล้อมการพัฒนาอย่างถูกต้อง
- คุณจะต้องมีโปรเจ็กต์ Google Cloud เพื่อติดตั้งใช้งานทรัพยากรที่จำเป็นสำหรับแอป
- หากต้องการติดตั้งใช้งานแอป คุณต้องติดตั้ง gcloud ในเครื่อง ตรวจสอบสิทธิ์ และกำหนดค่าให้ใช้โปรเจ็กต์
gcloud auth logingcloud config set project
- หากต้องการเรียกใช้แอปพลิเคชันในเครื่องของคุณ (ซึ่งเราขอแนะนำ) คุณต้องตรวจสอบว่าได้ตั้งค่าข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชันอย่างถูกต้องแล้ว ซึ่งรวมถึงการตั้งค่าโปรเจ็กต์โควต้า
gcloud auth application-default logingcloud auth application-default set-quota-project
- นอกจากนี้ คุณยังต้องติดตั้งซอฟต์แวร์ต่อไปนี้ด้วย
- Python (ต้องใช้เวอร์ชัน 3.11 ขึ้นไป)
- LangChain CLI
- poetry สำหรับการจัดการทรัพยากร Dependency
- pipx เพื่อติดตั้งและเรียกใช้ LangChain CLI และ Poetry ในสภาพแวดล้อมเสมือนที่แยกกัน
นี่คือบล็อกที่จะช่วยคุณติดตั้งเครื่องมือที่จำเป็นสำหรับการแนะนำแบบทีละขั้นนี้
Cloud Workstations
คุณยังใช้ Cloud Workstations ใน Google Cloud แทนเครื่องในพื้นที่ได้ด้วย โปรดทราบว่า ณ เดือนเมษายน 2024 จะใช้ Python เวอร์ชันต่ำกว่า 3.11 ดังนั้นคุณอาจต้องอัปเกรด Python ก่อนเริ่มต้นใช้งาน
เปิดใช้ Cloud API
ก่อนอื่น ให้เรียกใช้คำสั่งต่อไปนี้เพื่อให้แน่ใจว่าคุณได้กำหนดค่าโปรเจ็กต์ Google Cloud ที่ถูกต้องที่จะใช้แล้ว
gcloud config list project
หากโปรเจ็กต์ที่ถูกต้องไม่แสดง คุณสามารถตั้งค่าด้วยคำสั่งนี้
gcloud config set project <PROJECT_ID>
ตอนนี้ให้เปิดใช้ API ต่อไปนี้
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
เลือกภูมิภาค
Google Cloud พร้อมให้บริการในหลายแห่งทั่วโลก และคุณต้องเลือกแห่งใดแห่งหนึ่งเพื่อติดตั้งใช้งานทรัพยากรที่จะใช้ในแล็บนี้ ตั้งค่าภูมิภาคเป็นตัวแปรสภาพแวดล้อมในเชลล์ (คำสั่งในภายหลังจะใช้ตัวแปรนี้)
export REGION=us-central1
3. สร้างอินสแตนซ์ฐานข้อมูลเวกเตอร์
ส่วนสำคัญของแอปนี้คือการดึงข้อมูลบันทึกประจำรุ่นที่เกี่ยวข้องกับคำถามของผู้ใช้ เพื่อให้เห็นภาพชัดเจนยิ่งขึ้น หากคุณถามคำถามเกี่ยวกับ Cloud Storage คุณจะต้องเพิ่มหมายเหตุประจำรุ่นต่อไปนี้ลงในพรอมต์
คุณสามารถใช้การฝังข้อความและฐานข้อมูลเวกเตอร์เพื่อค้นหารุ่นที่คล้ายกันในเชิงความหมาย
ฉันจะแสดงวิธีใช้ PostgreSQL ใน Cloud SQL เป็นฐานข้อมูลเวกเตอร์ การสร้างอินสแตนซ์ Cloud SQL ใหม่ต้องใช้เวลาสักครู่ ดังนั้นมาสร้างกันเลย
gcloud sql instances create sql-instance \ --database-version POSTGRES_14 \ --tier db-f1-micro \ --region $REGION
คุณปล่อยให้คำสั่งนี้ทำงานและดำเนินการตามขั้นตอนถัดไปได้ คุณจะต้องสร้างฐานข้อมูลและเพิ่มผู้ใช้ในสักวันหนึ่ง แต่ตอนนี้เรามาดูที่วงกลมหมุนกันก่อน
PostgreSQL เป็นเซิร์ฟเวอร์ฐานข้อมูลเชิงสัมพันธ์ และอินสแตนซ์ใหม่ทุกอินสแตนซ์ของ Cloud SQL จะติดตั้งส่วนขยาย pgvector ไว้โดยค่าเริ่มต้น ซึ่งหมายความว่าคุณยังใช้เป็นฐานข้อมูลเวกเตอร์ได้ด้วย
4. สร้างโครงร่างแอป LangChain
หากต้องการดำเนินการต่อ คุณจะต้องติดตั้ง LangChain CLI และ Poetry เพื่อจัดการการอ้างอิง วิธีติดตั้งโดยใช้ pipx มีดังนี้
pipx install langchain-cli poetry
สร้างโครงร่างแอป LangChain ด้วยคำสั่งต่อไปนี้ เมื่อระบบถาม ให้ตั้งชื่อโฟลเดอร์เป็น run-rag แล้วข้ามการติดตั้งแพ็กเกจโดยกด Enter
langchain app new
เปลี่ยนเป็นไดเรกทอรี run-rag แล้วติดตั้งทรัพยากร Dependency
poetry install
คุณเพิ่งสร้างแอป LangServe LangServe จะห่อหุ้ม FastAPI รอบเชน LangChain มาพร้อมกับพื้นที่ทดลองในตัวที่ช่วยให้ส่งพรอมต์และตรวจสอบผลลัพธ์ รวมถึงขั้นตอนกลางทั้งหมดได้ง่ายๆ เราขอแนะนำให้คุณเปิดโฟลเดอร์ run-rag ในโปรแกรมแก้ไขและดูว่ามีอะไรบ้าง
5. สร้างงานการจัดทำดัชนี
ก่อนเริ่มสร้างเว็บแอป โปรดตรวจสอบว่ามีการจัดทำดัชนีหมายเหตุประจำรุ่นของ Cloud Run ในฐานข้อมูล Cloud SQL แล้ว ในส่วนนี้ คุณจะได้สร้างงานจัดทำดัชนีที่ทำสิ่งต่อไปนี้

งานจัดทำดัชนีจะนำบันทึกประจำรุ่นมาแปลงเป็นเวกเตอร์โดยใช้โมเดลการฝังข้อความ และจัดเก็บไว้ในฐานข้อมูลเวกเตอร์ ซึ่งช่วยให้ค้นหาหมายเหตุประจำรุ่นที่คล้ายกันได้อย่างมีประสิทธิภาพตามความหมายเชิงความหมาย
สร้างไฟล์ indexer.py ในโฟลเดอร์ run-rag/app โดยมีเนื้อหาดังนี้
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")
เพิ่มการขึ้นต่อกันที่จำเป็น
poetry add \ "cloud-sql-python-connector[pg8000]" \ langchain-google-vertexai==1.0.5 \ langchain-community==0.2.5 \ pgvector
สร้างฐานข้อมูลและผู้ใช้
สร้างฐานข้อมูลrelease-notesในอินสแตนซ์ Cloud SQLsql-instance
gcloud sql databases create release-notes --instance sql-instance
สร้างผู้ใช้ฐานข้อมูลชื่อ app โดยทำดังนี้
gcloud sql users create app --instance sql-instance --password "myprecious"
ติดตั้งใช้งานและเรียกใช้ชื่องานการจัดทำดัชนี
ตอนนี้ให้ติดตั้งใช้งานและเรียกใช้ชื่องาน
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
คำสั่งนี้ยาวมาก มาดูกันว่าเกิดอะไรขึ้น
คำสั่งแรกจะดึงชื่อการเชื่อมต่อ (รหัสที่ไม่ซ้ำกันในรูปแบบ project:region:instance) และตั้งค่าเป็นตัวแปรสภาพแวดล้อม DB_INSTANCE_NAME
ส่วนคำสั่งที่ 2 จะเป็นการติดตั้งใช้งานงาน Cloud Run โดยฟีเจอร์นี้จะทำสิ่งต่อไปนี้
--source .: ระบุว่าซอร์สโค้ดของงานอยู่ในไดเรกทอรีการทำงานปัจจุบัน (ไดเรกทอรีที่คุณเรียกใช้คำสั่ง)--command python: ตั้งค่าคำสั่งที่จะเรียกใช้ภายในคอนเทนเนอร์ ในกรณีนี้คือการเรียกใช้ Python--args app/indexer.py: ระบุอาร์กิวเมนต์ให้กับคำสั่ง Python ซึ่งจะสั่งให้เรียกใช้สคริปต์ indexer.py ในไดเรกทอรีของแอป--set-env-vars: ตั้งค่าตัวแปรสภาพแวดล้อมที่สคริปต์ Python สามารถเข้าถึงได้ในระหว่างการดำเนินการ--region=$REGION: ระบุภูมิภาคที่ควรทำให้งานใช้งานได้--execute-now: บอกให้ Cloud Run เริ่มงานทันทีหลังจากที่ทำให้ใช้งานได้
หากต้องการยืนยันว่างานเสร็จสมบูรณ์แล้ว ให้ทำดังนี้
- อ่านบันทึกการดำเนินการของงานผ่านเว็บคอนโซล โดยควรรายงานว่า "บันทึกบันทึกประจำรุ่น xxx รายการเสร็จสมบูรณ์แล้ว" (โดย xxx คือจำนวนบันทึกประจำรุ่นที่บันทึกไว้)
- นอกจากนี้ คุณยังไปที่อินสแตนซ์ Cloud SQL ในเว็บคอนโซล และใช้ Cloud SQL Studio เพื่อค้นหาจำนวนระเบียนในตาราง
langchain_pg_embeddingได้ด้วย
6. เขียนเว็บแอปพลิเคชัน
เปิดไฟล์ app/server.py ในโปรแกรมแก้ไข คุณจะเห็นบรรทัดที่มีข้อความต่อไปนี้
# Edit this to add the chain you want to add
แทนที่ความคิดเห็นนั้นด้วยข้อมูลโค้ดต่อไปนี้
# (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()
)
นอกจากนี้ คุณยังต้องเพิ่มการนำเข้าต่อไปนี้ด้วย
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
สุดท้าย ให้เปลี่ยนบรรทัดที่ระบุว่า "NotImplemented" เป็น
# add_routes(app, NotImplemented)
add_routes(app, chain)
7. ทําให้เว็บแอปพลิเคชันใช้งานได้ใน Cloud Run
จากไดเรกทอรี run-rag ให้ใช้คำสั่งต่อไปนี้เพื่อทำให้แอปใช้งานได้กับ Cloud Run
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
คำสั่งนี้จะทำสิ่งต่อไปนี้
- อัปโหลดซอร์สโค้ดไปยัง Cloud Build
- เรียกใช้ docker build
- พุชอิมเมจคอนเทนเนอร์ที่ได้ไปยัง Artifact Registry
- สร้างบริการ Cloud Run โดยใช้อิมเมจคอนเทนเนอร์
เมื่อคำสั่งเสร็จสมบูรณ์ ระบบจะแสดงรายการ HTTPS URL ในโดเมน run.app นี่คือ URL สาธารณะของบริการ Cloud Run ใหม่
8. สำรวจ Playground
เปิด URL ของบริการ Cloud Run แล้วไปที่ /playground ซึ่งจะแสดงช่องข้อความ ใช้เพื่อถามคำถามเกี่ยวกับบันทึกประจำรุ่นของ Cloud Run เช่น ที่นี่

9. ขอแสดงความยินดี
คุณสร้างและทำให้แอป LangChain ใช้งานได้บน Cloud Run เรียบร้อยแล้ว เยี่ยมมาก!
แนวคิดหลักมีดังนี้
- การใช้เฟรมเวิร์ก LangChain เพื่อสร้างแอปพลิเคชันการสร้างที่ดึงข้อมูลมาเสริม (RAG)
- ใช้ PostgreSQL ใน Cloud SQL เป็นฐานข้อมูลเวกเตอร์ด้วย pgvector ซึ่งติดตั้งไว้ใน Cloud SQL โดยค่าเริ่มต้น
- เรียกใช้งานดัชนีที่ใช้เวลานานกว่าเป็นงาน Cloud Run และเว็บแอปพลิเคชันเป็นบริการ Cloud Run
- ห่อหุ้มเชน LangChain ในแอปพลิเคชัน FastAPI ด้วย LangServe ซึ่งมีอินเทอร์เฟซที่สะดวกในการโต้ตอบกับแอป RAG
ล้างข้อมูล
โปรดดำเนินการดังนี้เพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud Platform สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้
- ใน Cloud Console ให้ไปที่หน้าจัดการทรัพยากร
- เลือกโปรเจ็กต์ในรายการโปรเจ็กต์ แล้วคลิกลบ
- ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเพื่อลบโปรเจ็กต์
หากต้องการเก็บโปรเจ็กต์ไว้ ให้ลบทรัพยากรต่อไปนี้
- อินสแตนซ์ Cloud SQL
- บริการ Cloud Run
- งานใน Cloud Run