Java调用DeepSeek-R1大模型实现商品订单信息提取
本文将详细介绍如何使用Java调用DeepSeek-R1大模型API,从自然语言文本中提取结构化商品订单信息的技术实现。
一、项目概述
在实际业务场景中,我们经常需要从用户输入的自然语言文本中提取结构化的商品订单信息。传统方法使用正则表达式或规则引擎,但面对复杂多变的文本格式时效果有限。本文介绍基于DeepSeek-R1大模型的智能解决方案,能够准确识别和提取商品信息。
二、技术架构
核心依赖
<!-- Gson用于JSON序列化/反序列化 --> <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.9</version> </dependency><!-- org.json用于构建JSON对象 --> <dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20231013</version> </dependency>
项目结构
src/main/java/com/black/ └── DeepseekR1.java
三、核心代码实现
1. 主类与常量定义
public class DeepseekR1 {public static final Gson gson = new Gson();public static final String MaaS_KEY = "sk-"; // 替换为实际API密钥public static void main(String[] args) {String question = "一、你的角色是:商品订单信息提炼大师。\n"+ "二、你的任务是:结合输入内容,提炼商品订单信息,并严格按照此JSON格式返回...";useDeepSeek(question);}
}2. API调用核心方法
public static void useDeepSeek(String question) {try {// 1. 创建HTTP连接URL url = new URL("http://maas-api.cn-huabei-1.xf-yun.com/v1/chat/completions");HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 2. 配置请求参数connection.setRequestMethod("POST");connection.setRequestProperty("Content-Type", "application/json");connection.setRequestProperty("Authorization", "Bearer " + MaaS_KEY);connection.setDoOutput(true);connection.setChunkedStreamingMode(0);// 3. 构建请求体JSONObject requestBody = buildRequestBody(question);// 4. 发送请求sendRequest(connection, requestBody);// 5. 处理响应processResponse(connection);connection.disconnect();} catch (Exception e) {e.printStackTrace();}
}3. 请求体构建
private static JSONObject buildRequestBody(String question) {JSONObject requestBody = new JSONObject();requestBody.put("model", "xdeepseekr1");JSONArray messages = new JSONArray();JSONObject message = new JSONObject();message.put("role", "user");message.put("content", question);messages.put(message);requestBody.put("messages", messages);requestBody.put("stream", false);requestBody.put("max_tokens", 16192);return requestBody;
}4. 响应数据处理
private static void processResponse(HttpURLConnection connection) throws IOException {try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {String line;while ((line = reader.readLine()) != null) {JsonParse_2 jsonParse2 = gson.fromJson(line, JsonParse_2.class);List<Choices_2> choices = jsonParse2.choices;for (Choices_2 tempChoice : choices) {System.out.println(tempChoice.message.content);}}}
}5. 响应数据模型类
static class JsonParse_2 {List<Choices_2> choices;
}static class Choices_2 {Message message;
}static class Message {String reasoning_content; // 推理过程内容String content; // 实际返回内容
}四、关键技术点解析
1. 提示词工程设计
本项目的核心在于精心设计的提示词,确保模型能够准确理解任务需求:
String question = "一、你的角色是:商品订单信息提炼大师。\n"+ "二、你的任务是:结合输入内容,提炼商品订单信息,并严格按照此JSON格式返回:"+ "{\"productList\":[{\"productName\":\"例如:黄瓜\",\"productNumber\":\"例如:2\","+ "\"unitOfMeasurement\":\"例如:斤\",\"productPrice\":\"例如:0.3\"}]}\n"+ "三、我的要求是:\n"+ "(1)productList必须包含内容中提到的所有商品信息,不能遗漏任何一条。\n"+ "(2)productName是指商品名称。\n"+ "(3)productNumber是指商品对应的数量。\n"+ "(4)unitOfMeasurement商品计价单位,可以是个、斤、袋等等。\n"+ "(5)productPrice是指商品一个计价单位的价格XXX元/个、XXX元/斤、XXX元/袋等等,仅返回XXX数值即可。";2. 分块传输编码
使用connection.setChunkedStreamingMode(0)启用分块传输,适用于大数据量请求,避免预先计算内容长度。
3. 流式响应处理
虽然本例中设置stream: false,但架构支持流式响应处理,适用于实时交互场景。
五、应用示例
输入文本示例:
1.黄瓜2斤三毛,西红柿3斤5毛,西蓝花5斤0.5元,花生一袋8角,西瓜1个10块,辣椒三斤6元 2.肉馅10斤,大包红豆沙1包,小米1袋,玉米1箱,金龙鱼油6桶
期望输出:
{"productList": [{"productName": "黄瓜", "productNumber": "2", "unitOfMeasurement": "斤", "productPrice": "0.3"},{"productName": "西红柿", "productNumber": "3", "unitOfMeasurement": "斤", "productPrice": "0.5"},{"productName": "西蓝花", "productNumber": "5", "unitOfMeasurement": "斤", "productPrice": "0.5"},{"productName": "花生", "productNumber": "1", "unitOfMeasurement": "袋", "productPrice": "0.8"},{"productName": "西瓜", "productNumber": "1", "unitOfMeasurement": "个", "productPrice": "10"},{"productName": "辣椒", "productNumber": "3", "unitOfMeasurement": "斤", "productPrice": "6"}]
}六、优化建议
1. 异常处理增强
public static void useDeepSeek(String question) {HttpURLConnection connection = null;try {// 连接和请求代码...} catch (Exception e) {logger.error("API调用失败", e);throw new RuntimeException("商品信息提取服务暂不可用", e);} finally {if (connection != null) {connection.disconnect();}}
}2. 配置外部化
将API密钥、端点URL等配置移至配置文件中:
# application.properties deepseek.api.key=sk-your-actual-key deepseek.api.url=http://maas-api.cn-huabei-1.xf-yun.com/v1/chat/completions deepseek.api.model=xdeepseekr1
3. 重试机制
添加网络异常时的重试逻辑,提高系统稳定性。
七、总结
本文介绍了使用Java调用DeepSeek-R1大模型API实现商品订单信息提取的完整方案。该方案具有以下优势:
准确性高:利用大模型的自然语言理解能力,准确识别复杂文本中的商品信息
扩展性强:可轻松适配不同的商品信息格式和业务场景
维护简单:基于标准的HTTP协议,部署和维护成本低
性能优异:支持流式处理,响应速度快
该技术可广泛应用于电商、零售、供应链管理等领域的订单处理系统中,显著提升数据处理的自动化水平和准确性。
注意:实际使用时请替换有效的API密钥,并根据具体业务需求调整提示词和响应处理逻辑。

