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

廊坊制作网站模板建站公司昆明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/a/584699.html

相关文章:

  • 网站开发语言数据库有几种网站建设管理存在问题
  • 做淘宝保健品药品在哪个网站找素材做淘宝客建网站要多少费用
  • 哪里有做网站技术泉州网站建设策划
  • 网站建设公司 保证完成 电子商务公司
  • 网络营销 网站建设郴州市有几个县
  • 任何判断网站SEO做的好坏官方网站开发合同
  • 便宜旅游机票网站建设济南市住房和城乡建设局官网
  • 做外贸做几个网站合适网络营销和电子商务的区别
  • 在百度怎么免费制作网站门户网站属于新媒体吗
  • seo网站优化多少钱媒体网站网页设计
  • 亳州蒙城网站建设wordpress实现浮动联系
  • 磁县网站建设资深的网站推广
  • 哪个网站可以做验证码兼职没有网站怎么做seo
  • 山西免费网站建设成都上市的网站建设公司
  • 重庆专业微信网站制作有什么做美食的网站
  • 深圳专业医疗网站建设学网站开发推荐书
  • 兼职做视频的网站电子商务网站建设与设计
  • 书店中文网站模板开设公司网站
  • 网站排版类型产品推广策划案
  • 曲阜建设局网站网站建设的建议例子
  • 网站建设协议 模板设计在线接单
  • 建设一个很大的视频网站需要多少钱一分钟看懂seo
  • 宁波网站建设i sp.net公司网页制作培训试题
  • 定制开发网站 推广商城网站建设源码
  • 做国外有那些网站比较好的天津工程建设信息网官网
  • 济南知名网站建设平台公司搜索seo
  • 自己做的美食分享到网站汕头市网站建设公司
  • 网页制作平台是什么宁波seo公司
  • 网站漂浮窗口代码手机微信网站怎么做
  • 建设企业网站综合考虑让顾客心动的句子