当前位置: 首页 > wzjs >正文

汕头网站建设小程序江门网站开发多少钱

汕头网站建设小程序,江门网站开发多少钱,网站建设外包合同模板,大连网站建设好的公司本篇内容主要讲前端请求(不包含)访问后端服务接口,接口通过检索知识库,封装提示词,调用deepseek的,并返回给前端的全过程,非完整代码,不可直接运行。 1.基于servlet封装异步请求 为…

本篇内容主要讲前端请求(不包含)访问后端服务接口,接口通过检索知识库,封装提示词,调用deepseek的,并返回给前端的全过程,非完整代码,不可直接运行。

1.基于servlet封装异步请求

为什么要进行异步分装?因为前段需要流式输出,以减少用户长时间等待造成的不良体验

集成HttpServlet 实现POST方法,get方式多伦对话有数据了限制

@WebServlet(urlPatterns = "/ds",asyncSupported = true // 启用异步支持
)
public class DeepseekApi extends HttpServlet 

2.设置跨域(如果没有前后端分离可以忽略此步骤)

		response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");response.setHeader("Access-Control-Max-Age", "3600");response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type");response.setHeader("Access-Control-Allow-Credentials", "true");// 设置SSE头response.setContentType("text/event-stream");response.setCharacterEncoding("UTF-8");response.setHeader("Cache-Control", "no-cache");response.setHeader("Connection", "keep-alive");// 处理OPTIONS预检请求if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {response.setStatus(HttpServletResponse.SC_OK);asyncContext.complete();return;}

3.获取参数

我这里前段直接封装好多轮对话参数和当前问题,当前问题为什么要分开,应为问题需要在知识库做增强检索,这样好取参数

 // 获取问题参数String question = request.getParameter("question");String his = request.getParameter("his");

4.封装异步任务

asyncContext

 // 获取异步上下文final AsyncContext asyncContext = request.startAsync();asyncContext.setTimeout(3*60*1000); // 超时 60 秒writer = response.getWriter();processRequest(asyncContext, writer, question,his);

5.设置异步事件监听

 asyncContext.addListener(new AsyncListener() {@Overridepublic void onComplete(AsyncEvent event) {// 确保资源释放}@Overridepublic void onTimeout(AsyncEvent event) {writer.write("event:error\ndata:请求超时\n\n");writer.flush();asyncContext.complete();}@Overridepublic void onError(AsyncEvent event) {asyncContext.complete();}@Overridepublic void onStartAsync(AsyncEvent event) {}});

6.检索向量库

   // 检索向量库List<Map<String, Object>> kl = KnowledgeBaseService.searchKnowledge(question, 40);

7.构建提示词

 private static String buildPrompt(String question, List<Map<String, Object>> knowledge) {System.out.println("提示词封装!");String txtString="";for (Map<String, Object> map : knowledge) {txtString+=map.get("title")+"\n"+map.get("text")+"\n";}return "问题:\n" + question + "\n\n参考知识:" +txtString+ "\n\n请以参考知识为主,给出简明扼要的回复,如果参考知识与问题没有相关性或不存在请拒绝答复:";}

8.构建请求体

  // 新的对话内容JSONObject newMessage = new JSONObject();newMessage.put("role", "user");newMessage.put("content", prompt);// 插入新的对话messages.add(newMessage);System.out.println(messages.toJSONString());// 构建请求体Map<String, String> headers = new HashMap<>();headers.put("Authorization", "Bearer " + Consist.DEEPSEEK_API_KEY);headers.put("Content-Type", "application/json");JSONObject requestBody = new JSONObject();requestBody.put("model", Consist.MODEL_NAME);requestBody.put("messages", messages);requestBody.put("stream", true);requestBody.put("max_tokens", Consist.MAX_TOKENS);

9.进行异步调用

sendAsyncRequestWithCallback(Consist.DEEPSEEK_API_URL,headers,requestBody.toJSONString(),new StreamCallback() {@Overridepublic void onDataReceived(String content) {
//                    	System.out.print(content);writer.write("data:" + content+"\n\n");writer.flush();}@Overridepublic void onComplete() {System.out.println("调用完成!");writer.write("event:done\ndata:\n\n");writer.flush();asyncContext.complete();}@Overridepublic void onError(Exception ex) {
//                    	ex.printStackTrace();System.err.println("报错!");writer.write("event:error\ndata:发生错误\n\n");writer.flush();asyncContext.complete();}});

10.监察调用状态,防止客户端掉线造成的异常

  if (asyncClient == null || !asyncClient.isRunning()) {synchronized (DeepseekR1WebApiPost.class) {if (asyncClient == null || !asyncClient.isRunning()) {try {if (asyncClient != null) {asyncClient.close();}asyncClient = HttpAsyncClients.createDefault();asyncClient.start();} catch (IOException e) {e.printStackTrace();}}}}

11.封装客户端参数,调用deepseek官网接口

 HttpPost request = new HttpPost(new URI(url));request.setEntity(new StringEntity(requestBody, "UTF-8"));headers.forEach(request::setHeader);HttpHost target = new HttpHost(new URI(url).getHost(),new URI(url).getPort(),new URI(url).getScheme());

12.执行异步请求,并处理返回数据

   @Overrideprotected void onContentReceived(ContentDecoder decoder, IOControl ioctrl) {try {ByteBuffer bb = ByteBuffer.allocate(Consist.MAX_TOKENS);int read;while ((read = decoder.read(bb)) > 0) {bb.flip();byte[] bytes = new byte[bb.remaining()];bb.get(bytes);buffer.write(bytes);processBuffer(callback);bb.clear();}} catch (Exception e) {e.printStackTrace();System.out.println("报错: " + e.getMessage().toString());callback.onError(e);}}

13.解析流式数据返回给前端

 private void processBuffer(StreamCallback callback) throws Exception {String chunk = buffer.toString("UTF-8");buffer.reset();// 按行分割并过滤空行String[] lines = chunk.split("\\r?\\n");for (String line : lines) {if (line.isEmpty()) continue;if (line.startsWith("data: ")) {String jsonStr = line.substring(6).trim();if ("[DONE]".equals(jsonStr)) {callback.onComplete();return; // 提前返回避免后续处理}try {if(isJsonComplete(jsonStr)) {JsonObject responseJson = JsonParser.parseString(jsonStr).getAsJsonObject();JsonArray choices = responseJson.getAsJsonArray("choices");callback.onDataReceived(choices.toString());};
//                             // callback.onDataReceived(jsonStr);} catch (Exception e) {callback.onError(new RuntimeException("解析 JSON 失败: " + jsonStr, e));continue;}}}}
http://www.dtcms.com/wzjs/391775.html

相关文章:

  • 珠海企业网站18款禁用网站app直播
  • 做公司的网站大概多少钱建站推广
  • 企业培训机构网站源码百度推广平台登录网址
  • 南京做网站品牌搜索引擎大全入口
  • 找人做网站要密码吗口碑营销渠道
  • 网站点击量设计最近国家新闻
  • 中国网站的建设互联网平台公司有哪些
  • 洞泾做网站中国广告公司前十强
  • 网站怎么做支付接口站长工具搜索
  • 怎么做网站文章seo 是什么
  • 汽车之家网站是谁做的seo属于什么职位类型
  • 搭建国外网站的步骤南阳网站seo
  • 苏州建行网站首页市场推广计划方案模板
  • 石家庄做网站排名公司深圳网络推广代运营
  • 做网站banner分辨率设置多大广告推广app
  • 彩票网站建设制作广告行业怎么找客户
  • 网站外链快速建设广州建网站的公司
  • 大连开发区招聘信息网站推广优化
  • 好网站不收藏百度一下图片识别
  • 北京政府网站建设优化是什么意思?
  • 江西省新的建设厅三类人员网站91永久海外地域网名
  • 邢台网站建设基本流程网站结构优化
  • 做视频网站怎么赚钱公司网址怎么制作
  • 武汉网站开发软件程序员大数据培训班需要多少钱
  • 学校校园网站建设方案app推广项目从哪接一手
  • 关于网站备案的44个问题2023必考十大时政热点
  • 猎头公司是啥意思关键词优化是怎么做的
  • 全栈网站开发者网络营销推广主要做什么?
  • 电子商务建立网站前期准备百度推广app下载安卓版
  • 云南营造建设有限公司网站最近国际时事热点事件