AI 背后的原理是什么?如何搭建一个 AI 聊天机器人?

人工智能
本文,我们分析了几种实现聊天机器人的方法,从传统的方式到如今如日中天的大语言模型, 然后基于 Spring Boot 和 OpenAI的 API,实现了一个简易的聊天机器人,搭建的过程很简单。

AI无疑是当下最热门的一个话题,不管你是不是做技术,多多少少都听过它,很多人甚至都担心自己的工作会被它取代,那么,AI的背后的原理是什么?为什么它会这么流行?这篇文章,我们通过搭建一个简单的聊天机器人来了解 AI背后的秘密。

实现机器人的方式

实现的机器人的方式很多,这里我们列举三类常见的实现方式:

1.预设答案

预设答案是指我们可以预设一些问题,然后给每个问题预先设置好答案,对于没有预先设置好的问题,统一使用默认答案。比如公众号里面的自动回复功能,如下图:

预设答案是最简单且最安全的一种实现方式,最简单是因为它完全没有什么技术含量,完全是一个关键字Map的机制。最安全是因为答案是预先配置好,完全可控,所以不管提问者提什么样的问题,都不可能有涉x的问题。

2.常规算法

基于常规算法是指,根据用户的输入,需要分析其语义,然后作出合理的回答,常见的算法有决策树、线性回归等。

决策树是一种用于分类和回归的非参数模型,其基本思想是将数据集划分为更小的子集,同时构建一个类似树结构的决策模型。这个树由节点(Node)和分支(Branch)组成:

  • 根节点(Root Node) :数据开始的地方,包含整个数据集。
  • 内部节点(Internal Nodes) :根据某个特征进行数据的条件判断分割。
  • 叶子节点(Leaf Nodes) :代表最终的决策结果或类别。

线性回归是一种统计方法,用于建模目标变量和一个或多个自变量之间的线性关系。其目标是找到一个线性方程,使得预测值和实际值之间的误差最小化。

3.大语言模型

大型语言模型(Large Language Models,LLMs)是非常大的深度学习模型,预先在海量数据上进行训练,其底层的 Transformer(在 2017年由谷歌在论文“Attention Is All You Need”中首次提出)是一组神经网络,包括具有自注意力能力的编码器和解码器。编码器和解码器从文本序列中提取意义,并理解其中单词和短语之间的关系。

LLMs是目前最为流行的一种方式,比如字节的豆包,Facebook的Chatbot,如 OpenAI 的 GPT-3、GPT-4、ChatGPT-4o,谷歌的 BERT 和 T5 等。下面是我和豆包的一段对话:

豆包MarsCode可以根据我的问题,分析我的语义,给出相当 nice的答案,给国产的ChatGPT点赞。

LLMs核心是 Transformer神经网络架构允许使用非常大的模型,通常具有数千亿个参数。这种大规模的模型可以摄取海量数据,通常来自互联网,也包括像 Common Crawl这样的来源,后者包括超过 500亿个网页,以及维Ji百科,大约有 5700万页。

Transformer模型工作流程如下图:

Transformer之所以非常适合用于大型语言模型,主要有两个关键创新:位置编码和自注意力。

  • 位置编码(positional encodings):是指嵌入输入在序列中出现的顺序。本质上,借助位置编码,单词可以不按顺序输入到神经网络中,而不是逐个按顺序输入。
  • 自注意力(self-attention):在处理输入数据时为每个部分分配一个权重,这个权重表示该输入在整个输入中的重要性。换句话说,模型不需要对所有输入给予同等的注意,而是可以专注于实际上重要的部分。随着模型筛选和分析海量数据,这种关于神经网络需要关注的输入部分的表示会逐渐学习。

这两种技术结合在一起,使得可以分析在长距离、非顺序的情况下,各个元素是如何微妙地影响和相互关联的。这种非顺序处理数据的能力能够把复杂问题分解成多个小的、同时进行的计算。自然地,GPU在并行解决这些类型的问题上非常适合,可以大规模处理大型未标注数据集和巨大的Transformer网络。

如何搭建聊天机器人?

1.目标

设计一个聊天机器人,能理解用户的输入并提供合理的答复。

2.技术栈

  • Java: 使用Java作为开发语言。
  • Spring Boot: 作为项目的基础框架,用于快速构建和部署 RESTful应用程序。
  • Spring AI: 使用 Spring Boot与AI API服务集成。
  • RESTful API: 提供 HTTP接口以与聊天机器人进行交互。
  • OpenAI API: 使用 OpenAI的 GPT等模型来处理自然语言并生成回复。

3.项目结构

  • Controller: 处理 HTTP请求。
  • Service: 业务逻辑层,包括与 OpenAI API的交互。
  • Model: 定义请求和响应的数据结构。
  • Configuration: 配置 OpenAI API的访问。

4.步骤详解

(1) 开始一个Spring Boot项目

首先,我们在开发环境中创建一个新的 Spring Boot项目,包括以下依赖:

  • Spring Web
  • Spring Boot DevTools
  • Spring Configuration Processor

(2) 配置OpenAI API

在application.properties或application.yml文件中,配置 OpenAI API key,例如:

openai.api.key=YOUR_OPENAI_API_KEY

需要从 OpenAI平台申请一个 API key。

(3) 实现Controller

接下来,实现一个简单的 RESTful控制器来处理客户端请求,创建一个名为ChatController的类。

@RestController
@RequestMapping("/api/chat")
public class ChatController {

    @Autowired
    private ChatService chatService;

    @PostMapping("/ask")
    public ResponseEntity<ChatResponse> askQuestion(@RequestBody ChatRequest chatRequest) {
        String response = chatService.getResponse(chatRequest.getMessage());
        return ResponseEntity.ok(new ChatResponse(response));
    }
}

在这里,ChatRequest是一个包含用户输入消息的模型,而ChatResponse是包含聊天机器人的回复模型。

(4) 定义Model层

创建请求和响应的模型类。

public class ChatRequest {
    private String message;

    // getters and setters
}

public class ChatResponse {
    private String response;

    public ChatResponse(String response) {
        this.response = response;
    }

    // getters and setters
}

(5) 创建Service

建立一个ChatService类,通过此类调用 OpenAI API。

@Service
public class ChatService {

    private final String apiKey = "YOUR_OPENAI_API_KEY";

    public String getResponse(String message) {
        // 使用OpenAI API进行交互的逻辑
        // 例如,初始化OpenAI客户端,发送请求,获得响应。
        return callOpenAIAPI(message);
    }

    private String callOpenAIAPI(String message) {
        // 与OpenAI API进行实际交互的逻辑
        // 包括建立HTTP请求,解析JSON响应等。
        return "回答: " + message; // 示例
    }
}

在getResponse方法中,实现与 OpenAI API的交互。这包括设置HTTP请求头,发送用户消息,并解析API返回的回复。

(6) 配置API客户端

使用Spring配置管理API客户端的细节。也可以使用HttpClient或RestTemplate等工具来进行HTTP请求。

@Configuration
public class OpenAIConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    // 其他配置,例如API基础URL或客户端选项
}

(7) 与OpenAI API交互

在实际应用中,这一步可能涉及到复杂的API调用和响应处理,以下是一个简单的示例,展示如何使用 RestTemplate与OpenAI API交互。

private String callOpenAIAPI(String message) {
    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.setBearerAuth(apiKey);

    JSONObject request = new JSONObject();
    request.put("prompt", message);
    request.put("max_tokens", 150);

    HttpEntity<String> entity = new HttpEntity<>(request.toString(), headers);

    ResponseEntity<String> response = restTemplate.postForEntity("https://api.openai.com/v1/engines/davinci-codex/completions", entity, String.class);
    
    // 解析API响应,返回消息
    JSONObject responseBody = new JSONObject(response.getBody());
    return responseBody.getJSONArray("choices").getJSONObject(0).getString("text");
}

到此,一个简单的聊天机器人就实现好了,其实依赖 OpenAI的API实现聊天机器人很简单,因为核心的语义分析等技术难点已自包含在三方 API中,我们只需要关注自己的业务逻辑。

总结

本文,我们分析了几种实现聊天机器人的方法,从传统的方式到如今如日中天的大语言模型, 然后基于 Spring Boot 和 OpenAI的 API,实现了一个简易的聊天机器人,搭建的过程很简单。

作为一名技术人员,或许你不是从事 AI相关的工作,但是,怀着对技术的好奇心,我们不应该只停留在使用 AI的阶段,而更应该去了解 AI,了解 LLMs的原理,了解 Transformer模型,了解它和 CNNs和 RNNs的区别,从而更加好地扩展我们的技术视野。

对于一些国产的 AI产品,我们应该采用包容的态度多去使用它们,比如我们的豆包,让 AI真正可以为我们的技术赋能。

责任编辑:赵宁宁 来源: 猿java
相关推荐

2021-05-24 15:29:24

人工智能机器人聊天

2020-12-02 13:00:17

Recast.AI聊天机器人人工智能

2023-07-27 14:38:58

人工智能机器人开发

2023-04-28 16:56:26

2024-09-30 13:11:09

2020-08-14 16:18:30

人工智能

2019-03-22 09:00:00

AI人工智能聊天机器人

2021-11-30 10:56:43

ChatterBot机器人人工智能

2023-02-28 07:59:19

OpenAI聊天机器人

2023-02-15 14:33:26

2022-08-04 07:03:41

AnswersInfobip无代码

2023-09-28 20:57:23

Meta人工智能聊天机器人

2022-09-30 13:55:46

Python机器人

2023-03-29 13:07:34

微软网络安全聊天机器人

2023-03-07 07:52:47

ChatGPT人工智能

2024-08-16 07:09:22

2022-07-05 06:42:01

聊天机器人人工智能

2023-05-11 09:57:27

谷歌OpenAI开发聊天机器人

2023-09-13 11:29:31

点赞
收藏

51CTO技术栈公众号