1. Обзор
В этом практическом занятии вы узнаете, как развернуть приложение LangChain, использующее Gemini для отправки вопросов по поводу примечаний к выпуску Cloud Run.
Вот пример того, как работает приложение: если вы зададите вопрос «Можно ли смонтировать хранилище Cloud Storage в качестве тома в Cloud Run?», приложение ответит «Да, с 19 января 2024 года» или что-то подобное.
Для получения обоснованных ответов приложение сначала получает примечания к выпуску Cloud Run, похожие на заданный вопрос, а затем запрашивает у Gemini как сам вопрос, так и примечания к выпуску. (Этот шаблон обычно называют RAG.) Вот диаграмма, показывающая архитектуру приложения:

2. Настройка и требования
Для начала давайте убедимся, что ваша среда разработки настроена правильно.
- Для развертывания необходимых ресурсов для приложения вам потребуется проект Google Cloud .
- Для развертывания приложения вам необходимо установить gcloud на свой локальный компьютер, пройти аутентификацию и настроить использование проекта.
-
gcloud auth login -
gcloud config set project
-
- Если вы хотите запустить приложение на локальном компьютере, что я рекомендую, вам необходимо убедиться, что учетные данные приложения по умолчанию настроены правильно, включая настройку квоты проекта .
-
gcloud auth application-default login -
gcloud auth application-default set-quota-project
-
- Вам также необходимо установить следующее программное обеспечение:
- Требуется Python (версия 3.11 или выше).
- Интерфейс командной строки LangChain
- поэзия для управления зависимостью
- pipx для установки и запуска LangChain CLI и poetry в изолированных виртуальных средах.
Вот ссылка на блог, который поможет вам начать установку инструментов, необходимых для выполнения этого пошагового руководства.
Облачные рабочие станции
Вместо локального компьютера вы также можете использовать облачные рабочие станции Google Cloud. Обратите внимание, что по состоянию на апрель 2024 года используется версия Python ниже 3.11, поэтому вам может потребоваться обновить Python перед началом работы.
Включите облачные 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. Создайте экземпляр векторной базы данных.
Ключевая функция этого приложения — получение примечаний к выпуску, имеющих отношение к вопросу пользователя. Чтобы сделать это более конкретным, если вы задаете вопрос о облачном хранилище, вам нужно добавить в запрос следующее примечание к выпуску:
Для поиска семантически похожих примечаний к выпуску можно использовать векторные представления текста и базу данных векторов.
Я покажу вам, как использовать 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 и установите зависимости.
poetry install
Вы только что создали приложение LangServe . LangServe — это оболочка FastAPI для цепочки LangChain. В неё входит встроенная среда разработки, которая упрощает отправку запросов и проверку результатов, включая все промежуточные этапы. Я предлагаю вам открыть папку run-rag в вашем редакторе и изучить её содержимое.
5. Создайте задание индексирования.
Прежде чем приступить к созданию веб-приложения, давайте убедимся, что примечания к выпуску Cloud Run проиндексированы в базе данных Cloud SQL. В этом разделе вы создадите задание индексирования, которое выполнит следующие действия:

Процесс индексирования берет примечания к выпуску, преобразует их в векторные представления с использованием модели встраивания текста и сохраняет в векторной базе данных. Это позволяет эффективно искать похожие примечания к выпуску на основе их семантического значения.
В папке run-rag/app создайте файл indexer.py со следующим содержимым:
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 SQL: sql-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 .
Вторая команда развертывает задание 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.
Для развертывания приложения в Cloud Run из каталога run-rag используйте следующую команду:
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`.
- Загрузите полученный образ контейнера в реестр артефактов.
- Создайте службу Cloud Run, используя образ контейнера.
После завершения выполнения команды отобразится HTTPS-адрес в домене run.app. Это публичный URL-адрес вашей новой службы Cloud Run.
8. Исследуйте игровую площадку.
Откройте URL-адрес сервиса Cloud Run и перейдите по адресу /playground . Откроется текстовое поле. Используйте его, чтобы задать вопросы по поводу примечаний к выпуску Cloud Run, например, здесь:

9. Поздравляем!
Вы успешно создали и развернули приложение LangChain в Cloud Run. Отлично!
Вот основные понятия:
- Использование фреймворка LangChain для создания приложения Retrieval Augmented Generation (RAG).
- Использование PostgreSQL в Cloud SQL в качестве векторной базы данных с помощью pgvector, который установлен по умолчанию в Cloud SQL.
- Запустите длительную задачу индексирования как задачу Cloud Run, а веб-приложение — как сервис Cloud Run.
- Встройте цепочку LangChain в приложение FastAPI с помощью LangServe, обеспечив удобный интерфейс для взаимодействия с вашим RAG-приложением.
Уборка
Чтобы избежать списания средств с вашего счета Google Cloud Platform за ресурсы, использованные в этом руководстве:
- В консоли Cloud перейдите на страницу «Управление ресурсами».
- В списке проектов выберите свой проект и нажмите «Удалить».
- В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить», чтобы удалить проект.
Если вы хотите сохранить проект, обязательно удалите следующие ресурсы:
- Экземпляр Cloud SQL
- Сервис Cloud Run
- Задание Cloud Run