AI 背后的原理是什么?如何搭建一個(gè) AI 聊天機(jī)器人?
AI無(wú)疑是當(dāng)下最熱門(mén)的一個(gè)話題,不管你是不是做技術(shù),多多少少都聽(tīng)過(guò)它,很多人甚至都擔(dān)心自己的工作會(huì)被它取代,那么,AI的背后的原理是什么?為什么它會(huì)這么流行?這篇文章,我們通過(guò)搭建一個(gè)簡(jiǎn)單的聊天機(jī)器人來(lái)了解 AI背后的秘密。
實(shí)現(xiàn)機(jī)器人的方式
實(shí)現(xiàn)的機(jī)器人的方式很多,這里我們列舉三類(lèi)常見(jiàn)的實(shí)現(xiàn)方式:
1.預(yù)設(shè)答案
預(yù)設(shè)答案是指我們可以預(yù)設(shè)一些問(wèn)題,然后給每個(gè)問(wèn)題預(yù)先設(shè)置好答案,對(duì)于沒(méi)有預(yù)先設(shè)置好的問(wèn)題,統(tǒng)一使用默認(rèn)答案。比如公眾號(hào)里面的自動(dòng)回復(fù)功能,如下圖:
預(yù)設(shè)答案是最簡(jiǎn)單且最安全的一種實(shí)現(xiàn)方式,最簡(jiǎn)單是因?yàn)樗耆珱](méi)有什么技術(shù)含量,完全是一個(gè)關(guān)鍵字Map的機(jī)制。最安全是因?yàn)榇鸢甘穷A(yù)先配置好,完全可控,所以不管提問(wèn)者提什么樣的問(wèn)題,都不可能有涉x的問(wèn)題。
2.常規(guī)算法
基于常規(guī)算法是指,根據(jù)用戶的輸入,需要分析其語(yǔ)義,然后作出合理的回答,常見(jiàn)的算法有決策樹(shù)、線性回歸等。
決策樹(shù)是一種用于分類(lèi)和回歸的非參數(shù)模型,其基本思想是將數(shù)據(jù)集劃分為更小的子集,同時(shí)構(gòu)建一個(gè)類(lèi)似樹(shù)結(jié)構(gòu)的決策模型。這個(gè)樹(shù)由節(jié)點(diǎn)(Node)和分支(Branch)組成:
- 根節(jié)點(diǎn)(Root Node) :數(shù)據(jù)開(kāi)始的地方,包含整個(gè)數(shù)據(jù)集。
- 內(nèi)部節(jié)點(diǎn)(Internal Nodes) :根據(jù)某個(gè)特征進(jìn)行數(shù)據(jù)的條件判斷分割。
- 葉子節(jié)點(diǎn)(Leaf Nodes) :代表最終的決策結(jié)果或類(lèi)別。
線性回歸是一種統(tǒng)計(jì)方法,用于建模目標(biāo)變量和一個(gè)或多個(gè)自變量之間的線性關(guān)系。其目標(biāo)是找到一個(gè)線性方程,使得預(yù)測(cè)值和實(shí)際值之間的誤差最小化。
3.大語(yǔ)言模型
大型語(yǔ)言模型(Large Language Models,LLMs)是非常大的深度學(xué)習(xí)模型,預(yù)先在海量數(shù)據(jù)上進(jìn)行訓(xùn)練,其底層的 Transformer(在 2017年由谷歌在論文“Attention Is All You Need”中首次提出)是一組神經(jīng)網(wǎng)絡(luò),包括具有自注意力能力的編碼器和解碼器。編碼器和解碼器從文本序列中提取意義,并理解其中單詞和短語(yǔ)之間的關(guān)系。
LLMs是目前最為流行的一種方式,比如字節(jié)的豆包,F(xiàn)acebook的Chatbot,如 OpenAI 的 GPT-3、GPT-4、ChatGPT-4o,谷歌的 BERT 和 T5 等。下面是我和豆包的一段對(duì)話:
豆包MarsCode可以根據(jù)我的問(wèn)題,分析我的語(yǔ)義,給出相當(dāng) nice的答案,給國(guó)產(chǎn)的ChatGPT點(diǎn)贊。
LLMs核心是 Transformer神經(jīng)網(wǎng)絡(luò)架構(gòu)允許使用非常大的模型,通常具有數(shù)千億個(gè)參數(shù)。這種大規(guī)模的模型可以攝取海量數(shù)據(jù),通常來(lái)自互聯(lián)網(wǎng),也包括像 Common Crawl這樣的來(lái)源,后者包括超過(guò) 500億個(gè)網(wǎng)頁(yè),以及維Ji百科,大約有 5700萬(wàn)頁(yè)。
Transformer模型工作流程如下圖:
Transformer之所以非常適合用于大型語(yǔ)言模型,主要有兩個(gè)關(guān)鍵創(chuàng)新:位置編碼和自注意力。
- 位置編碼(positional encodings):是指嵌入輸入在序列中出現(xiàn)的順序。本質(zhì)上,借助位置編碼,單詞可以不按順序輸入到神經(jīng)網(wǎng)絡(luò)中,而不是逐個(gè)按順序輸入。
- 自注意力(self-attention):在處理輸入數(shù)據(jù)時(shí)為每個(gè)部分分配一個(gè)權(quán)重,這個(gè)權(quán)重表示該輸入在整個(gè)輸入中的重要性。換句話說(shuō),模型不需要對(duì)所有輸入給予同等的注意,而是可以專(zhuān)注于實(shí)際上重要的部分。隨著模型篩選和分析海量數(shù)據(jù),這種關(guān)于神經(jīng)網(wǎng)絡(luò)需要關(guān)注的輸入部分的表示會(huì)逐漸學(xué)習(xí)。
這兩種技術(shù)結(jié)合在一起,使得可以分析在長(zhǎng)距離、非順序的情況下,各個(gè)元素是如何微妙地影響和相互關(guān)聯(lián)的。這種非順序處理數(shù)據(jù)的能力能夠把復(fù)雜問(wèn)題分解成多個(gè)小的、同時(shí)進(jìn)行的計(jì)算。自然地,GPU在并行解決這些類(lèi)型的問(wèn)題上非常適合,可以大規(guī)模處理大型未標(biāo)注數(shù)據(jù)集和巨大的Transformer網(wǎng)絡(luò)。
如何搭建聊天機(jī)器人?
1.目標(biāo)
設(shè)計(jì)一個(gè)聊天機(jī)器人,能理解用戶的輸入并提供合理的答復(fù)。
2.技術(shù)棧
- Java: 使用Java作為開(kāi)發(fā)語(yǔ)言。
- Spring Boot: 作為項(xiàng)目的基礎(chǔ)框架,用于快速構(gòu)建和部署 RESTful應(yīng)用程序。
- Spring AI: 使用 Spring Boot與AI API服務(wù)集成。
- RESTful API: 提供 HTTP接口以與聊天機(jī)器人進(jìn)行交互。
- OpenAI API: 使用 OpenAI的 GPT等模型來(lái)處理自然語(yǔ)言并生成回復(fù)。
3.項(xiàng)目結(jié)構(gòu)
- Controller: 處理 HTTP請(qǐng)求。
- Service: 業(yè)務(wù)邏輯層,包括與 OpenAI API的交互。
- Model: 定義請(qǐng)求和響應(yīng)的數(shù)據(jù)結(jié)構(gòu)。
- Configuration: 配置 OpenAI API的訪問(wèn)。
4.步驟詳解
(1) 開(kāi)始一個(gè)Spring Boot項(xiàng)目
首先,我們?cè)陂_(kāi)發(fā)環(huán)境中創(chuàng)建一個(gè)新的 Spring Boot項(xiàng)目,包括以下依賴(lài):
- 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平臺(tái)申請(qǐng)一個(gè) API key。
(3) 實(shí)現(xiàn)Controller
接下來(lái),實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 RESTful控制器來(lái)處理客戶端請(qǐng)求,創(chuàng)建一個(gè)名為ChatController的類(lèi)。
@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是一個(gè)包含用戶輸入消息的模型,而ChatResponse是包含聊天機(jī)器人的回復(fù)模型。
(4) 定義Model層
創(chuàng)建請(qǐng)求和響應(yīng)的模型類(lèi)。
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) 創(chuàng)建Service
建立一個(gè)ChatService類(lèi),通過(guò)此類(lèi)調(diào)用 OpenAI API。
@Service
public class ChatService {
private final String apiKey = "YOUR_OPENAI_API_KEY";
public String getResponse(String message) {
// 使用OpenAI API進(jìn)行交互的邏輯
// 例如,初始化OpenAI客戶端,發(fā)送請(qǐng)求,獲得響應(yīng)。
return callOpenAIAPI(message);
}
private String callOpenAIAPI(String message) {
// 與OpenAI API進(jìn)行實(shí)際交互的邏輯
// 包括建立HTTP請(qǐng)求,解析JSON響應(yīng)等。
return "回答: " + message; // 示例
}
}
在getResponse方法中,實(shí)現(xiàn)與 OpenAI API的交互。這包括設(shè)置HTTP請(qǐng)求頭,發(fā)送用戶消息,并解析API返回的回復(fù)。
(6) 配置API客戶端
使用Spring配置管理API客戶端的細(xì)節(jié)。也可以使用HttpClient或RestTemplate等工具來(lái)進(jìn)行HTTP請(qǐng)求。
@Configuration
public class OpenAIConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
// 其他配置,例如API基礎(chǔ)URL或客戶端選項(xiàng)
}
(7) 與OpenAI API交互
在實(shí)際應(yīng)用中,這一步可能涉及到復(fù)雜的API調(diào)用和響應(yīng)處理,以下是一個(gè)簡(jiǎn)單的示例,展示如何使用 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響應(yīng),返回消息
JSONObject responseBody = new JSONObject(response.getBody());
return responseBody.getJSONArray("choices").getJSONObject(0).getString("text");
}
到此,一個(gè)簡(jiǎn)單的聊天機(jī)器人就實(shí)現(xiàn)好了,其實(shí)依賴(lài) OpenAI的API實(shí)現(xiàn)聊天機(jī)器人很簡(jiǎn)單,因?yàn)楹诵牡恼Z(yǔ)義分析等技術(shù)難點(diǎn)已自包含在三方 API中,我們只需要關(guān)注自己的業(yè)務(wù)邏輯。
總結(jié)
本文,我們分析了幾種實(shí)現(xiàn)聊天機(jī)器人的方法,從傳統(tǒng)的方式到如今如日中天的大語(yǔ)言模型, 然后基于 Spring Boot 和 OpenAI的 API,實(shí)現(xiàn)了一個(gè)簡(jiǎn)易的聊天機(jī)器人,搭建的過(guò)程很簡(jiǎn)單。
作為一名技術(shù)人員,或許你不是從事 AI相關(guān)的工作,但是,懷著對(duì)技術(shù)的好奇心,我們不應(yīng)該只停留在使用 AI的階段,而更應(yīng)該去了解 AI,了解 LLMs的原理,了解 Transformer模型,了解它和 CNNs和 RNNs的區(qū)別,從而更加好地?cái)U(kuò)展我們的技術(shù)視野。
對(duì)于一些國(guó)產(chǎn)的 AI產(chǎn)品,我們應(yīng)該采用包容的態(tài)度多去使用它們,比如我們的豆包,讓 AI真正可以為我們的技術(shù)賦能。