From 25574c1a54ea34b0f9b84f93cbe1b3bfaad4b715 Mon Sep 17 00:00:00 2001 From: thinkgem Date: Mon, 19 May 2025 17:15:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20AI=20=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E5=8C=96=E8=BE=93=E5=87=BA=E4=BE=8B=E5=AD=90=E3=80=81=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E6=A0=BC=E5=BC=8F=E3=80=81JSON=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E3=80=81Java=E5=AF=B9=E8=B1=A1=E6=A0=BC=E5=BC=8F=E3=80=81?= =?UTF-8?q?=E7=BB=93=E5=90=88Tool=20Calling=E6=96=B9=E5=BC=8F=E8=BE=93?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/cms-ai/README.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/modules/cms-ai/README.md b/modules/cms-ai/README.md index 94c82409..aaa83974 100644 --- a/modules/cms-ai/README.md +++ b/modules/cms-ai/README.md @@ -119,12 +119,38 @@ CREATE INDEX ON vector_store_1024 USING HNSW (embedding vector_cosine_ops); * 菜单名称:AI 助手 * 菜单地址:/cms/chat/index -## 工具调用 Tool Calling +## 支持工具调用 Tool Calling 工具调用 Tool Calling(也称 Function Calling)是人工智能应用程序中的常见模式,允许模型与一组 API 或工具交互,从而增强其功能。 实例代码,详见 [CmsAiTools.java](https://gitee.com/thinkgem/jeesite5/blob/v5.springboot3/modules/cms-ai/src/main/java/com/jeesite/modules/cms/ai/tools/CmsAiTools.java) 让 AI 调用你的 java 实现你的业务联动。 +## 支持结构化输出 + +对于依赖可靠解析输出值的下游应用程序来说,LLM 产生结构化输出的能力很重要。开发人员希望将 AI 模型的结果快速转换为数据类型,如 JSON、XML 或 Java 类,这些类可以传递给其他应用程序函数和方法。 + +pom.xml 中注释掉 `spring-ai-starter-model-openai` +打开注释 `spring-ai-starter-model-ollama` +启用 `Ollama` 本地模型进行测试,地址如下: + +* 文本格式输出 + - 源码位置:CmsAiChatService.chatText(message) + - 访问地址: + - 输出结果:`你好!有什么问题或需要帮助的吗?` +* JSON 类型输出 + - 源码位置:CmsAiChatService.chatJson(message) + - 访问地址: + - 输出结果:`{"sex":"男","name":"张三","age":"17"}` +* 结合 Tool Calling 结构化输出 + - 开启参数:`spring.ai.tool-calls: true` + - 源码位置:CmsAiChatService.chatJson(message) + - 访问地址: + - 输出结果:`{"message":"客厅房间里的灯被打开","roomName":"客厅","on":true}` +* Java 对象类型输出: + - 源码位置:CmsAiChatService.chatArea(message) + - 访问地址: + - 输出结果:`[{"id":"110000","pageNo":1,"pageSize":10,"orderBy":"","isNewRecord":false,"dataMap":{},"status":"0","createBy":"system","createDate":"2025-01-01 19:25","updateBy":"system","updateDate":"2025-01-01 19:25","remarks":"","lastUpdateDateTime":1677843300000,"parentCodes":"0,","treeSort":110000,"treeSorts":"0000110000,","treeLeaf":"0","treeLevel":0,"treeNames":"北京市","childList":[{"id":"110100","pageNo":1,"pageSize":10,"orderBy":"","isNewRecord":false,"dataMap":{},"status":"0","createBy":"system","createDate":"2025-01-01 19:25","updateBy":"system","updateDate":"2025-01-01 19:25","remarks":"","lastUpdateDateTime":1677843300000,"parentCodes":"0,110000,","treeSort":110100,"treeSorts":"0000110000,0000110100,","treeLeaf":"0","treeLevel":1,"treeNames":"北京城区","childList":[{"id":"110101","isNewRecord":false,"areaCode":"110101","areaName":"东城区","areaType":"3","isRoot":true,"isTreeLeaf":false},{"id":"110102","isNewRecord":false,"areaCode":"110102","areaName":"西城区","areaType":"3","isRoot":true,"isTreeLeaf":false},{"id":"110105","isNewRecord":false,"areaCode":"110105","areaName":"朝阳区","areaType":"3","isRoot":true,"isTreeLeaf":false},{"id":"110106","isNewRecord":false,"areaCode":"110106","areaName":"丰台区","areaType":"3","isRoot":true,"isTreeLeaf":false},{"id":"110107","isNewRecord":false,"areaCode":"110107","areaName":"石景山区","areaType":"3","isRoot":true,"isTreeLeaf":false},{"id":"110108","isNewRecord":false,"areaCode":"110108","areaName":"海淀区","areaType":"3","isRoot":true,"isTreeLeaf":false},{"id":"110109","isNewRecord":false,"areaCode":"110109","areaName":"门头沟区","areaType":"3","isRoot":true,"isTreeLeaf":false},{"id":"110111","isNewRecord":false,"areaCode":"110111","areaName":"房山区","areaType":"3","isRoot":true,"isTreeLeaf":false}],"isQueryChildren":true,"areaCode":"110100","areaName":"北京城区","areaType":"2","isRoot":false,"parentCode":"110000","isTreeLeaf":false,"parentName":"北京市"}],"isQueryChildren":true,"areaCode":"110000","areaName":"北京市","areaType":"1","isRoot":true,"isTreeLeaf":false}]` + ## 授权协议声明 1. 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款。