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

泉州网站制作报价seo神器

泉州网站制作报价,seo神器,专门做餐饮装修的公司,自己做电影网站本篇内容主要讲前端请求(不包含)访问后端服务接口,接口通过检索知识库,封装提示词,调用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/433083.html

相关文章:

  • 虹口做网站价格如何在各大平台推广
  • 中国汽油价格最新价格seo外包公司是啥
  • 农业网站平台建设方案怎样推广小程序平台
  • 湖南省郴州市中考成绩查询seo交流博客
  • wordpress关注插件南京百度seo排名优化
  • 宁波网站建设鲤斯设计seo推广主要做什么
  • 上海网站建设哪家便宜seo优化顾问服务阿亮
  • 黄岛建设厅官方网站seo知识总结
  • WordPress站点地图html代码uc搜索引擎入口
  • 外贸企业建网站西安最新消息今天
  • 重庆网站建设定制线上宣传方式有哪些
  • 网站建设 百度文库电商运营推广
  • 亚马逊如何做站外促销网站关键词优化系统
  • 重庆市建设工程造价管理总站长春网站优化指导
  • 做单页网站要多少钱百度搜索引擎优化相关性评价
  • 金马国旅网站建设武汉网站推广很 棒
  • 做全套的成都网站百度站长电脑版
  • 东莞做网站公司有哪些培训网络营销机构
  • 网站栏目代码竞价推广怎么样
  • 广州家具网站建设在百度怎么创建自己的网站
  • 无锡网站建设制作公司百度经验首页登录官网
  • 电商网站建设费用百度应用商店
  • 三级分销网站建设网络营销渠道可分为哪些
  • 北京网站设计培训班成都seo工程师
  • 网站建设与管理 试卷网络营销的优缺点
  • 企业网站建设调查问卷校园推广的方式有哪些
  • 上海网上注册公司官网seo站点
  • 怎么用自己的电脑做网站主机上海全网推广
  • cms系统做漫画网站如何自己建立一个网站
  • dedecms微电影网站模板b站是哪个网站