使用大模型實(shí)現(xiàn)一個(gè)聊天機(jī)器人思路以及困難點(diǎn) 原創(chuàng)
?“ 聊天機(jī)器人看著是一個(gè)很簡(jiǎn)單的功能,但能把聊天機(jī)器人做好卻不是一件簡(jiǎn)單的事”
在大模型的眾多應(yīng)用中,聊天機(jī)器人可以說(shuō)是其中比較簡(jiǎn)單,也是擁有眾多應(yīng)用場(chǎng)景的一個(gè)功能;從技術(shù)的角度來(lái)說(shuō),聊天機(jī)器人的實(shí)現(xiàn)很簡(jiǎn)單,但其實(shí)也很復(fù)雜。
那到底怎么實(shí)現(xiàn)一個(gè)聊天機(jī)器人呢?
聊天機(jī)器人的實(shí)現(xiàn)
對(duì)很多學(xué)習(xí)大模型技術(shù)的人來(lái)說(shuō),可能聊天機(jī)器人就是你的第一個(gè)實(shí)操項(xiàng)目;原因就是其實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,從技術(shù)實(shí)現(xiàn)來(lái)看只需要使用大模型服務(wù)商提供的SDK或者API接口就可以實(shí)現(xiàn)一個(gè)聊天機(jī)器人的功能。
比如說(shuō)阿里通義千問(wèn)提供的基于API實(shí)現(xiàn)的對(duì)話功能代碼:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import com.google.gson.Gson;
public class Main {
static class Message {
String role;
String content;
public Message(String role, String content) {
this.role = role;
this.content = content;
}
}
static class RequestBody {
String model;
Message[] messages;
public RequestBody(String model, Message[] messages) {
this.model = model;
this.messages = messages;
}
}
public static void main(String[] args) {
try {
// 創(chuàng)建請(qǐng)求體
RequestBody requestBody = new RequestBody(
"qwen-plus",
new Message[] {
new Message("system", "You are a helpful assistant."),
new Message("user", "你是誰(shuí)?")
}
);
// 將請(qǐng)求體轉(zhuǎn)換為 JSON
Gson gson = new Gson();
String jsonInputString = gson.toJson(requestBody);
// 創(chuàng)建 URL 對(duì)象
URL url = new URL("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
// 設(shè)置請(qǐng)求方法為 POST
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Content-Type", "application/json; utf-8");
httpURLConnection.setRequestProperty("Accept", "application/json");
// 若沒(méi)有配置環(huán)境變量,請(qǐng)用百煉API Key將下行替換為:String apiKey = "sk-xxx";
String apiKey = System.getenv("DASHSCOPE_API_KEY");
String auth = "Bearer " + apiKey;
httpURLConnection.setRequestProperty("Authorization", auth);
// 啟用輸入輸出流
httpURLConnection.setDoOutput(true);
// 寫入請(qǐng)求體
try (OutputStream os = httpURLConnection.getOutputStream()) {
byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
}
// 獲取響應(yīng)碼
int responseCode = httpURLConnection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 讀取響應(yīng)體
try (BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), StandardCharsets.UTF_8))) {
StringBuilder response = new StringBuilder();
String responseLine;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
System.out.println("Response Body: " + response);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
System.exit(0);
}
}
}
代碼看起來(lái)是不是很簡(jiǎn)單,主要就兩個(gè)角色system和user;有些模型可能是三個(gè)角色,還一個(gè)是assistant的角色。
為了更好的使用大模型,因此需要一個(gè)system角色來(lái)定義大模型所扮演的角色,它可以是一名工程師,也可以是一名科學(xué)家;用戶可以根據(jù)自己的需求來(lái)定義大模型的角色。
而由于大模型沒(méi)有記憶功能,因此就需要通過(guò)會(huì)話的方式,把聊天的記錄輸入到大模型中,這樣就可以讓大模型在一個(gè)固定的上下文中聊天,這樣有助于大模型更好地理解用戶的意圖。所以,一般在實(shí)際應(yīng)用場(chǎng)景中,每次都會(huì)攜帶前面多輪會(huì)話的內(nèi)容到大模型中。
而在與前端的交互中,一般有兩種選擇,一種是等大模型完全回復(fù)完畢,然后把所有內(nèi)容一起返回給前端;另一種是采用流式返回的方式,把大模型回復(fù)的內(nèi)容一點(diǎn)一點(diǎn)的響應(yīng)給前端,就是我們常見(jiàn)的打字機(jī)的效果。
當(dāng)然,上面這些只是實(shí)現(xiàn)一個(gè)簡(jiǎn)單聊天機(jī)器人的功能;看起來(lái)很簡(jiǎn)單,實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單,但聊天機(jī)器人真的有那么簡(jiǎn)單嗎?
聊天機(jī)器人的應(yīng)用場(chǎng)景最常見(jiàn)的就是智能客服,但思考一下實(shí)現(xiàn)一個(gè)能夠滿足企業(yè)需求的智能客服真的有這么簡(jiǎn)單嗎?
首先使用大模型實(shí)現(xiàn)智能客服要面臨著大模型存在的幾個(gè)問(wèn)題,首先就是知識(shí)不足的問(wèn)題;假如你們公司是一個(gè)做傳統(tǒng)制造的企業(yè),如果只是使用第三方大模型服務(wù)商提供的能力,能滿足你們的需求嗎?簡(jiǎn)單來(lái)說(shuō),大模型能理解你們的行業(yè)內(nèi)的知識(shí)嗎?
答案當(dāng)然是否定的。
因此,面臨著這種知識(shí)不足的問(wèn)題,應(yīng)該怎么解決?Ok,如果對(duì)RAG技術(shù)有了解的人可能會(huì)說(shuō),這個(gè)簡(jiǎn)單直接用RAG技術(shù)就能解決這個(gè)問(wèn)題了。
但首先使用RAG技術(shù)打造一個(gè)你們行業(yè)內(nèi)的知識(shí)庫(kù)系統(tǒng),難度大不大?其次,如果是醫(yī)療,高精尖的企業(yè)生產(chǎn),在這種場(chǎng)景下不能有一絲一毫的錯(cuò)誤;任何微小的錯(cuò)誤都可能引起人命關(guān)天的事故,那么這個(gè)問(wèn)題應(yīng)該怎么解決?
畢竟大模型目前為止還無(wú)法做到完全的正確性,甚至很多時(shí)候都會(huì)抽風(fēng)。
其次,如果客戶想了解一些當(dāng)前市面上最新的信息,你的智能客服是否能及時(shí)主動(dòng)的搜索網(wǎng)絡(luò)中的消息,還是說(shuō)要人工每天收集消息輸入到你的知識(shí)庫(kù)中?
其實(shí)對(duì)于這種問(wèn)題有兩種解決方案,第一種是異步方式,使用爬蟲工具每天從網(wǎng)絡(luò)中搜索信息并輸入到知識(shí)庫(kù)中;另一種是使用AI Agent技術(shù),讓大模型自己調(diào)用網(wǎng)絡(luò)搜索工具實(shí)時(shí)搜索消息。
而這只是簡(jiǎn)單的聊天對(duì)話功能,如果想提供更好的體驗(yàn)方式,比如語(yǔ)音客服,是不是還需要切入TTS(TEXT-TO-SPEECH 文本轉(zhuǎn)語(yǔ)音)功能;而且能夠根據(jù)不同的角色切換不同的聲音。
而且,在某些場(chǎng)景下還可以把AIGC的能力集成到智能客服中,比如說(shuō)幫用戶梳理文檔,設(shè)計(jì)流程,以及提供部分案例等。
因此,一個(gè)簡(jiǎn)單的聊天機(jī)器人遠(yuǎn)遠(yuǎn)沒(méi)有看到的那么簡(jiǎn)單,其背后可能需要一個(gè)龐大的系統(tǒng)在做支撐。
?
本文轉(zhuǎn)載自公眾號(hào)AI探索時(shí)代 作者:DFires
