使用大模型实现一个聊天机器人思路以及困难点 原创
“ 聊天机器人看着是一个很简单的功能,但能把聊天机器人做好却不是一件简单的事”
在大模型的众多应用中,聊天机器人可以说是其中比较简单,也是拥有众多应用场景的一个功能;从技术的角度来说,聊天机器人的实现很简单,但其实也很复杂。
那到底怎么实现一个聊天机器人呢?
聊天机器人的实现
对很多学习大模型技术的人来说,可能聊天机器人就是你的第一个实操项目;原因就是其实现起来比较简单,从技术实现来看只需要使用大模型服务商提供的SDK或者API接口就可以实现一个聊天机器人的功能。
比如说阿里通义千问提供的基于API实现的对话功能代码:
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 {
// 创建请求体
RequestBody requestBody = new RequestBody(
"qwen-plus",
new Message[] {
new Message("system", "You are a helpful assistant."),
new Message("user", "你是谁?")
}
);
// 将请求体转换为 JSON
Gson gson = new Gson();
String jsonInputString = gson.toJson(requestBody);
// 创建 URL 对象
URL url = new URL("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
// 设置请求方法为 POST
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Content-Type", "application/json; utf-8");
httpURLConnection.setRequestProperty("Accept", "application/json");
// 若没有配置环境变量,请用百炼API Key将下行替换为:String apiKey = "sk-xxx";
String apiKey = System.getenv("DASHSCOPE_API_KEY");
String auth = "Bearer " + apiKey;
httpURLConnection.setRequestProperty("Authorization", auth);
// 启用输入输出流
httpURLConnection.setDoOutput(true);
// 写入请求体
try (OutputStream os = httpURLConnection.getOutputStream()) {
byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
}
// 获取响应码
int responseCode = httpURLConnection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 读取响应体
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);
}
}
}
代码看起来是不是很简单,主要就两个角色system和user;有些模型可能是三个角色,还一个是assistant的角色。
为了更好的使用大模型,因此需要一个system角色来定义大模型所扮演的角色,它可以是一名工程师,也可以是一名科学家;用户可以根据自己的需求来定义大模型的角色。
而由于大模型没有记忆功能,因此就需要通过会话的方式,把聊天的记录输入到大模型中,这样就可以让大模型在一个固定的上下文中聊天,这样有助于大模型更好地理解用户的意图。所以,一般在实际应用场景中,每次都会携带前面多轮会话的内容到大模型中。
而在与前端的交互中,一般有两种选择,一种是等大模型完全回复完毕,然后把所有内容一起返回给前端;另一种是采用流式返回的方式,把大模型回复的内容一点一点的响应给前端,就是我们常见的打字机的效果。
当然,上面这些只是实现一个简单聊天机器人的功能;看起来很简单,实现起来也很简单,但聊天机器人真的有那么简单吗?
聊天机器人的应用场景最常见的就是智能客服,但思考一下实现一个能够满足企业需求的智能客服真的有这么简单吗?
首先使用大模型实现智能客服要面临着大模型存在的几个问题,首先就是知识不足的问题;假如你们公司是一个做传统制造的企业,如果只是使用第三方大模型服务商提供的能力,能满足你们的需求吗?简单来说,大模型能理解你们的行业内的知识吗?
答案当然是否定的。
因此,面临着这种知识不足的问题,应该怎么解决?Ok,如果对RAG技术有了解的人可能会说,这个简单直接用RAG技术就能解决这个问题了。
但首先使用RAG技术打造一个你们行业内的知识库系统,难度大不大?其次,如果是医疗,高精尖的企业生产,在这种场景下不能有一丝一毫的错误;任何微小的错误都可能引起人命关天的事故,那么这个问题应该怎么解决?
毕竟大模型目前为止还无法做到完全的正确性,甚至很多时候都会抽风。
其次,如果客户想了解一些当前市面上最新的信息,你的智能客服是否能及时主动的搜索网络中的消息,还是说要人工每天收集消息输入到你的知识库中?
其实对于这种问题有两种解决方案,第一种是异步方式,使用爬虫工具每天从网络中搜索信息并输入到知识库中;另一种是使用AI Agent技术,让大模型自己调用网络搜索工具实时搜索消息。
而这只是简单的聊天对话功能,如果想提供更好的体验方式,比如语音客服,是不是还需要切入TTS(TEXT-TO-SPEECH 文本转语音)功能;而且能够根据不同的角色切换不同的声音。
而且,在某些场景下还可以把AIGC的能力集成到智能客服中,比如说帮用户梳理文档,设计流程,以及提供部分案例等。
因此,一个简单的聊天机器人远远没有看到的那么简单,其背后可能需要一个庞大的系统在做支撑。
本文转载自公众号AI探索时代 作者:DFires