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

简述网站栏目管理dreawever如何做本地网站

简述网站栏目管理,dreawever如何做本地网站,php发布wordpress接口,盐城做网站的哪个公司好文章目录 引言一、什么是大模型二、为什么选择LLM三、开发技术说明四、系统架构说明五、编码实战1. Maven2. 讯飞大模型配置类3. LLM相关的封装4. 编写LLM的service5. 编写controller6. 运行测试 六、总结 引言 本篇文章主要是关于实现一个类似Chat2DB的根据自然语言生成SQL的… 文章目录 引言一、什么是大模型二、为什么选择LLM三、开发技术说明四、系统架构说明五、编码实战1. Maven2. 讯飞大模型配置类3. LLM相关的封装4. 编写LLM的service5. 编写controller6. 运行测试 六、总结 引言 本篇文章主要是关于实现一个类似Chat2DB的根据自然语言生成SQL的简单Demo根据此Demo可以入门大模型应用开发结合大模型开发出属于自己的大模型应用让自己的应用智能化可以根据用户不同问题做出不同的回答。 一、什么是大模型 如果各位有关注一些技术文章难免会注意到这几年有一个词非常火没错这就是“大模型” 那大模型是什么有什么用呢 “大模型”是可以指任何规模较大、参数众多的机器学习模型不仅限于自然语言处理NLP也可以包括计算机视觉、语音识别等其他领域的模型。大模型的特点是它们通常需要大量的数据来训练以及相对较大的计算资源。 大模型的用途十分广泛在很多领域都有不错的应用价值 自然语言的生成和理解大模型可以根据用户的问题生成连贯的文本回答、或是总结某些文章。ChatGPT就是一个不错的例子。图像的处理例如OpenAI的DALL·E模型它可以根据用户问题生成新的图像。语言的识别和生成大模型可以将文本信息转化为人类的语言。推荐系统大模型可以根据用户的行为或某些数据推测用户的行为爱好实现个性化推荐。 大模型的应用十分广泛除了上面举的例子外还有很多例子这里就不一一举例了。 下面我会使用大模型的其中一种**大型语言模型Large Language Model简称LLM**开发出一些简单的应用Demo读者可以根据这样的思路进一步完善。 在此之前先来介绍一下LLM是何物。LLM是指专门用来处理和理解自然语言的大型机器学习模型LLM通常通过在大量文本数据上进行预训练来学习语言的结构和语义从而能够执行各种语言处理任务如文本生成、翻译、摘要、问答和情感分析等。 二、为什么选择LLM LLM大模型是一款专注于理解和生成自然语言的大模型那我们系统中无论是Redis还是MySQL的数据都是文本形式的将这些文本信息的数据交与大模型处理能够有针对性地获取到我们想要的数据。 其次LLM的使用成本较低国内的大模型无论是讯飞星火大模型还是其他互联网厂商自研的大模型都为开发者提供了不少的免费Token使得学习成本大大降低。 LLM大模型也是我们大部分人群目前接触最多的大模型学习成本大幅度降低只需要知道如何和大模型进行聊天即可懂得如何开发不需要任何额外的学习成本。 三、开发技术说明 本文使用的大模型为讯飞星火大模型但是咱们不限于任何厂商的大模型有能力的ChatGPT也可以作者只是觉得讯飞星火大模型送的Token比较多非常适合初学者。 读者需要自行前往讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞 (xfyun.cn)进行领取免费Token领取教程这里就不多讲了网上大把教程不懂的可以下面留言。 其次该教程后端方面需要懂得使用SpringBoot进行开发也就是简单的一个接口开发没有任何的前端。 最后开发出来的Demo只是一个抛砖引玉的作用开发过程中不会考虑太多的规范和其他一些限制只是单纯把一个小功能实现代码量也不多一千行不到。 如果这些都准备好了那么下面开始发车。 四、系统架构说明 本篇文章会带大家结合后端技术与讯飞星火大模型实现实现根据用户的自然语言问题生成SQL的工具。 自然语言生成SQL是不是很熟悉没错这里是参考了阿里开源的Chat2DB数据库管理功能不过这里是作者对这个功能自主实现的Demo没有翻阅过Chat2DB源码故这里的实现可能并不是Chat2DB的底层实现原理 有能力的可以自己去看看源码Chat2DB: Chat2DB 是一款有开源免费的多数据库客户端工具支持windows、mac本地安装也支持服务器端部署web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2DB集成了AIGC的能力能够将自然语言转换为SQL也可以将SQL转换为自然语言可以给出研发人员SQL的优化建议极大的提升人员的效率是AI时代数据库研发人员的利器未来即使不懂SQL的运营业务也可 (gitee.com) 怎么根据用户的自然语言描述生成用户想要的SQL呢下面我们来分析分析 首先用户发送一个包含数据库host、user、password、table、用户问题的请求给后端后端根据用户提供的数据库信息连接数据库查询出该表的DDL后端与LLM建立连接将DDL、用户问题、prompt发送给LLMLLM根据后端提供的数据以及问题推测分析并生成SQL将SQL返回给后端后端将SQL返回响应给用户 也就是说后端需要获取并整理数据然后与LLM建立连接将数据发送给LLMLLM再根据数据做出回答返回给后端SQL这样就实现了自然语言生成SQL 五、编码实战 了解了整体架构是如何之后我们进入了编码实战阶段编码整体来说比较简单重要的理解整体的架构 1. Maven 构建SpringBoot项目引入一些我们需要的Maven依赖 dependencies!-- SpringBoot Web容器 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.12.3/version/dependency!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-annotations/artifactIdversion2.12.3/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!--okhttp3--dependencygroupIdcom.squareup.okhttp3/groupIdartifactIdokhttp/artifactId/dependencydependencygroupIdcom.alibaba.fastjson2/groupIdartifactIdfastjson2/artifactIdversion2.0.43/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.27/version !-- 根据你需要的版本进行调整 --/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies2. 讯飞大模型配置类 为了方便维护需要将讯飞星火大模型配置成一个类方便日后维护 并根据接口文档的内容生成鉴权信息 星火认知大模型Web API文档 | 讯飞开放平台文档中心 (xfyun.cn) ConfigurationProperties(xun-fei.xing-huo) Component Data public class XFLlmConfig {private String appId;private String domain;private String wsUrl;private String role;private String host;private String path;private String apiSecret;private String apiKey;private Long maxResponseTime;private String prompt;public String getWsUrl() {try {String httpUrl wsUrl.replaceAll(wss, https);Date date new Date();SimpleDateFormat sdf new SimpleDateFormat(EEE, dd MMM yyyy HH:mm:ss z, Locale.US);sdf.setTimeZone(TimeZone.getTimeZone(GMT));String formatData sdf.format(date);String tmp host: host \n;tmp date: formatData \n;tmp GET path HTTP/1.1;Mac mac Mac.getInstance(hmacsha256);SecretKeySpec spec new SecretKeySpec(apiSecret.getBytes(StandardCharsets.UTF_8), hmacsha256);mac.init(spec);byte[] hexDigits mac.doFinal(tmp.getBytes(StandardCharsets.UTF_8));// Base64加密String sha Base64.getEncoder().encodeToString(hexDigits);String authorization String.format(api_key\%s\, algorithm\%s\, headers\%s\, signature\%s\, apiKey, hmac-sha256, host date request-line, sha);// 拼接地址HttpUrl url Objects.requireNonNull(HttpUrl.parse(httpUrl)).newBuilder().addQueryParameter(authorization, Base64.getEncoder().encodeToString(authorization.getBytes(StandardCharsets.UTF_8))).addQueryParameter(date, formatData).addQueryParameter(host, host).build();return url.toString().replace(http://, ws://).replace(https://, wss://);} catch (Exception e) {throw new RuntimeException(getWsUrl 发生异常);}}}application.yml xun-fei:xing-huo:appId: 你的appIddomain: xxxxwsUrl: wss://${xun-fei.xing-huo.host}${xun-fei.xing-huo.path}role: userapiSecret: xxxxapiKey: xxxxhost: spark-api.xf-yun.compath: /v3.5/chat# 30smaxResponseTime: 30000prompt: 下面是一些表的DDL语句, 请严格根据这些DDL语句结合用户的问题为用户生成所需的SQL: \n%s \n用户问题是: %s\n注意只需要回复SQL即可!3. LLM相关的封装 下面的request以及response都是参考的接口文档封装的需要自己看看文档。 请求LLM的Request封装 Data public class XFLlmRequest {JsonProperty(header)private Header header;JsonProperty(parameter)private Parameter parameter;JsonProperty(payload)private Payload payload;DataBuilderpublic static class Header {JsonProperty(app_id)private String appId;JsonProperty(uid)private String uid;}DataBuilderpublic static class Parameter {JsonProperty(chat)private Chat chat;}DataBuilderpublic static class Chat {JsonProperty(domain)private String domain;JsonProperty(temperature)private Double temperature;JsonProperty(max_tokens)private Long maxTokens;}DataBuilderpublic static class Payload {JsonProperty(message)private Message message;}DataBuilderpublic static class Message {JsonProperty(text)private ListText text;}DataBuilderpublic static class Text {JsonProperty(role)private String role;JsonProperty(content)private String content;} }响应体封装 Data public class XFLlmResponse {JsonProperty(header)private Header header;JsonProperty(payload)private Payload payload;Datapublic static class Header {JsonProperty(code)private Long code;JsonProperty(message)private String message;JsonProperty(sid)private String sid;JsonProperty(status)private Long status;}Datapublic static class Payload {JsonProperty(choices)private Choices choices;}Datapublic static class Choices {JsonProperty(status)private Long status;JsonProperty(seq)private Long seq;JsonProperty(text)private ListText text;}Datapublic class Text {JsonProperty(content)private String content;JsonProperty(role)private String role;JsonProperty(index)private Long index;} }WebSocketListener的具体实现用于收集llm返回的结果 Slf4j public class XFWebSocketListener extends WebSocketListener {/*** 断开websocket标志位*/Getterprivate volatile boolean wsCloseFlag false;/*** 锁*/Getterprivate final Object lock new Object();/*** 语句组装buffer将大模型返回结果全部接收在组装成一句话返回*/private StringBuilder answer new StringBuilder();public String getAnswer() {return answer.toString();}Overridepublic void onOpen(WebSocket webSocket, Response response) {super.onOpen(webSocket, response);log.info(讯飞星火大模型连接成功);}Overridepublic void onMessage(WebSocket webSocket, String text) {synchronized (lock) {super.onMessage(webSocket, text);XFLlmResponse response JSON.parseObject(text, XFLlmResponse.class);log.info(response:{}, JSON.toJSONString(response));if (response.getHeader().getCode() ! 0) {log.error(发生错误错误信息为:{}, JSON.toJSONString(response.getHeader()));answer.append(大模型响应异常请联系管理员);// 关闭连接标识wsCloseFlag true;lock.notify();return;}ListXFLlmResponse.Text textList response.getPayload().getChoices().getText();for (XFLlmResponse.Text temp : textList) {log.info(讯飞大模型返回结果信息为{}, JSON.toJSONString(temp));answer.append(temp.getContent());}log.info(result:{}, answer.toString());if (response.getHeader().getStatus() 2) {wsCloseFlag true;log.info(wsCloseFlag为{}, wsCloseFlag result: answer);webSocket.close(1000, Closing WebSocket connection);lock.notify();}}}Overridepublic void onFailure(WebSocket webSocket, Throwable t, Response response) {super.onFailure(webSocket, t, response);try {if (null ! response) {int code response.code();assert response.body() ! null;log.error(onFailure body:{}, response.body().string());if (101 ! code) {log.error(讯飞星火大模型连接异常);}}} catch (IOException e) {log.error(IO异常 e);}}Overridepublic void onClosing(WebSocket webSocket, int code, String reason) {super.onClosing(webSocket, code, reason);wsCloseFlag false;answer new StringBuilder();} }4. 编写LLM的service LLMService提供两个方法一个是sendMsg用于给LLM发送数据getResult则是获取LLM的响应结果 Service Slf4j public class LlmServiceImpl implements LlmService {Resourceprivate XFLlmConfig xfLlmConfig;Overridepublic WebSocket sendMsg(String text, WebSocketListener webSocketListener) {String wsUrl xfLlmConfig.getWsUrl();Request request new Request.Builder().url(wsUrl).build();OkHttpClient client new OkHttpClient.Builder().build();String body buildBody(text);log.info(llm request body: {}, body);WebSocket webSocket client.newWebSocket(request, webSocketListener);webSocket.send(body);return webSocket;}SneakyThrowsOverridepublic String getResult(XFWebSocketListener webSocketListener) {synchronized (webSocketListener.getLock()) {Long maxResponseTime xfLlmConfig.getMaxResponseTime();long start System.currentTimeMillis();if (!webSocketListener.isWsCloseFlag()) {log.info(Thread ID: {}, wsCloseFlag:{}, 线程等待, Thread.currentThread().getId(), webSocketListener.isWsCloseFlag());webSocketListener.getLock().wait(maxResponseTime);}long end System.currentTimeMillis();log.info(Thread ID: {}, wsCloseFlag:{}, 等待时长:{} 线程被唤醒, Thread.currentThread().getId(), webSocketListener.isWsCloseFlag(), (end - start));if ((end - start) maxResponseTime) {throw new RuntimeException(响应超时请联系相关人员);}return webSocketListener.getAnswer();}}private String buildBody(String content) {XFLlmRequest request new XFLlmRequest();XFLlmRequest.Header header XFLlmRequest.Header.builder().appId(xfLlmConfig.getAppId()).build();request.setHeader(header);XFLlmRequest.Chat chat XFLlmRequest.Chat.builder().domain(xfLlmConfig.getDomain()).build();XFLlmRequest.Parameter parameter XFLlmRequest.Parameter.builder().chat(chat).build();request.setParameter(parameter);XFLlmRequest.Text text XFLlmRequest.Text.builder().content(content).role(xfLlmConfig.getRole()).build();XFLlmRequest.Message message XFLlmRequest.Message.builder().text(Collections.singletonList(text)).build();XFLlmRequest.Payload payload XFLlmRequest.Payload.builder().message(message).build();request.setPayload(payload);return JSON.toJSONString(request);} }5. 编写controller 用户发起请求的request封装 Data public class GenerateSqlRequest {/*** 端口号*/private String port;/*** 主机*/private String host;/*** 密码*/private String password;/*** 用户名*/private String userName;/*** 数据库名字*/private String databaseName;/*** 表的名字*/private String tableName;/*** 用户的问题*/private String problem; }RequestMapping(generate-sql) RestController RequiredArgsConstructor public class GenerateSqlController {private final static String URL jdbc:mysql://%s:%s/%s;private final XFLlmConfig xfLlmConfig;private final LlmService llmService;SneakyThrowsPostMappingpublic R generateSql(RequestBody GenerateSqlRequest request) {String url getUrl(request);String userName request.getUserName();String password request.getPassword();Class.forName(com.mysql.cj.jdbc.Driver);try (Connection conn DriverManager.getConnection(url, userName, password)) {String tableName request.getTableName();String query SHOW CREATE TABLE tableName;try (Statement stmt conn.createStatement();ResultSet rs stmt.executeQuery(query)) {if (rs.next()) {String ddl rs.getString(2);String prompt getPrompt(ddl, request);XFWebSocketListener webSocketListener new XFWebSocketListener();llmService.sendMsg(prompt, webSocketListener);String result llmService.getResult(webSocketListener);return R.success(result);}}} catch (SQLException e) {e.printStackTrace();}return R.fail();}public String getUrl(GenerateSqlRequest request) {return String.format(URL, request.getHost(), request.getPort(), request.getDatabaseName());}public String getPrompt(String ddl, GenerateSqlRequest request) {return String.format(xfLlmConfig.getPrompt(), ddl, request.getProblem());}6. 运行测试 六、总结 按照这样的一套流程我们就把LLM接入到系统中将我们的一个系统实现了智能化让我们的系统有了自主思考的能力这是一个不错的Demo。 对此大家可以根据这种思想将自己的项目改造不再是简单的CRUD功能这也是不错的亮点。
http://www.zqtcl.cn/news/44564/

相关文章:

  • 安徽合肥建设局网站如何制作网站赚钱
  • 做电影网站前途网页制作的公司哪家好
  • 网站建设方案报告百度品牌广告是什么
  • 成都网站建设公司创意网红蛋糕
  • wordpress 站点网络免费域名注册永久
  • 系统网站怎么做的佛山网站建设a068
  • 做网站界面需要注意什么问题网址域名注册费用
  • 一个备案可以做几个网站吗wordpress 附件 函数
  • 定制网站设计高端网站建设做平面设计兼职的网站
  • 网站开发能干什么用国外网站 图片做自媒体
  • 深圳做网站公司哪家好wordpress仿wiki
  • 定制软件的网站电商运营工作内容
  • 网站发帖功能怎么做网站怎么做分享链接
  • 如何有效提高网站排名邦派巴洛特网站是谁做的呀
  • 中信建设有限责任公司客户廊坊视频优化展现
  • 做网站一般都是那些人 会做广州企业推广网站建设
  • 百度推广移动端网站推荐5家知名
  • 外贸网站建设 深圳扬州哪里做网站
  • 智慧校园信息门户网站建设优秀英文企业网站
  • 个人网站用凡科建站好吗最新网页版传奇
  • 网站营销方式有哪些内容视觉传达设计主要学什么
  • 网站建设需要了解的信息苏州信息造价网
  • 佛山企业设计网站建设三里河网站建设公司
  • 去网站做dnf代练要押金吗淄博乐达网站建设
  • 设计师品牌 网站简单的网站建设怎么做
  • 公司的网站推广怎么做怎样自己做网页设计网站
  • 打电话沟通做网站话术建网站有什么好处
  • 中国制造网外贸平台网址扬州百度seo公司
  • 力网站票网站开发网站备案怎么更改吗
  • 麻涌手机网站设计湖南建设厅官方网站