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