Appearance
聊天机器人
基础聊天机器人
基本实现
java
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.chat.ChatLanguageModel;
public class BasicChatBot {
public static void main(String[] args) {
// 创建模型
ChatLanguageModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-3.5-turbo")
.build();
// 简单聊天循环
Scanner scanner = new Scanner(System.in);
System.out.println("聊天机器人已启动,输入 'exit' 退出");
while (true) {
System.out.print("你: ");
String input = scanner.nextLine();
if (input.equalsIgnoreCase("exit")) {
System.out.println("聊天结束");
break;
}
// 生成响应
String response = model.generate(input);
System.out.println("机器人: " + response);
}
scanner.close();
}
}带系统提示词的聊天机器人
java
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.data.message.AiMessage;
import java.util.ArrayList;
import java.util.List;
public class SystemPromptChatBot {
public static void main(String[] args) {
// 创建模型
ChatLanguageModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-3.5-turbo")
.build();
// 系统提示词
SystemMessage systemMessage = SystemMessage.from(
"你是一个友好的聊天机器人,擅长回答技术问题,特别是关于 Java 和 LangChain4J 的问题。"
);
// 消息历史
List<UserMessage> userMessages = new ArrayList<>();
List<AiMessage> aiMessages = new ArrayList<>();
// 聊天循环
Scanner scanner = new Scanner(System.in);
System.out.println("技术聊天机器人已启动,输入 'exit' 退出");
while (true) {
System.out.print("你: ");
String input = scanner.nextLine();
if (input.equalsIgnoreCase("exit")) {
System.out.println("聊天结束");
break;
}
// 添加用户消息
UserMessage userMessage = UserMessage.from(input);
userMessages.add(userMessage);
// 构建消息列表
List<Message> messages = new ArrayList<>();
messages.add(systemMessage);
// 添加最近的对话历史(保持上下文)
int startIndex = Math.max(0, userMessages.size() - 3);
for (int i = startIndex; i < userMessages.size(); i++) {
messages.add(userMessages.get(i));
if (i < aiMessages.size()) {
messages.add(aiMessages.get(i));
}
}
// 生成响应
AiMessage response = model.generate(messages);
aiMessages.add(response);
System.out.println("机器人: " + response.text());
}
scanner.close();
}
}上下文感知聊天
带记忆的聊天机器人
java
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModelWithMemory;
public class ContextAwareChatBot {
public static void main(String[] args) {
// 创建模型
ChatLanguageModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-3.5-turbo")
.build();
// 创建记忆
MessageWindowChatMemory memory = MessageWindowChatMemory.builder()
.maxMessages(10) // 保持最近的 10 条消息
.build();
// 创建带记忆的模型
ChatLanguageModelWithMemory modelWithMemory = ChatLanguageModelWithMemory.builder()
.chatLanguageModel(model)
.chatMemory(memory)
.build();
// 聊天循环
Scanner scanner = new Scanner(System.in);
System.out.println("上下文感知聊天机器人已启动,输入 'exit' 退出");
while (true) {
System.out.print("你: ");
String input = scanner.nextLine();
if (input.equalsIgnoreCase("exit")) {
System.out.println("聊天结束");
break;
}
// 生成响应(模型会记住之前的对话)
String response = modelWithMemory.generate(input);
System.out.println("机器人: " + response);
}
scanner.close();
}
}带持久化记忆的聊天机器人
java
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.memory.chat.PersistentChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModelWithMemory;
import dev.langchain4j.store.memory.SimpleMemoryStore;
public class PersistentChatBot {
public static void main(String[] args) {
// 创建模型
ChatLanguageModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-3.5-turbo")
.build();
// 创建持久化记忆
SimpleMemoryStore memoryStore = new SimpleMemoryStore();
PersistentChatMemory memory = PersistentChatMemory.builder()
.id("user-123") // 用户 ID
.storage(memoryStore)
.build();
// 创建带记忆的模型
ChatLanguageModelWithMemory modelWithMemory = ChatLanguageModelWithMemory.builder()
.chatLanguageModel(model)
.chatMemory(memory)
.build();
// 聊天循环
Scanner scanner = new Scanner(System.in);
System.out.println("持久化聊天机器人已启动,输入 'exit' 退出");
while (true) {
System.out.print("你: ");
String input = scanner.nextLine();
if (input.equalsIgnoreCase("exit")) {
System.out.println("聊天结束");
break;
}
// 生成响应(记忆会持久化)
String response = modelWithMemory.generate(input);
System.out.println("机器人: " + response);
}
scanner.close();
}
}多轮对话管理
带状态管理的聊天机器人
java
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModelWithMemory;
import java.util.HashMap;
import java.util.Map;
public class StatefulChatBot {
// 对话状态
private enum ChatState {
INIT,
COLLECTING_INFO,
PROVIDING_SERVICE
}
private static ChatState currentState = ChatState.INIT;
private static Map<String, String> userInfo = new HashMap<>();
public static void main(String[] args) {
// 创建模型
ChatLanguageModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-3.5-turbo")
.build();
// 创建记忆
MessageWindowChatMemory memory = MessageWindowChatMemory.builder()
.maxMessages(10)
.build();
// 创建带记忆的模型
ChatLanguageModelWithMemory modelWithMemory = ChatLanguageModelWithMemory.builder()
.chatLanguageModel(model)
.chatMemory(memory)
.build();
// 聊天循环
Scanner scanner = new Scanner(System.in);
System.out.println("带状态管理的聊天机器人已启动,输入 'exit' 退出");
while (true) {
System.out.print("你: ");
String input = scanner.nextLine();
if (input.equalsIgnoreCase("exit")) {
System.out.println("聊天结束");
break;
}
// 根据当前状态处理输入
String response = processInput(input, modelWithMemory);
System.out.println("机器人: " + response);
}
scanner.close();
}
private static String processInput(String input, ChatLanguageModelWithMemory model) {
switch (currentState) {
case INIT:
userInfo.clear();
currentState = ChatState.COLLECTING_INFO;
return "你好!我是你的个人助手。为了更好地帮助你,我需要了解一些基本信息。你叫什么名字?";
case COLLECTING_INFO:
if (!userInfo.containsKey("name")) {
userInfo.put("name", input);
return "很高兴认识你," + input + "!你从事什么工作?";
} else if (!userInfo.containsKey("job")) {
userInfo.put("job", input);
currentState = ChatState.PROVIDING_SERVICE;
return "好的," + userInfo.get("name") + ",作为一名" + input + ",我可以为你提供哪些帮助?";
}
break;
case PROVIDING_SERVICE:
// 使用模型生成响应
String prompt = "你是一个个人助手,正在与" + userInfo.get("name") + "交谈,他是一名" + userInfo.get("job") + "。请根据以下对话生成响应:" + input;
return model.generate(prompt);
}
return "我不太理解,请再说一遍。";
}
}带工具的聊天机器人
java
import dev.langchain4j.agent.Agent;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.model.openai.OpenAiChatModel;
public class ToolUsingChatBot {
public static void main(String[] args) {
// 创建模型
OpenAiChatModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-3.5-turbo")
.build();
// 创建工具
Tool weatherTool = Tool.builder()
.name("get_weather")
.description("获取指定城市的天气信息")
.function(input -> getWeather(input))
.build();
Tool calculatorTool = Tool.builder()
.name("calculate")
.description("执行数学计算")
.function(input -> calculate(input))
.build();
// 创建代理
Agent agent = Agent.builder()
.model(model)
.tools(Arrays.asList(weatherTool, calculatorTool))
.build();
// 聊天循环
Scanner scanner = new Scanner(System.in);
System.out.println("带工具的聊天机器人已启动,输入 'exit' 退出");
while (true) {
System.out.print("你: ");
String input = scanner.nextLine();
if (input.equalsIgnoreCase("exit")) {
System.out.println("聊天结束");
break;
}
// 执行任务
String response = agent.execute(input);
System.out.println("机器人: " + response);
}
scanner.close();
}
private static String getWeather(String city) {
// 模拟天气查询
return city + "的天气晴朗,温度 25 度,微风。";
}
private static String calculate(String expression) {
// 简单的数学计算
try {
// 这里使用脚本引擎执行计算
javax.script.ScriptEngineManager manager = new javax.script.ScriptEngineManager();
javax.script.ScriptEngine engine = manager.getEngineByName("JavaScript");
Object result = engine.eval(expression);
return "计算结果: " + result;
} catch (Exception e) {
return "计算错误: " + e.getMessage();
}
}
}最佳实践
用户体验:
- 提供友好的欢迎消息
- 保持响应简洁明了
- 处理用户输入错误
上下文管理:
- 使用记忆机制保持对话连贯性
- 合理设置记忆大小
- 实现会话管理
功能扩展:
- 集成更多工具
- 添加个性化功能
- 支持多语言
性能优化:
- 缓存常见问题的回答
- 优化提示词
- 合理使用模型
安全性:
- 过滤敏感内容
- 保护用户隐私
- 防止恶意输入
部署:
- 选择合适的部署方式
- 监控系统运行状态
- 实现自动扩展