1. Tổng quan
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách triển khai một ứng dụng LangChain sử dụng Gemini để cho phép bạn đặt câu hỏi về ghi chú phát hành của Cloud Run.
Sau đây là một ví dụ về cách hoạt động của ứng dụng: Nếu bạn đặt câu hỏi "Tôi có thể gắn một vùng lưu trữ trên Cloud Storage làm ổ đĩa trong Cloud Run không?", ứng dụng sẽ trả lời "Có, kể từ ngày 19 tháng 1 năm 2024" hoặc một câu trả lời tương tự.
Để trả về các câu trả lời có căn cứ, trước tiên, ứng dụng sẽ truy xuất các ghi chú phát hành Cloud Run tương tự như câu hỏi, sau đó nhắc Gemini bằng cả câu hỏi và ghi chú phát hành. (Đây là một mẫu thường được gọi là RAG.) Dưới đây là sơ đồ minh hoạ cấu trúc của ứng dụng:

2. Thiết lập và yêu cầu
Trước tiên, hãy đảm bảo bạn đã thiết lập môi trường phát triển đúng cách.
- Bạn sẽ cần một dự án trên Google Cloud để triển khai các tài nguyên cần thiết cho ứng dụng.
- Để triển khai ứng dụng, bạn cần phải cài đặt gcloud trên máy cục bộ, xác thực và định cấu hình để sử dụng dự án.
gcloud auth logingcloud config set project
- Nếu muốn chạy ứng dụng trên máy cục bộ (tôi khuyên bạn nên làm như vậy), bạn cần đảm bảo rằng thông tin đăng nhập mặc định của ứng dụng được thiết lập chính xác, bao gồm cả việc thiết lập dự án hạn mức.
gcloud auth application-default logingcloud auth application-default set-quota-project
- Bạn cũng cần cài đặt phần mềm sau:
- Python (bắt buộc phải có phiên bản 3.11 trở lên)
- LangChain CLI
- poetry để quản lý phần phụ thuộc
- pipx để cài đặt và chạy LangChain CLI cũng như poetry trong các môi trường ảo riêng biệt
Đây là một blog giúp bạn bắt đầu cài đặt các công cụ cần thiết cho hướng dẫn này.
Máy trạm trên đám mây
Thay vì máy cục bộ, bạn cũng có thể sử dụng Cloud Workstations trên Google Cloud. Xin lưu ý rằng tính đến tháng 4 năm 2024, công cụ này chạy phiên bản Python thấp hơn 3.11, vì vậy, bạn có thể cần nâng cấp Python trước khi bắt đầu.
Bật Cloud API
Trước tiên, hãy chạy lệnh sau để đảm bảo bạn đã định cấu hình đúng dự án trên đám mây của Google để sử dụng:
gcloud config list project
Nếu dự án chính xác không xuất hiện, bạn có thể đặt dự án đó bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Bây giờ, hãy bật các API sau:
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
Chọn một khu vực
Google Cloud có mặt ở nhiều vị trí trên toàn cầu và bạn cần chọn một vị trí để triển khai các tài nguyên mà bạn sẽ sử dụng cho phòng thí nghiệm này. Đặt khu vực làm biến môi trường trong shell (các lệnh sau này sẽ sử dụng biến này):
export REGION=us-central1
3. Tạo thực thể cơ sở dữ liệu vectơ
Một phần quan trọng của ứng dụng này là truy xuất ghi chú phát hành phù hợp với câu hỏi của người dùng. Để cụ thể hơn, nếu bạn đang đặt câu hỏi về Cloud Storage, bạn muốn thêm ghi chú phát hành sau vào câu lệnh:
Bạn có thể sử dụng các bản nhúng văn bản và cơ sở dữ liệu vectơ để tìm các ghi chú phát hành tương tự về mặt ngữ nghĩa.
Tôi sẽ hướng dẫn bạn cách sử dụng PostgreSQL trên Cloud SQL làm cơ sở dữ liệu vectơ. Việc tạo một phiên bản Cloud SQL mới mất một chút thời gian, vì vậy, hãy thực hiện ngay bây giờ.
gcloud sql instances create sql-instance \ --database-version POSTGRES_14 \ --tier db-f1-micro \ --region $REGION
Bạn có thể để lệnh này chạy và tiếp tục thực hiện các bước tiếp theo. Đến một thời điểm nào đó, bạn sẽ cần tạo một cơ sở dữ liệu và thêm người dùng, nhưng hiện tại, chúng ta không nên lãng phí thời gian xem vòng quay.
PostgreSQL là một máy chủ cơ sở dữ liệu quan hệ và theo mặc định, mọi phiên bản Cloud SQL mới đều được cài đặt tiện ích pgvector. Điều này có nghĩa là bạn cũng có thể sử dụng PostgreSQL làm cơ sở dữ liệu vectơ.
4. Tạo khung cho ứng dụng LangChain
Để tiếp tục, bạn cần cài đặt LangChain CLI và poetry để quản lý các phần phụ thuộc. Sau đây là cách cài đặt các công cụ đó bằng pipx:
pipx install langchain-cli poetry
Tạo khung cho ứng dụng LangChain bằng lệnh sau. Khi được hỏi, hãy đặt tên cho thư mục là run-rag và bỏ qua việc cài đặt các gói bằng cách nhấn phím Enter:
langchain app new
Thay đổi thành thư mục run-rag và cài đặt các phần phụ thuộc
poetry install
Bạn vừa tạo một ứng dụng LangServe. LangServe bao bọc FastAPI xung quanh một chuỗi LangChain. Công cụ này có một sân chơi tích hợp giúp bạn dễ dàng gửi câu lệnh và kiểm tra kết quả, bao gồm cả tất cả các bước trung gian. Bạn nên mở thư mục run-rag trong trình chỉnh sửa và khám phá nội dung trong đó.
5. Tạo công việc lập chỉ mục
Trước khi bạn bắt đầu tạo ứng dụng web, hãy đảm bảo rằng ghi chú phát hành Cloud Run được lập chỉ mục trong cơ sở dữ liệu Cloud SQL. Trong phần này, bạn sẽ tạo một công việc lập chỉ mục thực hiện những việc sau:

Tác vụ lập chỉ mục sẽ lấy ghi chú phát hành, chuyển đổi ghi chú phát hành thành vectơ bằng mô hình nhúng văn bản và lưu trữ các vectơ đó trong cơ sở dữ liệu vectơ. Điều này giúp bạn tìm kiếm hiệu quả các ghi chú phát hành tương tự dựa trên ý nghĩa ngữ nghĩa của chúng.
Trong thư mục run-rag/app, hãy tạo một tệp indexer.py có nội dung sau:
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")
Thêm các phần phụ thuộc bắt buộc:
poetry add \ "cloud-sql-python-connector[pg8000]" \ langchain-google-vertexai==1.0.5 \ langchain-community==0.2.5 \ pgvector
Tạo cơ sở dữ liệu và người dùng
Tạo cơ sở dữ liệu release-notes trên phiên bản Cloud SQL sql-instance:
gcloud sql databases create release-notes --instance sql-instance
Tạo một người dùng cơ sở dữ liệu có tên là app:
gcloud sql users create app --instance sql-instance --password "myprecious"
Triển khai và chạy tác vụ lập chỉ mục
Bây giờ, hãy triển khai và chạy tác vụ:
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
Đó là một lệnh dài, hãy xem điều gì đang xảy ra:
Lệnh đầu tiên truy xuất tên kết nối (một mã nhận dạng duy nhất có định dạng là project:region:instance) và đặt tên đó làm biến môi trường DB_INSTANCE_NAME.
Lệnh thứ hai triển khai tác vụ Cloud Run. Sau đây là những việc mà các cờ này thực hiện:
--source .: Chỉ định rằng mã nguồn cho công việc nằm trong thư mục làm việc hiện tại (thư mục mà bạn đang chạy lệnh).--command python: Thiết lập lệnh để thực thi bên trong vùng chứa. Trong trường hợp này, đó là để chạy Python.--args app/indexer.py: Cung cấp các đối số cho lệnh python. Lệnh này yêu cầu chạy tập lệnh indexer.py trong thư mục ứng dụng.--set-env-vars: Đặt các biến môi trường mà tập lệnh Python có thể truy cập trong quá trình thực thi.--region=$REGION: Chỉ định khu vực mà bạn nên triển khai công việc.--execute-now: Yêu cầu Cloud Run bắt đầu công việc ngay sau khi công việc được triển khai.
Để xác minh rằng công việc đã hoàn tất thành công, bạn có thể làm như sau:
- Đọc nhật ký thực thi công việc thông qua bảng điều khiển web. Thông báo "Đã lưu: xxx ghi chú phát hành" (trong đó xxx là số lượng ghi chú phát hành đã lưu) sẽ xuất hiện.
- Bạn cũng có thể chuyển đến phiên bản Cloud SQL trong bảng điều khiển web và sử dụng Cloud SQL Studio để truy vấn số lượng bản ghi trong bảng
langchain_pg_embedding.
6. Viết ứng dụng web
Mở tệp app/server.py trong trình chỉnh sửa. Bạn sẽ thấy một dòng có nội dung như sau:
# Edit this to add the chain you want to add
Thay thế bình luận đó bằng đoạn mã sau:
# (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()
)
Bạn cũng cần thêm các lệnh nhập sau:
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
Cuối cùng, hãy thay đổi dòng "NotImplemented" thành:
# add_routes(app, NotImplemented)
add_routes(app, chain)
7. Triển khai ứng dụng web lên Cloud Run
Trong thư mục run-rag, hãy dùng lệnh sau để triển khai ứng dụng lên 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
Lệnh này sẽ thực hiện những việc sau:
- Tải mã nguồn lên Cloud Build
- Chạy lệnh docker build.
- Đẩy hình ảnh vùng chứa thu được vào Artifact Registry.
- Tạo một dịch vụ Cloud Run bằng hình ảnh vùng chứa.
Khi lệnh hoàn tất, lệnh này sẽ liệt kê một URL HTTPS trên miền run.app. Đây là URL công khai của dịch vụ Cloud Run mới
8. Khám phá sân chơi
Mở URL dịch vụ Cloud Run rồi chuyển đến /playground. Thao tác này sẽ mở ra một trường văn bản. Hãy sử dụng công cụ này để đặt câu hỏi về ghi chú phát hành của Cloud Run, chẳng hạn như tại đây:

9. Xin chúc mừng
Bạn đã tạo và triển khai thành công một ứng dụng LangChain trên Cloud Run. Chính xác!
Sau đây là các khái niệm chính:
- Sử dụng khung LangChain để tạo một ứng dụng Tạo thông tin tăng cường (RAG).
- Sử dụng PostgreSQL trên Cloud SQL làm cơ sở dữ liệu vectơ với pgvector (được cài đặt theo mặc định trên Cloud SQL).
- Chạy một tác vụ lập chỉ mục chạy lâu hơn dưới dạng tác vụ Cloud Run và một ứng dụng web dưới dạng dịch vụ Cloud Run.
- Bao bọc một chuỗi LangChain trong một ứng dụng FastAPI bằng LangServe, cung cấp một giao diện thuận tiện để tương tác với ứng dụng RAG của bạn.
Dọn dẹp
Để tránh bị tính phí cho tài khoản Google Cloud Platform đối với các tài nguyên được dùng trong hướng dẫn này, hãy làm như sau:
- Trong Cloud Console, hãy chuyển đến trang Quản lý tài nguyên.
- Trong danh sách dự án, hãy chọn dự án của bạn rồi nhấp vào Xoá.
- Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án.
Nếu bạn muốn giữ lại dự án, hãy nhớ xoá các tài nguyên sau:
- Phiên bản Cloud SQL
- Dịch vụ Cloud Run
- Công việc Cloud Run