一、整体架构与技术选型
1. 核心架构
系统分为三层,职责清晰:
- 前端交互层:简单的控制台界面(Java 实现),用于输入问题、展示回答;
- 核心逻辑层:Java 编写,负责接收用户输入、调用 Python AI 服务、处理返回结果;
介绍如何在本地搭建简易 AI 问答系统,采用 Java 作为核心交互与逻辑层,Python 负责 AI 模型调用。系统基于 ChatGLM-6B-int4 等轻量化模型,通过 Java ProcessBuilder 调用 Python 脚本实现通信。文章涵盖环境配置、代码实现、目录结构及常见问题排查,并提供性能优化与扩展方向建议,适合希望结合 Java 生态与 Python AI 能力的开发者参考。
系统分为三层,职责清晰:
| 模块 | 技术/工具 | 说明 |
|---|---|---|
| Java 核心 | JDK 11+、Maven | 基础运行环境、依赖管理 |
| Python AI | Python 3.9+、Transformers、PyTorch | 加载轻量化 LLM、处理问答 |
| 进程通信 | Java ProcessBuilder | Java 调用 Python 脚本 |
| 轻量化模型 | ChatGLM-6B-int4(推荐) | 本地运行,资源占用低 |
JAVA_HOME,验证:java -version 能显示版本即可。安装依赖包:
pip install torch transformers accelerate sentencepiece protobuf # 若用 ChatGLM,额外安装: pip install modelscope
推荐使用ChatGLM-6B-int4(适合 8G 以上内存的本地环境):
./models/chatglm-6b-int4)。编写 Python 脚本 ai_answer.py,负责加载模型并处理问答请求,接收 Java 传递的问题,返回回答。
import sys
from transformers import AutoTokenizer, AutoModel
# 加载 ChatGLM-6B-int4 模型(根据实际路径调整)
model_path = "./models/chatglm-6b-int4"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
# CPU 运行(无显卡):注释上一行,取消下一行注释
# model = AutoModel.from_pretrained(model_path, trust_remote_code=True).float()
model = model.eval()
def get_answer(question):
"""接收问题,返回 AI 回答"""
try:
response, _ = model.chat(tokenizer, question, history=[])
return response
except Exception as e:
return f"回答生成失败:{str(e)}"
if __name__ == "__main__":
# 接收 Java 传递的参数(问题)
if len(sys.argv) > 1:
question = sys.argv[1]
answer = get_answer(question)
# 输出回答(供 Java 读取)
print(answer)
else:
print("未接收到问题参数")
无需额外依赖,核心用 ProcessBuilder 调用 Python 脚本,实现用户交互。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class AIQASystem {
// Python 脚本路径(根据实际路径调整)
private static final String PYTHON_SCRIPT_PATH = "./ai_answer.py";
// Python 解释器路径(若已配置环境变量,直接写"python"即可)
private static final String PYTHON_EXECUTABLE = "python";
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("===== 本地 AI 问答系统 =====");
System.out.println("输入问题(输入'exit'退出):");
while (true) {
System.out.print("> ");
String question = scanner.nextLine().trim();
// 退出逻辑
if ("exit".equalsIgnoreCase(question)) {
System.out.println("系统退出中...");
break;
}
// 空问题校验
if (question.isEmpty()) {
System.out.println("请输入有效问题!");
continue;
}
// 调用 Python 获取回答
String answer = callPythonAI(question);
// 展示回答
System.out.println("AI 回答:\n" + answer + "\n");
}
scanner.close();
}
/**
* 调用 Python 脚本,获取 AI 回答
* @param question 用户输入的问题
* @return AI 生成的回答
*/
private static String callPythonAI(String question) {
ProcessBuilder processBuilder = new ProcessBuilder(PYTHON_EXECUTABLE, PYTHON_SCRIPT_PATH, question);
// 合并错误流(便于调试 Python 报错)
processBuilder.redirectErrorStream(true);
StringBuilder answer = new StringBuilder();
try {
Process process = processBuilder.start();
// 读取 Python 脚本的输出
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
answer.append(line);
}
// 等待进程结束
int exitCode = process.waitFor();
if (exitCode != 0) {
answer = new StringBuilder("AI 服务调用失败,退出码:" + exitCode + ",错误信息:" + answer);
}
} catch (IOException | InterruptedException e) {
answer = new StringBuilder("调用 Python 脚本异常:" + e.getMessage());
}
return answer.toString();
}
}
ProcessBuilder:用于启动 Python 进程,传递用户问题作为参数;redirectErrorStream(true):将 Python 的错误输出合并到标准输出,便于调试;callPythonAI:封装调用逻辑,返回 AI 回答(含异常处理);exit 退出系统。确保文件路径正确,推荐结构:
ai-qa-system/
├── ai_answer.py # Python AI 脚本
├── models/
│ └── chatglm-6b-int4 # 下载的轻量化模型
└── src/
└── main/
└── java/
└── AIQASystem.java # Java 主类
编译并运行 Java 代码(IDEA/Eclipse 直接运行 AIQASystem 类,或用命令行):
# 编译
javac AIQASystem.java
# 运行
java AIQASystem
先确认 Python 脚本能独立运行:
python ai_answer.py "什么是 Java?"
若能输出回答,说明 Python 端正常;
PYTHON_SCRIPT_PATH 是否为绝对路径;PYTHON_EXECUTABLE 为绝对路径(如 C:\Python39\python.exe);本系统通过 Java 实现核心交互与逻辑控制,Python 负责 AI 模型的调用,兼顾了 Java 的易用性和 Python 在 AI 领域的生态优势,是本地搭建轻量化 AI 问答系统的极简方案。你可以基于此框架,根据自身需求扩展功能,比如对接本地数据、优化交互体验,或替换更适配的 AI 模型。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online