JMeter与大模型融合应用之JMeter创建二级菜单的简单大模型交互
需求描述
我们需要实现如下业务
1.在JMeter的一级菜单下面,生产一个AI Assistant的二级菜单
2.点击AI Assistant能够弹出AI助手弹框
3.输入内容以后,大模型能够进行回答
业务实现
增加菜单
第一步:在org\apache\jmeter\gui\action\ActionNames.java路径下新增如下代码
public static final String AI_ASSISTANT = “ai_assistant”; //
第二步:在org/apache/jmeter/gui/util/JMeterMenuBar.java路径下,找到你需要新增哪个一级菜单下添加二级菜单,比如需要在我自己新增的一级菜单中添加二级菜单,关于如何添加一级菜单,可以在之前文章中进行学习,这里不再赘述,内容如下:
private void makeTCMenu(){
//中间代码省略
TCMenu = makeMenuRes("config_tc_tools",'C'); //$NON-NLS-1$
//中间代码省略
JMenuItem aiAssistant = makeMenuItemRes("ai_assistant", ActionNames.AI_ASSISTANT);//$NON-NLS-1$
//中间代码省略
TCMenu.add(aiAssistant);
//中间代码省略
}
至此二级菜单设置完毕。
增加点击菜单事件
当面点击以后,我们需要跳出AI助手的交互框,我们需要进行操作
第一步:新增触发事件,代码如下
import org.apache.jmeter.gui.action.AbstractAction;
import org.apache.jmeter.gui.action.ActionNames;
import org.apache.jmeter.sptp.gui.ChatWindow;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class AIAssistant extends AbstractAction {
//设置事件
private static final Logger log = LoggerFactory.getLogger(AIAssistant.class);
private static final Set<String> commandSet;
static {
Set<String> commands = new HashSet<>();
commands.add(ActionNames.AI_ASSISTANT);
commandSet = Collections.unmodifiableSet(commands);
}
//获取事件列表
@Override
public Set<String> getActionNames(){
return AIAssistant.commandSet;
}
//对应动作信息
@Override
public void doAction(ActionEvent e){
if(e.getActionCommand().equals(ActionNames.AI_ASSISTANT)){
SwingUtilities.invokeLater(() -> new ChatWindow());
}
}
}
AI助手交互
当我们有对应的AI助手界面出发以后,我们需要对界面上的功能进行实现,代码如下
import org.apache.jmeter.sptp.business.Qwen;
import org.apache.jmeter.util.JMeterUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ChatWindow extends JFrame {
private JTextArea chatArea;
private JTextArea inputArea;
private JButton sendButton;
private JButton clearButton;
public ChatWindow() {
super("AI助手");
setIconImage(JMeterUtils.getImage("AI.png").getImage());
setLayout(new BorderLayout());
setSize(500, 400);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// 创建聊天区域
chatArea = new JTextArea();
chatArea.setEditable(false);
chatArea.setLineWrap(true); // 设置自动换行
chatArea.setWrapStyleWord(true); // 设置单词级别的换行
JScrollPane scrollPane = new JScrollPane(chatArea);
add(scrollPane, BorderLayout.CENTER);
// 创建输入区域
inputArea = new JTextArea(3, 20);
inputArea.setLineWrap(true);
inputArea.setWrapStyleWord(true);
JScrollPane inputScrollPane = new JScrollPane(inputArea);
inputScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
inputScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
// 创建发送按钮
sendButton = new JButton("发送内容");
sendButton.addActionListener(new SendActionListener());
// 创建清空按钮
clearButton = new JButton("清空内容");
clearButton.addActionListener(new ClearActionListener());
// 创建按钮面板
JPanel buttonPanel = new JPanel();
buttonPanel.add(sendButton);
buttonPanel.add(clearButton);
// 创建输入面板
JPanel inputPanel = new JPanel();
inputPanel.add(inputScrollPane);
inputPanel.add(buttonPanel);
add(inputPanel, BorderLayout.SOUTH);
// 设置窗口居中显示
setLocationRelativeTo(null);
setVisible(true);
}
private class SendActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String message = inputArea.getText();
if (!message.isEmpty()) {
chatArea.append("你:" + message + "\n");
inputArea.setText("");
new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws Exception {
setTitle("AI助手正在思考中...");
setIconImage(JMeterUtils.getImage("thinking.png").getImage());
Qwen qwen = new Qwen();
return qwen.QwenAI(message);
}
@Override
protected void done() {
try {
String result = get();
chatArea.append("大模型:" + result + "\n");
setTitle("AI助手");
setIconImage(JMeterUtils.getImage("AI.png").getImage());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}.execute();
setTitle("AI助手");
setIconImage(JMeterUtils.getImage("AI.png").getImage());
}
}
}
private class ClearActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
chatArea.setText("");
}
}
}
至此我们就实现了上述的需求内容