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