Ранее я написал статью «Как элегантно встроить искусственный интеллект AI-Agent на страницу». Многие из основных структур этой статьи интегрированы с предыдущей статьей. Она также продолжает углублять раскопки предыдущей статьи и дополнять ее. Достигните практического применения от проектирования до реализации до уровня кода и бизнес-уровня. Интегрированная демонстрационная система в этой статье настроена в виде веб-страницы. Пользовательский интерфейс этой статьи также предназначен для интерактивного интерфейса. Многие элементы гибкого дизайна не обязательно должны быть написаны строго в соответствии с эффектами кода, описанными в этой статье. , но может быть спроектирован по производственным правилам. Если эта статья оказалась полезной, пожалуйста, поддержите ее!
Я разделил модуль проекта на четыре части, охватывающие ИИ-коммуникацию, весь процесс обработки запросов пользователей и функции модуля обратной связи с системой. Он нацелен на интеграцию с внешними данными посредством обработки естественного языка для автоматического и эффективного ответа на запросы пользователей, а также на постоянную оптимизацию на основе отзывов пользователей для обеспечения точного, интеллектуального и персонализированного обслуживания клиентов.
Для фронтенда мы используемVUE3создать интерфейс разговора,Быстро и удобно。Серверное внедрениеSpring Boot:В качестве основной структуры проекта,MyBatis-PlusИспользуется для операций сохранения базы данных.,упрощенный MyBatis использования и обеспечивает базовое CRUD метод。MySQL: В качестве базы данных, используемой для хранения AI данные сеанса. Я называю здесь модель Alibaba Tongyi Qianwen. Конечно, искусственный интеллект каждого производителя. Все SDK практически одинаковы, и правила вызова в основном одинаковы. Их можно легко вызвать, проверив возвращаемые параметры SDK.
Клиент нажимает на интеллектуальное окно, чтобы начать сеанс. Интерфейсная часть записывает идентификатор сеанса окна и возвращает его на серверную часть вместе с запросом на вопрос клиента. Внутренняя часть запрашивает интерфейс Alibaba Tongyi для получения ответа, вопроса и ответа. ID. Затем серверная часть объединяет полученный текст с request_id этого сеанса и возвращается во внешний интерфейс. Если пользователю нравится полученный ответ, возвращается request_id и статус оценки одного ответа. , и если не удовлетворено, оцените возврат 2.
Существует множество шаблонов, на которых можно учиться интерфейсному пользовательскому интерфейсу, например ChatGPT, Wen XiNYyan и т. д., или использовать более простое всплывающее окно службы поддержки клиентов:
Например, диалоговое окно, похожее на интерфейс WeChat, проще всего понять и использовать клиентам.
Реализуйте простую диалоговую страницу:
<template>
<div class="chat-window">
<div class="chat-header">Fanstuck</div>
<div class="messages">
<div v-if="isLoading" class="load">
<hr/><hr/><hr/><hr/>
</div>
<div v-for="(message, index) in messages" :key="index" class="message" :class="{ 'user': message.sender === 'user', 'bot': message.sender === 'bot' }">
<div class="avatar">
<img v-if="message.sender === 'user'" :src="userAvatar" alt="User">
<img v-else :src="botAvatar" alt="Bot">
</div>
<div v-if="message.sender === 'bot' && message.isTyping" class="typing" :ref="'typeitContainer' + index"></div>
<div v-else class="message-content">{{ message.content }}</div>
</div>
</div>
<div class="input-area">
<input v-model="newMessage" @keyup.enter="sendMessage" placeholder="Type a message..." class="input-field" :disabled="isSending"/>
<button @click="sendMessage" class="send-button" :disabled="isSending || !newMessage.trim()">отправлять</button>
</div>
</div>
</template>
Структура окна чата:
isLoading
дляtrue
час,показыватьанимация загрузки。message.sender
区分用户и机器人информация,Применяйте разные стили.userAvatar
илиbotAvatar
)。isTyping
дляtrue
),Показать контейнер анимации ввода,В противном случае отображается содержимое сообщения.newMessage
,在按下回车键часвызовsendMessage
метод,Статус инвалида зависит отisSending
。sendMessage
метод,禁用条件дляisSending
илиnewMessage
для空。Нам нужно взаимодействовать с серверной частью и реализовать отображение эффекта пишущей машинки.,может пройтиИмпортированные библиотеки:
TypeIt
:Используется для достижения эффекта пишущей машинки.。axios
:используется дляиметь дело сHTTP-запрос.метод:
startChat()
:К后端отправлять请求,Начать новый сеанс чата。
chatCode
。messages
Добавить сообщение об ошибке。sendMessage()
:иметь дело с Логика отправки сообщений.
newMessage
是否для空。isSending
иisLoading
состояние。messages
。chatCode
для空,вызовstartChat()
Получать。messages
,и установитьisTyping
дляtrue
。TypeIt
在指定的容器中показывать打字机效果。methods: {
async startChat(){
try{
const response = await axios.post('http://localhost:8080/api/chats/start');
this.chatCode = response.data; // Вернуть серверную часть chatCode Сохранить во внешнем интерфейсе
console.log('Chat started with code:', this.chatCode);
} catch (error) {
console.error('Failed to start chat:', error);
this.messages.push({ sender: 'bot', content: 'Невозможно начать разговор. Пожалуйста, повторите попытку позже. ' });
}
},
async sendMessage() {
if (!this.newMessage.trim()) return; // Обязательно не отправляйте пустые сообщения
this.isSending = true; // Начать отправку, отключить кнопку отправки
this.isLoading = true;
// Добавить сообщение пользователя в беседу
this.messages.push({ sender: 'user', content: this.newMessage, isTyping: false });
// если chatCode пусто, позвоните сначала startChat Получать
if (!this.chatCode) {
await this.startChat();
if (!this.chatCode) {
this.isSending = false;
this.isLoading = false;
return; // если Получать chatCode Ошибка, прекратите отправку
}
}
try {
// Имитация асинхронных ответов Получениябота
setTimeout(async () => {
// к весне Серверная часть загрузки отправляет запрос POST
const response = await axios.post(`http://localhost:8080/api/chats/${this.chatCode}/ask`, {
prompt: this.newMessage // Используйте запрос POST и передайте данные в формате JSON.
});
const botMessageContent = response.data.reply; // в соответствии с后端响应的结构Получатьинформация内容
this.messages.push({ sender: 'bot', content: botMessageContent, isTyping: true });
setTimeout(() => {
const botMessageIndex = this.messages.length -1 ;
const container = this.$refs[`typeitContainer${botMessageIndex}`];
if (container) {
new TypeIt(container[0], {
strings: [botMessageContent],
speed: 50,
afterComplete: (instance) => {
this.messages[botMessageIndex].isTyping = false;
instance.destroy(); // Принудительное обновление для отображения полного сообщения
}
}).go();
}
},0);
this.isLoading = false;
// Очистить поле ввода
this.newMessage = '';
this.isSending = false; // Завершить отправку, разрешить отправку снова
}, 1000); // Предположим, ответ получен через 1 секунду.
} catch (error) {
console.error('Получатьотвечатьнеудача:', error);
// иметь дело с Ошибочные состояния, например добавление сообщения об ошибке в беседу.
this.messages.push({ sender: 'bot', content: 'Пожалей,Невозможно ответить. ' });
}
Бэкэнд имеет более подробное разделение модулей и объяснение в моем последнем сообщении в блоге. Бэкэнд системы можно разделить на два основных модуля, которые обрабатывают веб-данные и взаимодействие с искусственным интеллектом соответственно:
Модуль веб-обработки данных:
Модуль взаимодействия с данными AI:
Здесь мы используем большую модель Hunyuan для разработки интерфейса API. Сначала откройте Tencent Cloud Hunyuan, чтобы создать соответствующее приложение:
После публикации мы можем получить соответствующий APIKey.
Управление ключами доступа создает ключ и осуществляет доступ к нему вместе с комбинацией API для внутренней связи с искусственным интеллектом.
Шаблон вызова для реализации API см.:
Slf4j
@Service
public class TencentyiServicelmpl implements TencentiService{
@Resource
private TencentProperties aliyunProperties;
@Autowired
private AiChatTencentRespRepository aiChatTencentRespRepository;
@Override
public TencentChatRespDto chat(TencentChatReqDto dto) {
try {
// Создание параметров вызова API
ApplicationParam param = ApplicationParam.builder()
.apiKey(TencentProperties.getTongyi().getApiKey())
.appId(TencentProperties.getTongyi().getChatAppId())
.prompt(dto.getPrompt())
.build();
Application application = new Application();
ApplicationResult result = application.call(param);
// Создать возвращаемый объект
AiResponse response = new AiResponse(result.getRequestId(), dto.getPrompt(), result.getOutput().getText(), result.getOutput().getFinishReason(), result.getUsage());
// Воля AiResponse Преобразовать в класс сущности AiChatTongyiRespPo
AiChatTencentRespPo po = AiResponseToPoConverter.convert(response);
aiChatTencentRespRepository.saveAiResponse(po);
return new TencentChatRespDto().setReply(result.getOutput().getText());
}catch (Exception e){
log.error("Неизвестная ошибка при вызове большой модели", e);
throw new RuntimeException("Ошибка вызова", e);
}
}
}
В то же время возвращаемую информацию о данных необходимо сохранить в таблице для последующего статистического тестирования отзыва большой модели:
Request_id соответствует уникальному идентификатору ответного сообщения, а токены соответствуют количеству входных и выходных байтов, что помогает нам оптимизировать модель и побуждает сэкономить деньги. Существует три серверных RESTful API, которые можно разработать:
Начать разговор (/start
):
POST /start
Маршрут используется для начала нового сеанса чата, вызывая askService.startChat()
Начните новый разговор и верните номер чата, чтобы облегчить последующую Задать. задавать вопросы и взаимодействовать.Задать вопрос (/{chatCode}/ask
):
POST /{chatCode}/ask
Маршрутизация позволяет пользователям отправлять сообщения в AIЗадать в рамках определенного сеанса чата. вопрос。AiChatForm
),вызов askService.ask(chatCode, form.getPrompt())
Генерируйте ответы ИИ и проходите assemble()
метод Воля AiChatAsk
Объект преобразован в возвращен пользователю AskReplyVo
Посмотреть объект.оценивать (/{chatCode}/asks/{askCode}/evaluate
):
PUT /{chatCode}/asks/{askCode}/evaluate
Маршрутизация используется для оценки ответов ИИ.askService.evaluate()
метод Воляпользователяоценивать(например, удовлетворение)запиши это。ServiceException("Вопросы и ответы не существуют")
。При этом создайте новую таблицу, чтобы сохранить все данные разговоров для последующей оптимизации бизнес-модели:
При проектировании следует отметить, чтоchat_code записывает один и тот же номер диалога, который можно пометить как один и тот же идентификатор клиента, и можно проследить связь с контекстной проблемой. Последующие лайки комментариев клиентов выполняются после триггерной операции. Ask_code и Assessment возвращаются через внешний интерфейс, и эта таблица MySQL обновляется для записи лайков комментариев.
public class AiChatAskServiceImpl implements AiChatAskService {
@Resource
private AiChatAskRepository askRepository;
@Resource
private AiyunTongyiService tongyiService;
@Override
public String startChat() {
return IdUtil.fastSimpleUUID();
}
@Override
public AiChatAsk ask(String chatCode, String prompt) {
AiChatAsk ask = new AiChatAsk(new AiChatAskInfo(chatCode, prompt));
ask.start();
TongyiChatRespDto resp = tongyiService.chat(new TongyiChatReqDto()
.setAskCode(ask.getAskInfo().getAskCode())
.setPrompt(prompt));
ask.reply(resp.getReply());
askRepository.save(ask);
return ask;
}
@Override
public void evaluate(AiChatAsk ask, Integer evaluate) {
ask.evaluate(evaluate);
askRepository.saveOnEvaluate(ask);
}
}
Просто обратитесь к приведенному выше функциональному дизайну и реализации.,Интерфейс охватывает основные функции сеанса чата ИИ: начало сеанса, отчет ИИ, Задать вопрос и удовлетворенность ответами ИИ.,同час设计了一个测试接口используется для验证系统是否正常运行。исходный код Волязагрузить вGithubНуждающиеся студенты могут просмотреть исходный код напрямую.,Логика кода проста и в принципе нет сложной конструкции.,В будущем мультимодальные функции могут быть интегрированы и использованы в качестве основы.
через эту статью,Мы работаем от проектирования инфраструктуры до внешней и внутренней реализации.,Систематически демонстрирует, как интегрировать систему вопросов и ответов на базе искусственного интеллекта. Из оригинальной структуры проектов верхних уровней и технологий выбора., подробная схема последовательности проектирования,Затем к конкретному Дизайну пользовательского интерфейса и реализации.,и демонстрация внутренней логики и кода,Постепенно была доработана система обслуживания клиентов с использованием искусственного интеллекта, имеющая полные функции и понятные модули.
В процессе строительства проекта особое внимание уделялось малому количеству соединений и модульной конструкции системы, чтобы облегчить последующее обслуживание и расширение. Каждый из интерфейсов и серверов несет соответствующие обязанности. Интерфейс ориентирован на взаимодействие с пользователем и проектирование взаимодействия, а серверная часть сосредоточена на обработке бизнес-логики и эффективном взаимодействии с ИИ, чтобы гарантировать, что система может не только предоставлять услуги пользователям. с беспрепятственным опытом, но также быстро обрабатывать запросы пользователей и возвращать ценные ответы. Я надеюсь, что эта статья поможет каждому понять процесс создания системы обслуживания клиентов AI Q&A и предоставит эффективный справочник для фактической разработки. Спасибо за чтение и поддержку, и я с нетерпением жду ваших отзывов и дальнейшего общения.