1. Введение
Меня всегда завораживала напряженность зала суда, и я представлял, как ловко справляюсь с его сложными ситуациями и выступаю с убедительными заключительными аргументами. Хотя мой карьерный путь вел меня в другом направлении, я рад поделиться тем, что с помощью искусственного интеллекта мы все можем приблизиться к осуществлению этой мечты о суде.
Сегодня мы подробно рассмотрим, как использовать мощные инструменты искусственного интеллекта Google, такие как Vertex AI, Firestore и Cloud Run Functions, для обработки и понимания юридических данных, выполнения молниеносного поиска и, возможно, как минимум, для того, чтобы помочь вашему воображаемому клиенту (или себе) выбраться из сложной ситуации.
Возможно, вам не придется проводить перекрестный допрос свидетеля, но с нашей системой вы сможете анализировать горы информации, составлять понятные сводки и представлять наиболее важные данные за считанные секунды.
2. Архитектура
Этот проект посвящен созданию помощника юриста с использованием инструментов искусственного интеллекта Google Cloud, уделяя особое внимание обработке, пониманию и поиску юридических данных. Система предназначена для анализа больших объемов информации, формирования сводок и быстрого представления релевантных данных. Архитектура помощника юриста включает несколько ключевых компонентов:
Создание базы знаний на основе неструктурированных данных : Google Cloud Storage (GCS) используется для хранения юридических документов. Firestore, база данных NoSQL, функционирует как хранилище векторных данных, храня фрагменты документов и соответствующие им вложения. В Firestore реализован векторный поиск для поиска по сходству. При загрузке нового юридического документа в GCS Eventarc запускает функцию Cloud Run. Эта функция обрабатывает документ, разбивая его на фрагменты и генерируя вложения для каждого фрагмента, используя модель встраивания текста Vertex AI. Эти вложения затем сохраняются в Firestore вместе с текстовыми фрагментами.
Приложение на базе LLM и RAG : ядром вопросно-ответной системы является функция ask_llm
, которая использует библиотеку langchain для взаимодействия с большой языковой моделью Vertex AI Gemini. Функция создаёт HumanMessage на основе запроса пользователя и включает SystemMessage, предписывающий LLM действовать как полезный юридический помощник. Система использует подход RAG (Retrieval-Augmented Generation), при котором перед ответом на запрос система использует функцию search_resource
для извлечения соответствующего контекста из хранилища векторов Firestore. Этот контекст затем включается в SystemMessage, чтобы обосновать ответ LLM предоставленной юридической информацией.
Проект направлен на отход от «творческих интерпретаций» магистров права (LLM) с помощью RAG, которая сначала извлекает релевантную информацию из надежного юридического источника, прежде чем сгенерировать ответ. Это приводит к более точным и обоснованным ответам, основанным на актуальной юридической информации. Система построена с использованием различных сервисов Google Cloud, таких как Google Cloud Shell, Vertex AI, Firestore, Cloud Run и Eventarc.
3. Прежде чем начать
В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud. Убедитесь, что для вашего проекта Cloud включена оплата. Узнайте, как проверить, включена ли оплата для проекта .
Включить Gemini Code Assist в Cloud Shell IDE
👉 В консоли Google Cloud перейдите в раздел Gemini Code Assist Tools , включите Gemini Code Assist бесплатно, согласившись с условиями.
Игнорируйте настройку разрешений, покиньте эту страницу.
Работа над редактором Cloud Shell
👉 Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud (это значок в форме терминала в верхней части панели Cloud Shell).
👉 Нажмите кнопку «Открыть редактор» (она выглядит как открытая папка с карандашом). В окне откроется редактор Cloud Shell. Слева вы увидите проводник.
👉 Нажмите кнопку входа в Cloud Code в нижней строке состояния, как показано на рисунке. Авторизуйте плагин, следуя инструкциям. Если в строке состояния вы видите «Cloud Code — нет проекта» , выберите его, затем в раскрывающемся списке «Выбрать проект Google Cloud» выберите проект Google Cloud из списка проектов, с которыми вы планируете работать.
👉 Откройте терминал в облачной IDE,
👉 В новом терминале убедитесь, что вы уже аутентифицированы и что проекту присвоен ваш идентификатор проекта, с помощью следующей команды:
gcloud auth list
👉 Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud.
gcloud config set project <YOUR_PROJECT_ID>
👉 Выполните следующую команду, чтобы включить необходимые API Google Cloud:
gcloud services enable storage.googleapis.com \
run.googleapis.com \
artifactregistry.googleapis.com \
aiplatform.googleapis.com \
eventarc.googleapis.com \
cloudresourcemanager.googleapis.com \
firestore.googleapis.com \
cloudaicompanion.googleapis.com
На панели инструментов Cloud Shell (в верхней части окна Cloud Shell) нажмите кнопку «Открыть редактор» (она выглядит как открытая папка с карандашом). В окне откроется редактор кода Cloud Shell. Слева вы увидите проводник.
👉 В терминале загрузите проект Bootstrap Skeleton:
git clone https://github.com/weimeilin79/legal-eagle.git
ДОПОЛНИТЕЛЬНО: ИСПАНСКАЯ ВЕРСИЯ
👉 Существует альтернативная версия на испанском языке. Пожалуйста, воспользуйтесь следующей инструкцией, чтобы клонировать правильную версию.
git clone -b spanish https://github.com/weimeilin79/legal-eagle.git
После выполнения этой команды в терминале Cloud Shell в вашей среде Cloud Shell будет создана новая папка с именем репозитория legal-eagle
.
4. Написание приложения вывода с помощью Gemini Code Assist
В этом разделе мы сосредоточимся на создании ядра нашего юридического помощника — веб-приложения, которое принимает вопросы пользователей и взаимодействует с моделью искусственного интеллекта для генерации ответов. Для написания кода Python для этой части вывода мы воспользуемся Gemini Code Assist.
Сначала мы создадим приложение Flask, которое будет использовать библиотеку LangChain для прямого взаимодействия с моделью Vertex AI Gemini. Эта первая версия будет выступать в роли полезного помощника юриста, основанного на общих знаниях модели, но пока не будет иметь доступа к документам нашего судебного дела. Это позволит нам оценить базовую производительность LLM, прежде чем мы позже улучшим её с помощью RAG.
В панели проводника Cloud Code Editor (обычно слева) вы увидите папку, созданную при клонировании Git-репозитория legal-eagle
. Откройте корневую папку вашего проекта в проводнике. В ней вы найдете подпапку webapp
, которую также откройте.
👉 Редактируйте файл legal.py
в Cloud Code Editor, вы можете использовать различные методы для вызова Gemini Code Assist.
👉 Скопируйте следующую подсказку в конец файла legal.py
, которая четко описывает, что именно вы хотите, чтобы сгенерировал Gemini Code Assist, нажмите на появившийся значок лампочки 💡 и выберите Gemini: Generate Code (точный пункт меню может незначительно отличаться в зависимости от версии Cloud Code).
"""
Write a Python function called `ask_llm` that takes a user `query` as input. This function should use the `langchain` library to interact with a Vertex AI Gemini Large Language Model. Specifically, it should:
1. Create a `HumanMessage` object from the user's `query`.
2. Create a `ChatPromptTemplate` that includes a `SystemMessage` and the `HumanMessage`. The system message should instruct the LLM to act as a helpful assistant in a courtroom setting, aiding an attorney by providing necessary information. It should also specify that the LLM should respond in a high-energy tone, using no more than 100 words, and offer a humorous apology if it doesn't know the answer.
3. Format the `ChatPromptTemplate` with the provided messages.
4. Invoke the Vertex AI LLM with the formatted prompt using the `VertexAI` class (assuming it's already initialized elsewhere as `llm`).
5. Print the LLM's `response`.
6. Return the `response`.
7. Include error handling that prints an error message to the console and returns a user-friendly error message if any issues occur during the process. The Vertex AI model should be "gemini-2.0-flash".
"""
Внимательно проверьте сгенерированный код.
- Соответствует ли это примерно тем шагам, которые вы описали в комментарии?
- Создает ли он
ChatPromptTemplate
сSystemMessage
иHumanMessage
? - Включает ли он базовую обработку ошибок (
try...except
)?
Если сгенерированный код хорош и в целом корректен, вы можете принять его (нажмите Tab или Enter для получения встроенных предложений или нажмите «Принять» для получения более крупных блоков кода).
Если сгенерированный код не совсем тот, что вам нужен, или содержит ошибки, не волнуйтесь! Gemini Code Assist — это инструмент, который поможет вам, а не напишет идеальный код с первой попытки.
Отредактируйте и измените сгенерированный код, чтобы улучшить его, исправить ошибки и лучше соответствовать вашим требованиям. Вы можете дополнительно подсказать Gemini Code Assist , добавив комментарии или задав конкретные вопросы в чате Code Assist.
А если вы все еще новичок в работе с SDK, вот рабочий пример.
👉 Скопируйте, вставьте и ЗАМЕНИТЕ следующий код в ваш legal.py
:
import os
import signal
import sys
import vertexai
import random
from langchain_google_vertexai import VertexAI
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
from langchain_core.messages import HumanMessage, SystemMessage
# Connect to resourse needed from Google Cloud
llm = VertexAI(model_name="gemini-2.0-flash")
def ask_llm(query):
try:
query_message = {
"type": "text",
"text": query,
}
input_msg = HumanMessage(content=[query_message])
prompt_template = ChatPromptTemplate.from_messages(
[
SystemMessage(
content=(
"You are a helpful assistant, and you are with the attorney in a courtroom, you are helping him to win the case by providing the information he needs "
"Don't answer if you don't know the answer, just say sorry in a funny way possible"
"Use high engergy tone, don't use more than 100 words to answer"
# f"Here is some past conversation history between you and the user {relevant_history}"
# f"Here is some context that is relevant to the question {relevant_resource} that you might use"
)
),
input_msg,
]
)
prompt = prompt_template.format()
response = llm.invoke(prompt)
print(f"response: {response}")
return response
except Exception as e:
print(f"Error sending message to chatbot: {e}") # Log this error too!
return f"Unable to process your request at this time. Due to the following reason: {str(e)}"
👉 ДОПОЛНИТЕЛЬНО: ИСПАНСКАЯ ВЕРСИЯ
Sustituye el siguiente texto como se indica: You are a helpful assistant,
« You are a helpful assistant that speaks Spanish,
Далее создадим функцию для обработки маршрута, которая будет отвечать на вопросы пользователя.
Откройте main.py
в редакторе Cloud Shell. Аналогично тому, как вы создали ask_llm в legal.py
, используйте Gemini Code Assist для генерации маршрута Flask и функции ask_question . Введите следующий PROMPT в качестве комментария в main.py
: (Убедитесь, что он добавлен перед запуском приложения Flask в if __name__ == "__main__":
)
.....
@app.route('/',methods=['GET'])
def index():
return render_template('index.html')
"""
PROMPT:
Create a Flask endpoint that accepts POST requests at the '/ask' route.
The request should contain a JSON payload with a 'question' field. Extract the question from the JSON payload.
Call a function named ask_llm (located in a file named legal.py) with the extracted question as an argument.
Return the result of the ask_llm function as the response with a 200 status code.
If any error occurs during the process, return a 500 status code with the error message.
"""
# Add this block to start the Flask app when running locally
if __name__ == "__main__":
.....
Принимайте ТОЛЬКО если сгенерированный код хороший и в целом корректный. Если вы не знакомы с Python, вот рабочий пример, скопируйте его и вставьте в main.py
под уже существующим кодом.
👉 Обязательно вставьте следующее ДО запуска веб-приложения (если имя == "main":)
@app.route('/ask', methods=['POST'])
def ask_question():
data = request.get_json()
question = data.get('question')
try:
# call the ask_llm in legal.py
answer_markdown = legal.ask_llm(question)
print(f"answer_markdown: {answer_markdown}")
# Return the Markdown as the response
return answer_markdown, 200
except Exception as e:
return f"Error: {str(e)}", 500 # Handle errors appropriately
Выполнив эти шаги, вы сможете успешно включить Gemini Code Assist , настроить свой проект и использовать его для генерации функции ask
в файле main.py
5. Локальное тестирование в Cloud Editor
👉 В терминале редактора установите зависимые библиотеки и запустите веб-интерфейс локально.
cd ~/legal-eagle/webapp
python -m venv env
source env/bin/activate
export PROJECT_ID=$(gcloud config get project)
pip install -r requirements.txt
python main.py
Обратите внимание на сообщения о запуске в терминале Cloud Shell. Flask обычно выводит сообщения о том, что он запущен и на каком порту.
- Работает на http://127.0.0.1:8080
Приложение должно продолжать работать для обслуживания запросов.
👉 В меню «Веб-просмотр» выберите «Просмотр на порту 8080» . Cloud Shell откроет новую вкладку или окно браузера с веб-просмотром вашего приложения.
👉 В интерфейсе приложения введите несколько вопросов, связанных с ссылками на юридические дела, и посмотрите, как ответит LLM. Например, можно попробовать:
- К какому сроку тюремного заключения был приговорен Майкл Браун?
- Сколько денег было получено в результате несанкционированных списаний в результате действий Джейн Смит?
- Какую роль сыграли показания соседей в расследовании дела Эмили Уайт?
👉 ДОПОЛНИТЕЛЬНО: ИСПАНСКАЯ ВЕРСИЯ
- Сколько времени прошло с приговором Майклу Брауну?
- ¿Какие деньги и грузы не авторизованы, если они получены в результате действий Джейн Смит?
- ¿Qué papel jugaron los vecinos de los vecinos в расследовании дела Эмили Уайт?
Если внимательно посмотреть на ответы, то, скорее всего, вы заметите, что модель может галлюцинировать, быть расплывчатой или обобщенной, а иногда и неверно истолковывать ваши вопросы, особенно учитывая, что у нее еще нет доступа к конкретным юридическим документам.
👉 Остановите выполнение скрипта, нажав Ctrl+C .
👉 Выйдите из виртуального окружения, в терминале выполните:
deactivate
6. Настройка хранилища векторов
Пора положить конец этим «творческим интерпретациям» закона, свойственным LLM. Вот тут-то и приходит на помощь технология Retrieval-Augmented Generation (RAG)! Представьте, что вы предоставляете нашему LLM доступ к супермощной юридической библиотеке прямо перед тем, как он ответит на ваши вопросы. Вместо того, чтобы полагаться исключительно на свои общие знания (которые могут быть неполными или устаревшими в зависимости от модели), RAG сначала извлекает релевантную информацию из надежного источника — в нашем случае, из юридических документов — а затем использует этот контекст для генерации гораздо более обоснованного и точного ответа. Это как если бы LLM делал домашнее задание перед тем, как войти в зал суда!
Для создания нашей системы RAG нам нужно место для хранения всех юридических документов и, что важно, возможность поиска по ним по смыслу. Вот тут-то и пригодится Firestore! Firestore — это гибкая и масштабируемая NoSQL-база данных документов от Google Cloud.
Мы будем использовать Firestore в качестве хранилища векторных данных . Мы будем хранить фрагменты наших юридических документов в Firestore , и для каждого фрагмента мы также будем хранить его вложение — числовое представление его значения.
Затем, когда вы зададите вопрос нашему Legal Eagle, мы воспользуемся векторным поиском Firestore, чтобы найти фрагменты юридического текста, наиболее релевантные вашему запросу. Именно этот найденный контекст RAG использует, чтобы давать вам ответы, основанные на реальной юридической информации, а не на фантазиях LLM!
👉 В новой вкладке/окне перейдите в Firestore в консоли Google Cloud .
👉 Нажмите «Создать базу данных».
👉 Выберите Native mode
и имя базы данных (default)
.
👉 Выберите один region
: us-central1
и нажмите «Создать базу данных» . Firestore подготовит вашу базу данных, это может занять несколько минут.
👉 Вернитесь в терминал Cloud IDE — создайте векторный индекс в поле embedding_vector, чтобы включить поиск векторов в вашей коллекции legal_documents.
export PROJECT_ID=$(gcloud config get project)
gcloud firestore indexes composite create \
--collection-group=legal_documents \
--query-scope=COLLECTION \
--field-config field-path=embedding,vector-config='{"dimension":"768", "flat": "{}"}' \
--project=${PROJECT_ID}
Firestore начнёт создание векторного индекса. Создание индекса может занять некоторое время, особенно для больших наборов данных. Вы увидите индекс в состоянии «Создание», а после завершения создания он перейдёт в состояние «Готово».
7. Загрузка данных в хранилище векторов
Теперь, когда мы разобрались с RAG и нашим хранилищем векторных данных, пришло время создать движок, который будет наполнять нашу юридическую библиотеку! Итак, как сделать юридические документы «поисковыми по смыслу»? Вся магия кроется во встраивании! Представьте себе встраивание как преобразование слов, предложений или даже целых документов в числовые векторы – списки чисел, отражающие их семантическое значение. Схожие понятия дают векторы, «близкие» друг к другу в векторном пространстве. Для выполнения этого преобразования мы используем мощные модели (например, из Vertex AI).
Для автоматизации загрузки документов мы будем использовать функции Cloud Run и Eventarc . Cloud Run Functions — это лёгкий бессерверный контейнер, который запускает ваш код только при необходимости. Мы упакуем наш Python-скрипт для обработки документов в контейнер и развернем его как функцию Cloud Run.
👉 В новой вкладке/окне перейдите в Облачное хранилище .
👉 Нажмите «Корзины» в меню слева.
👉 Нажмите кнопку «+ СОЗДАТЬ» вверху.
👉 Настройте свой контейнер (важные настройки):
- Имя контейнера : 'yourprojectID' -doc-bucket (В конце ОБЯЗАТЕЛЬНО должен быть суффикс -doc-bucket )
- регион : выберите регион
us-central1
. - Класс хранилища : «Стандартный». Подходит для часто используемых данных.
- Контроль доступа : оставьте выбранным значение по умолчанию «Единый контроль доступа». Это обеспечивает единообразный контроль доступа на уровне контейнера.
- Расширенные параметры : для этого руководства обычно достаточно настроек по умолчанию.
👉 Нажмите кнопку СОЗДАТЬ , чтобы создать свой контейнер.
👉 Возможно, появится всплывающее окно с сообщением о запрете публичного доступа. Оставьте флажок установленным и нажмите «Подтвердить».
Теперь ваш новый контейнер появится в списке контейнеров. Запомните название контейнера — оно понадобится вам позже.
8. Настройте функцию Cloud Run
👉 В редакторе кода Cloud Shell перейдите в рабочий каталог legal-eagle : Используйте команду cd в терминале Cloud Editor, чтобы создать папку.
cd ~/legal-eagle
mkdir loader
cd loader
👉 Создайте файлы main.py
, requirements.txt
и Dockerfile
. В терминале Cloud Shell используйте команду touch для создания файлов:
touch main.py requirements.txt Dockerfile
Вы увидите вновь созданную папку под названием *loader
и три файла.
👉 Отредактируйте main.py
в папке loader
. В проводнике слева перейдите в каталог, где были созданы файлы, и дважды щёлкните по файлу main.py
, чтобы открыть его в редакторе.
Вставьте следующий код Python в main.py
:
Это приложение обрабатывает новые файлы, загруженные в контейнер GCS, разбивает текст на фрагменты, генерирует вложения для каждого фрагмента и сохраняет фрагменты и их вложения в Firestore.
import os
import json
from google.cloud import storage
import functions_framework
from langchain_google_vertexai import VertexAI, VertexAIEmbeddings
from langchain_google_firestore import FirestoreVectorStore
from langchain.text_splitter import RecursiveCharacterTextSplitter
import vertexai
PROJECT_ID = os.environ.get("GOOGLE_CLOUD_PROJECT") # Get project ID from env
embedding_model = VertexAIEmbeddings(
model_name="text-embedding-004" ,
project=PROJECT_ID,)
COLLECTION_NAME = "legal_documents"
# Create a vector store
vector_store = FirestoreVectorStore(
collection="legal_documents",
embedding_service=embedding_model,
content_field="original_text",
embedding_field="embedding",
)
@functions_framework.cloud_event
def process_file(cloud_event):
print(f"CloudEvent received: {cloud_event.data}") # Print the parsed event data
"""Triggered by a Cloud Storage event.
Args:
cloud_event (functions_framework.CloudEvent): The CloudEvent
containing the Cloud Storage event data.
"""
try:
event_data = cloud_event.data
bucket_name = event_data['bucket']
file_name = event_data['name']
except (json.JSONDecodeError, AttributeError, KeyError) as e: # Catch JSON errors
print(f"Error decoding CloudEvent data: {e} - Data: {cloud_event.data}")
return "Error processing event", 500 # Return an error response
print(f"New file detected in bucket: {bucket_name}, file: {file_name}")
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob = bucket.blob(file_name)
try:
# Download the file content as string (assuming UTF-8 encoded text file)
file_content_string = blob.download_as_string().decode("utf-8")
print(f"File content downloaded. Processing...")
# Split text into chunks using RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=100,
length_function=len,
)
text_chunks = text_splitter.split_text(file_content_string)
print(f"Text split into {len(text_chunks)} chunks.")
# Add the docs to the vector store
vector_store.add_texts(text_chunks)
print(f"File processing and Firestore upsert complete for file: {file_name}")
return "File processed successfully", 200 # Return success response
except Exception as e:
print(f"Error processing file {file_name}: {e}")
Отредактируйте файл requirements.txt
. Вставьте в файл следующие строки:
Flask==2.3.3
requests==2.31.0
google-generativeai>=0.2.0
langchain
langchain_google_vertexai
langchain-community
langchain-google-firestore
google-cloud-storage
functions-framework
9. Тестирование и сборка функции Cloud Run
👉 Мы запустим это в виртуальной среде и установим необходимые библиотеки Python для функции Cloud Run.
cd ~/legal-eagle/loader
python -m venv env
source env/bin/activate
pip install -r requirements.txt
👉 Запустите локальный эмулятор для функции Cloud Run
functions-framework --target process_file --signature-type=cloudevent --source main.py
👉 Оставьте последний терминал запущенным, откройте новый терминал и выполните команду для загрузки файла в контейнер.
export DOC_BUCKET_NAME=$(gcloud storage buckets list --format="value(name)" | grep doc-bucket)
gsutil cp ~/legal-eagle/court_cases/case-01.txt gs://$DOC_BUCKET_NAME/
👉 Пока эмулятор запущен, вы можете отправлять ему тестовые события CloudEvents. Для этого вам понадобится отдельный терминал в IDE.
curl -X POST -H "Content-Type: application/json" \
-d "{
\"specversion\": \"1.0\",
\"type\": \"google.cloud.storage.object.v1.finalized\",
\"source\": \"//storage.googleapis.com/$DOC_BUCKET_NAME\",
\"subject\": \"objects/case-01.txt\",
\"id\": \"my-event-id\",
\"time\": \"2024-01-01T12:00:00Z\",
\"data\": {
\"bucket\": \"$DOC_BUCKET_NAME\",
\"name\": \"case-01.txt\"
}
}" http://localhost:8080/
Он должен вернуться в нормальное состояние.
👉 Вы проверите данные в Firestore . Для этого перейдите в Google Cloud Console, выберите «Базы данных», затем «Firestore», затем вкладку «Данные» и коллекцию legal_documents
. Вы увидите, что в вашей коллекции созданы новые документы, каждый из которых представляет собой фрагмент текста из загруженного файла.
👉 В терминале, где запущен эмулятор, нажмите Ctrl+C
для выхода. Закройте второй терминал.
👉 Запустите deactivate, чтобы выйти из виртуальной среды.
deactivate
10. Создайте образ контейнера и отправьте его в репозитории артефактов.
👉 Пора развернуть это в облаке. В проводнике дважды щёлкните по Dockerfile. Попросите Gemini сгенерировать dockerfile, откройте Gemini Code Assist и следуйте инструкциям ниже для генерации файла.
In the loader folder,
Generate a Dockerfile for a Python 3.12 Cloud Run service that uses functions-framework. It needs to:
1. Use a Python 3.12 slim base image.
2. Set the working directory to /app.
3. Copy requirements.txt and install Python dependencies.
4. Copy main.py.
5. Set the command to run functions-framework, targeting the 'process_file' function on port 8080
Для лучшей практики рекомендуется нажать кнопку «Сравнить с открытым файлом» (две стрелки с противоположными направлениями и принять изменения).
👉 Если вы новичок в контейнерах, вот рабочий пример:
# Use a Python 3.12 slim base image
FROM python:3.12-slim
# Set the working directory to /app
WORKDIR /app
# Copy requirements.txt and install Python dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy main.py
COPY main.py .
# Set the command to run functions-framework
CMD ["functions-framework", "--target", "process_file", "--port", "8080"]
👉 В терминале создайте репозиторий артефактов для хранения образа Docker, который мы собираемся собрать.
gcloud artifacts repositories create my-repository \
--repository-format=docker \
--location=us-central1 \
--description="My repository"
Вы должны увидеть Созданный репозиторий [my-repository].
👉 Выполните следующую команду для создания образа Docker.
cd ~/legal-eagle/loader
export PROJECT_ID=$(gcloud config get project)
docker build -t gcr.io/${PROJECT_ID}/legal-eagle-loader .
👉 Теперь вы отправите это в реестр.
export PROJECT_ID=$(gcloud config get project)
docker tag gcr.io/${PROJECT_ID}/legal-eagle-loader us-central1-docker.pkg.dev/${PROJECT_ID}/my-repository/legal-eagle-loader
docker push us-central1-docker.pkg.dev/${PROJECT_ID}/my-repository/legal-eagle-loader
Образ Docker теперь доступен в репозитории артефактов my-repository .
11. Создайте функцию Cloud Run и настройте триггер Eventarc.
Прежде чем углубляться в детали развертывания нашего загрузчика юридических документов, давайте кратко рассмотрим используемые компоненты: Cloud Run — это полностью управляемая бессерверная платформа, позволяющая быстро и легко развертывать контейнерные приложения. Она абстрагируется от управления инфраструктурой, позволяя вам сосредоточиться на написании и развертывании кода.
Мы развернем наш загрузчик документов как службу Cloud Run. Теперь приступим к настройке функции Cloud Run:
👉 В Google Cloud Console перейдите в Cloud Run .
👉 Перейдите в раздел «Развернуть контейнер» и в раскрывающемся списке нажмите «СЕРВИС» .
👉 Настройте службу Cloud Run:
- Образ контейнера : нажмите «Выбрать» в поле URL. Найдите URL-адрес образа, который вы отправили в реестр артефактов (например, us-central1-docker.pkg.dev/your-project-id/my-repository/legal-eagle-loader/yourimage).
- Имя сервиса :
legal-eagle-loader
- Регион : выберите регион
us-central1
. - Аутентификация : для целей этого семинара вы можете разрешить «Разрешить вызовы без аутентификации». В рабочей среде вам, вероятно, потребуется ограничить доступ.
- Контейнер, Сеть, Безопасность : по умолчанию.
👉 Нажмите «СОЗДАТЬ» . Cloud Run развернет ваш сервис.
Для автоматического запуска этой службы при добавлении новых файлов в контейнер хранилища мы будем использовать Eventarc . Eventarc позволяет создавать архитектуры, управляемые событиями , перенаправляя события из различных источников в ваши службы.
После настройки Eventarc наша служба Cloud Run будет автоматически загружать новые добавленные документы в Firestore сразу после их загрузки, обеспечивая обновление данных в режиме реального времени для нашего приложения RAG.
👉 В консоли Google Cloud Console перейдите в раздел «Триггеры» в разделе EventArc. Нажмите «+ СОЗДАТЬ ТРИГГЕР». 👉 Настройте триггер Eventarc :
- Имя триггера:
legal-eagle-upload-trigger
. - Тип триггера: Источники Google
- Поставщик событий: выберите Cloud Storage .
- Тип события: выберите
google.cloud.storage.object.v1.finalized
- Контейнер облачного хранилища: выберите контейнер GCS из раскрывающегося списка.
- Тип назначения: «Сервис Cloud Run».
- Услуга: Выберите
legal-eagle-loader
. - Регион:
us-central1
- Путь: Оставьте это поле пустым на данный момент.
- Предоставьте все разрешения, запрашиваемые на странице.
👉 Нажмите «СОЗДАТЬ» . Eventarc настроит триггер.
Сервису Cloud Run требуется разрешение на чтение файлов из различных компонентов. Необходимо предоставить учётной записи сервиса соответствующее разрешение.
12. Загрузите юридические документы в корзину GCS.
👉 Загрузите файл судебного дела в ваш контейнер GCS. Не забудьте сменить название контейнера.
export DOC_BUCKET_NAME=$(gcloud storage buckets list --format="value(name)" | grep doc-bucket)
gsutil cp ~/legal-eagle/court_cases/case-02.txt gs://$DOC_BUCKET_NAME/
gsutil cp ~/legal-eagle/court_cases/case-03.txt gs://$DOC_BUCKET_NAME/
gsutil cp ~/legal-eagle/court_cases/case-06.txt gs://$DOC_BUCKET_NAME/
Контролируйте журналы службы Cloud Run, перейдите в Cloud Run -> ваша служба legal-eagle-loader
-> «Журналы». Проверьте журналы на наличие сообщений об успешной обработке, включая:
xxx
POST200130 B8.3 sAPIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html) https://legal-eagle-loader-bmngrueyta-uc.a.run.app/?__GCP_CloudEventsMode=GCS_NOTIFICATION
xxx
POST200130 B520 msAPIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html) https://legal-eagle-loader-bmngrueyta-uc.a.run.app/?__GCP_CloudEventsMode=GCS_NOTIFICATION
xxx
POST200130 B514 msAPIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html) https://legal-eagle-loader-bmngrueyta-uc.a.run.app/?__GCP_CloudEventsMode=GCS_NOTIFICATION
И в зависимости от того, насколько быстро было настроено ведение журнала, вы также увидите здесь более подробные журналы.
"CloudEvent received:"
"New file detected in bucket:"
"File content downloaded. Processing..."
"Text split into ... chunks."
"File processing and Firestore upsert complete..."
Проверьте наличие сообщений об ошибках в журналах и при необходимости устраните неполадки.
👉 Проверьте данные в Firestore . И откройте свою коллекцию legal_documents .
👉 Вы увидите новые документы, созданные в вашей коллекции. Каждый документ будет представлять собой фрагмент текста из загруженного вами файла и будет содержать:
metadata: currently empty
original_text_chunk: The text chunk content.
embedding_: A list of floating-point numbers (the Vertex AI embedding).
13. Внедрение RAG
LangChain — это мощный фреймворк, предназначенный для оптимизации разработки приложений на основе больших языковых моделей (LLM). Вместо того, чтобы напрямую разбираться со сложностями LLM API, разработкой подсказок и обработкой данных, LangChain предоставляет высокоуровневый уровень абстракции. Он предлагает готовые компоненты и инструменты для таких задач, как подключение к различным LLM (например, OpenAI, Google и другим), построение сложных цепочек операций (например, извлечение данных с последующим суммированием) и управление разговорной памятью.
В частности, для RAG векторные хранилища в LangChain играют ключевую роль в реализации функции поиска RAG. Это специализированные базы данных, предназначенные для эффективного хранения и запроса векторных вложений, где семантически схожие фрагменты текста сопоставляются с точками, расположенными близко друг к другу в векторном пространстве. LangChain берет на себя низкоуровневую инфраструктуру, позволяя разработчикам сосредоточиться на базовой логике и функциональности своего RAG-приложения. Это значительно сокращает время и сложность разработки, позволяя быстро создавать прототипы и развертывать приложения на базе RAG, используя при этом надежность и масштабируемость инфраструктуры Google Cloud.
После объяснения LangChain вам теперь нужно обновить файл legal.py
в папке webapp
для реализации RAG. Это позволит LLM искать соответствующие документы в Firestore, прежде чем предоставить ответ.
👉 Импортируйте FirestoreVectorStore
и другие необходимые модули из langchain и vertexai. Добавьте следующее в текущий legal.py
from langchain_google_vertexai import VertexAIEmbeddings
from langchain_google_firestore import FirestoreVectorStore
👉 Инициализируйте Vertex AI и модель встраивания. Вы будете использовать text-embedding-004
. Добавьте следующий код сразу после импорта модулей.
PROJECT_ID = os.environ.get("GOOGLE_CLOUD_PROJECT") # Get project ID from env
embedding_model = VertexAIEmbeddings(
model_name="text-embedding-004" ,
project=PROJECT_ID,)
👉 Создайте FirestoreVectorStore, указывающий на коллекцию legal_documents, используя инициализированную модель встраивания и указав поля содержимого и встраивания. Добавьте его сразу после предыдущего кода модели встраивания.
COLLECTION_NAME = "legal_documents"
# Create a vector store
vector_store = FirestoreVectorStore(
collection="legal_documents",
embedding_service=embedding_model,
content_field="original_text",
embedding_field="embedding",
)
👉 Определите функцию с именем search_resource
, которая принимает запрос, выполняет поиск схожести с помощью vector_store.similarity_search и возвращает объединенные результаты.
def search_resource(query):
results = []
results = vector_store.similarity_search(query, k=5)
combined_results = "\n".join([result.page_content for result in results])
print(f"==>{combined_results}")
return combined_results
👉 ЗАМЕНИТЕ функцию ask_llm
и используйте функцию search_resource
для получения соответствующего контекста на основе запроса пользователя.
def ask_llm(query):
try:
query_message = {
"type": "text",
"text": query,
}
relevant_resource = search_resource(query)
input_msg = HumanMessage(content=[query_message])
prompt_template = ChatPromptTemplate.from_messages(
[
SystemMessage(
content=(
"You are a helpful assistant, and you are with the attorney in a courtroom, you are helping him to win the case by providing the information he needs "
"Don't answer if you don't know the answer, just say sorry in a funny way possible"
"Use high engergy tone, don't use more than 100 words to answer"
f"Here is some context that is relevant to the question {relevant_resource} that you might use"
)
),
input_msg,
]
)
prompt = prompt_template.format()
response = llm.invoke(prompt)
print(f"response: {response}")
return response
except Exception as e:
print(f"Error sending message to chatbot: {e}") # Log this error too!
return f"Unable to process your request at this time. Due to the following reason: {str(e)}"
👉 ДОПОЛНИТЕЛЬНО: ИСПАНСКАЯ ВЕРСИЯ
Sustituye el siguiente texto como se indica: You are a helpful assistant,
« You are a helpful assistant that speaks Spanish,
👉 После внедрения RAG в legal.py необходимо протестировать его локально перед развертыванием, запустив приложение с помощью команды:
cd ~/legal-eagle/webapp
source env/bin/activate
python main.py
👉 Используйте webpreview для доступа к приложению, обратитесь к службе поддержки и нажмите ctrl+c
, чтобы выйти из локально запущенного процесса, и запустите deactivate, чтобы выйти из виртуальной среды.
deactivate
👉 Развертывание веб-приложения в Cloud Run происходит аналогично функции загрузчика. Вам нужно собрать образ Docker, добавить теги и отправить его в реестр артефактов:
export PROJECT_ID=$(gcloud config get project)
docker build -t gcr.io/${PROJECT_ID}/legal-eagle-webapp .
docker tag gcr.io/${PROJECT_ID}/legal-eagle-webapp us-central1-docker.pkg.dev/${PROJECT_ID}/my-repository/legal-eagle-webapp
docker push us-central1-docker.pkg.dev/${PROJECT_ID}/my-repository/legal-eagle-webapp
👉 Пришло время развернуть веб-приложение в Google Cloud. В терминале выполните следующие команды:
export PROJECT_ID=$(gcloud config get project)
gcloud run deploy legal-eagle-webapp \
--image us-central1-docker.pkg.dev/$PROJECT_ID/my-repository/legal-eagle-webapp \
--region us-central1 \
--set-env-vars=GOOGLE_CLOUD_PROJECT=${PROJECT_ID} \
--allow-unauthenticated
Проверьте развертывание, перейдя в Cloud Run в Google Cloud Console. В списке вы должны увидеть новую службу с именем legal-eagle-webapp
.
Щелкните по услуге, чтобы перейти на страницу с подробной информацией; развернутый URL-адрес можно найти вверху.
👉 Теперь откройте размещённый URL-адрес в новой вкладке браузера. Вы можете взаимодействовать с юристом и задавать вопросы, связанные с загруженными вами судебными делами (в папке court_cases):
- К какому сроку тюремного заключения был приговорен Майкл Браун?
- Сколько денег было получено в результате несанкционированных списаний в результате действий Джейн Смит?
- Какую роль сыграли показания соседей в расследовании дела Эмили Уайт?
👉 ДОПОЛНИТЕЛЬНО: ИСПАНСКАЯ ВЕРСИЯ
- Сколько времени прошло с приговором Майклу Брауну?
- ¿Какие деньги и грузы не авторизованы, если они получены в результате действий Джейн Смит?
- ¿Qué papel jugaron los vecinos de los vecinos в расследовании дела Эмили Уайт?
Вы должны заметить, что ответы теперь более точны и основаны на содержании загруженных вами юридических документов, что демонстрирует мощь RAG!
Поздравляем с завершением семинара! Вы успешно создали и развернули приложение для анализа юридических документов, используя LLM, LangChain и Google Cloud. Вы научились принимать и обрабатывать юридические документы, дополнять ответы LLM релевантной информацией с помощью RAG и разворачивать приложение как бессерверный сервис. Эти знания и созданное приложение помогут вам глубже изучить возможности LLM для решения юридических задач. Молодец!
14. Вызов
Различные типы носителей:
Как принимать и обрабатывать различные типы медиаматериалов, такие как судебные видеозаписи и аудиозаписи, а также извлекать соответствующий текст.
Онлайн-активы :
Как обрабатывать онлайн-ресурсы, такие как веб-страницы в режиме реального времени.