Spring AI — проект, призванный упростить разработку приложений, содержащих возможности искусственного интеллекта. Он вдохновлен такими проектами Python, как LangChain и Llama Index, но не является прямым портом этих проектов. Основная идея Spring AI — предоставить базовые абстракции для разработки приложений ИИ. Эти абстракции имеют несколько реализаций, что позволяет легко переключать компоненты между различными реализациями с минимальными изменениями кода.
Их философия дизайна заключается в том, чтобы предоставить разработчикам абстрактный интерфейс, который закладывает основу для включения генеративного ИИ в приложения в качестве независимых компонентов.
В настоящее время поддерживает всех основных поставщиков моделей, таких как OpenAI, Microsoft, Amazon, Google и Huggingfac.
Эта статья Воля Позвольте вам испытать его иOllamaсочетание больших моделей。
Это его официальный документ:Spring AI :: Spring AI Reference
Если вам интересно, вы можете сначала проверить официальную документацию.
Без лишних слов, давайте перейдем непосредственно к самому бою.
Потому что это относительно новый пакет. Поэтому нам нужно следовать инструкциям официальной документации и сначала указать адрес склада кода.
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
Затем добавьте управление версиями:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>0.8.1-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Следующие операции будут выполнены в соответствии с этим документом.:Ollama Chat :: Spring AI Reference
Прежде всего, что такое Оллама?
Ollama — это инструмент и платформа, предназначенные для упрощения локального запуска больших языковых моделей (LLM). Он позволяет пользователям легко запускать большие языковые модели с открытым исходным кодом, такие как Llama 224, на своем локальном устройстве, упаковывая веса моделей, конфигурацию и данные в один пакет. Ollama оптимизирует детали установки и конфигурации, включая использование графического процессора, что позволяет даже пользователям без сильной технической подготовки легко устанавливать, запускать и взаимодействовать с моделями.
Это его официальный адрес;Ollama
Сначала нам нужно скачать версию для Windows.
Проще говоря, вы можете понимать это как нечто, что может запускать модель.
После установки нам нужно скачать несколько больших моделей.
Вот рекомендую вот это:llama2-chinese (ollama.com)
Потому что он поддерживает китайцев.
Заходим сюда и следуем его указаниям
Просто введите следующую команду, и она начнет загрузку
ollama run llama2-chinese
Пожалуйста, терпеливо дождитесь первой загрузки.
Вы можете видеть, что скорость загрузки по-прежнему очень высокая.
Даже если загрузка завершена
Давайте посмотрим на интеграцию с Spring позже.
Сначала нужно добавить пакет:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xiaou</groupId>
<artifactId>xiaou-backend</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>xiaou-backend</name>
<description>xiaou-backend</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>0.8.1-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
</project>
Затем делаем настройку:
server:
port: 8081
spring:
ai:
ollama:
chat:
options:
model: llama2-chinese
Затем пишем контроллер
@RestController
public class AIController {
@Resource
private OllamaChatClient ollamaChatClient;
@GetMapping("/chat")
public String chat(@RequestParam(name = "message") String message) {
return ollamaChatClient.call(message);
}
}
Это самый простой контроллер
Тогда давайте посмотрим на его демонстрацию:
Это может быть немного медленно, нужно подождать около полутора минут.
Вот небольшая демо-версия для реализации фронтенд-части.
Я не буду много говорить о фронтенде, просто посмотрим на эффект. Вам нужно подождать около полминуты, потому что он запускается локально.
Ниже приведена реализация кода, здесь я использую vue3:
<template>
<div class="chat-container">
<!-- Область отображения сообщений чата -->
<div class="message-container" v-for="(message, index) in chatHistory" :key="index">
<!-- Сообщения, отправленные пользователями -->
<div v-if="message.sender === 'user'" class="user-message">{{ message.content }}</div>
<!-- ChatGPT возвращенное сообщение -->
<div v-else class="gpt-message">{{ message.content }}</div>
</div>
<!-- Поле ввода сообщения -->
<div class="input-container">
<input type="text" v-model="newMessage" @keyup.enter="sendMessage" placeholder="Пожалуйста, введите сообщение...">
<button @click="sendMessage">отправлять</button>
</div>
</div>
<!-- Анимация ожидания -->
<div v-if="wait" class="wait">
<div class="loader"></div>
<div>Ожидающий</div>
</div>
</template>
<script setup>
import {ref} from 'vue';
import axios from 'axios';
// создавать ref Реактивные переменные
const chatHistory = ref([]);
const newMessage = ref('');
const wait = ref(false);
// функция отправки сообщения
const sendMessage = async () => {
wait.value = true;
const messageContent = newMessage.value.trim(); // читать newMessage ценить
// Проверьте, пусто ли содержимое сообщения
if (messageContent !== '') {
// Воля Сообщения, отправленные пользователи добавили в историю чата
chatHistory.value.push({sender: 'user', content: messageContent}); // Исправлять chatHistory ценить
// Отправить сообщение назад часть и получить ответ
const response = await axios.get('http://localhost:8081/chat', {
params: {
message: messageContent
}
});
wait.value = false;
// Воля ChatGPT возвращенное Добавить в историю чата
chatHistory.value.push({sender: 'gpt', content: response.data}); // Исправлять chatHistory ценить
// Очистить поле ввода
newMessage.value = ''; // Исправлять newMessage ценить
}
};
</script>
<style scoped>
.chat-container {
max-width: 500px;
margin: auto;
position: relative;
}
.message-container {
margin-bottom: 10px;
}
.user-message {
background-color: #aaf;
padding: 5px;
border-radius: 5px;
max-width: 70%;
word-wrap: break-word;
}
.gpt-message {
background-color: #afa;
padding: 5px;
border-radius: 5px;
max-width: 70%;
word-wrap: break-word;
}
.input-container {
display: flex;
justify-content: space-between;
margin-top: 20px;
}
.input-container input {
flex: 1;
padding: 8px;
border: 1px solid #ccc;
border-radius: 5px;
}
.input-container button {
padding: 8px 20px;
background-color: #4caf50;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
.input-container button:hover {
background-color: #45a049;
}
.wait {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display: flex;
flex-direction: column;
align-items: center;
}
/* Анимация ожидания типа вращения */
.loader {
border: 8px solid #f3f3f3;
border-top: 8px solid #3498db;
border-radius: 50%;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style>
Увидев предыдущую скорость локальных вычислений ИИ, вы можете почувствовать, что она очень медленная. Давайте представим удаленный вызов API.
Здесь используется chatgpt3.5.
Для этого нам нужно получить apikey
Я не буду вам рассказывать, как его получить конкретно.
Pom-файл выглядит следующим образом:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
Затем делаем настройку
spring.ai.openai.api-key=YOUR_API_KEY
spring.ai.openai.chat.options.model=gpt-3.5-turbo
spring.ai.openai.chat.options.temperature=0.7
Затем напишите контроллер, как указано выше.
@GetMapping("/chat")
public String OpenAiChat(@RequestParam(name = "message") String message) {
return openAiChatClient.call(message);
}
Вот и все.
Конечно, если вам нужно разместить его в Интернете, вам нужно провести большую оптимизацию. Этот проект представляет собой всего лишь демонстрационный проект, например ограничение тока, сертификацию безопасности и тому подобное.
Spring AI предоставляет набор абстракций в качестве основы для разработки приложений ИИ. Эти абстракции имеют несколько реализаций, что упрощает замену компонентов с минимальными изменениями кода.
Если вам интересно, вы можете перейти к официальной документации для проведения исследования.
Все примеры кода, использованные в нем, будут помещены в
на этом складе.