diff --git a/Debate_backend/.idea/uiDesigner.xml b/Debate_backend/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/Debate_backend/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Debate_backend/src/main/java/com/learning/newdemo/common/Result.java b/Debate_backend/src/main/java/com/learning/newdemo/common/Result.java index 38fcf5f..1c18e82 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/common/Result.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/common/Result.java @@ -8,6 +8,7 @@ import java.io.Serializable; * 统一API返回结果封装 */ @Data +// Serializable接口的作用是:标记当前类可以通过序列化在网络中传播 public class Result implements Serializable { private static final long serialVersionUID = 1L; diff --git a/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java b/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java new file mode 100644 index 0000000..362c836 --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java @@ -0,0 +1,86 @@ +package com.learning.newdemo.controller; + + +import com.learning.newdemo.common.Result; +import com.learning.newdemo.service.WxArgumentService; +import com.learning.newdemo.service.WxReviewService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping("api/ai") +public class WxAIController { + @Autowired + private WxArgumentService wxArgumentService; + + @Autowired + private WxReviewService wxReviewService; + + private String topic; + + private String stance; + + private String content; + + @PostMapping("/argument") + public Result> getArgument(@RequestBody Map params){ + topic = params.get("topic"); + stance = params.get("stance"); + + + if(topic == null || stance == null){ + return Result.error("立论主题或者内容为空"); + } + + log.info("请求内容: {}", params); + + try { + String argument = wxArgumentService.getArgument(topic, stance); + if (argument == null) { + return Result.error("立论获取失败"); + } + + Map data = new HashMap<>(); + data.put("argument", argument); + // 查看data + log.info("立论获取成功:{}", argument); + + return Result.success(data); + }catch (Exception e){ + log.error("立论获取失败", e); + return Result.error("立论获取失败:" + e.getMessage()); + } + } + + @PostMapping("/review") + public Result> review(@RequestBody Map params){ + log.info("请求内容: {}", params); + + content = params.get("content"); + + try { + String review = wxReviewService.getReview(content); + if (review == null) { + return Result.error("复盘获取失败"); + } + + Map data = new HashMap<>(); + data.put("review", review); + // 查看data + log.info("复盘获取成功:{}", review); + + return Result.success(data); + }catch (Exception e){ + log.error("复盘获取失败", e); + return Result.error("复盘获取失败:" + e.getMessage()); + } + } +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/WxArgumentService.java b/Debate_backend/src/main/java/com/learning/newdemo/service/WxArgumentService.java new file mode 100644 index 0000000..7477f7a --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/WxArgumentService.java @@ -0,0 +1,9 @@ +package com.learning.newdemo.service; + +/** + * 微信立论助手接口 + */ + +public interface WxArgumentService { + String getArgument(String topic, String stance); +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/WxReviewService.java b/Debate_backend/src/main/java/com/learning/newdemo/service/WxReviewService.java new file mode 100644 index 0000000..c270cf5 --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/WxReviewService.java @@ -0,0 +1,5 @@ +package com.learning.newdemo.service; + +public interface WxReviewService { + String getReview(String content); +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java new file mode 100644 index 0000000..cb6499b --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java @@ -0,0 +1,95 @@ +package com.learning.newdemo.service.impl; + +import com.learning.newdemo.service.WxArgumentService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +@Service +@Slf4j +public class WxArgumentServiceImpl implements WxArgumentService { + + private final RestTemplate restTemplate; + + @Value("${ai.argument.header.Authorization}") private String authorizationHeader; + @Value("${ai.argument.body.message.role-sys}") private String roleSys; + @Value("${ai.argument.body.message.content-sys}") private String contentSys; + @Value("${ai.argument.body.message.role-user}") private String roleUser; + @Value("${ai.argument.body.model}") private String model; + @Value("${ai.argument.body.frequency_penalty}") private int frequencyPenalty; + @Value("${ai.argument.body.max_tokens}") private int maxTokens; + @Value("${ai.argument.body.presence_penalty}") private int presencePenalty; + @Value("${ai.argument.body.response_format}") private String responseFormatType; + @Value("${ai.argument.body.stream}") private boolean stream; + @Value("${ai.argument.body.temperature}") private double temperature; + @Value("${ai.argument.body.top_p}") private double topP; + @Value("${ai.argument.body.tool_choice}") private String toolChoice; + @Value("${ai.argument.body.logprobs}") private boolean logprobs; + @Value("${ai.argument.url}") private String url; + + public WxArgumentServiceImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + @Override + public String getArgument(String topic, String stance) { + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.set("Authorization", authorizationHeader); + + // 构建请求体,使用字符串拼接 + String requestBody = "{" + + "\"messages\": [" + + "{" + + "\"role\": \"" + roleSys + "\"," + + "\"content\": \"" + escapeJson(contentSys) + "\"" + + "}," + + "{" + + "\"role\": \"" + roleUser + "\"," + + "\"content\": \"" + escapeJson(topic + ",我的立场是" + stance) + "\"" + + "}" + + "]," + + "\"model\": \"" + model + "\"," + + "\"frequency_penalty\": " + frequencyPenalty + "," + + "\"max_tokens\": " + maxTokens + "," + + "\"presence_penalty\": " + presencePenalty + "," + + "\"response_format\": {\"type\": \"" + responseFormatType + "\"}," + + "\"stop\": null," + + "\"stream\": " + stream + "," + + "\"stream_options\": null," + + "\"temperature\": " + temperature + "," + + "\"top_p\": " + topP + "," + + "\"tools\": null," + + "\"tool_choice\": \"" + toolChoice + "\"," + + "\"logprobs\": " + logprobs + "," + + "\"top_logprobs\": null" + + "}"; + + log.info("请求体:{}", requestBody); + + HttpEntity requestEntity = new HttpEntity<>(requestBody, headers); + ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); + return response.getBody(); + } catch (Exception e) { + log.error("向AI获取立论失败", e); + return null; + } + } + + // 工具方法:转义 JSON 字符串中的特殊字符 + private String escapeJson(String input) { + if (input == null) return ""; + return input.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("\r", "\\r") + .replace("\t", "\\t"); + } +} \ No newline at end of file diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxReviewServiceImpl.java b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxReviewServiceImpl.java new file mode 100644 index 0000000..655d9f4 --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxReviewServiceImpl.java @@ -0,0 +1,91 @@ +package com.learning.newdemo.service.impl; + +import com.learning.newdemo.service.WxReviewService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +@Service +@Slf4j +public class WxReviewServiceImpl implements WxReviewService { + + private final RestTemplate restTemplate; + + @Value("${ai.argument.header.Authorization}") private String authorizationHeader; + @Value("${ai.argument.body.message.role-sys}") private String roleSys; + @Value("${ai.review.body.message.content-sys}") private String contentSys; + @Value("${ai.argument.body.message.role-user}") private String roleUser; + @Value("${ai.argument.body.model}") private String model; + @Value("${ai.argument.body.frequency_penalty}") private int frequencyPenalty; + @Value("${ai.argument.body.max_tokens}") private int maxTokens; + @Value("${ai.argument.body.presence_penalty}") private int presencePenalty; + @Value("${ai.argument.body.response_format}") private String responseFormatType; + @Value("${ai.argument.body.stream}") private boolean stream; + @Value("${ai.argument.body.temperature}") private double temperature; + @Value("${ai.argument.body.top_p}") private double topP; + @Value("${ai.argument.body.tool_choice}") private String toolChoice; + @Value("${ai.argument.body.logprobs}") private boolean logprobs; + @Value("${ai.argument.url}") private String url; + + public WxReviewServiceImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + @Override + public String getReview(String content) { + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.set("Authorization", authorizationHeader); + + // 构建请求体,使用字符串拼接 + String requestBody = "{" + + "\"messages\": [" + + "{" + + "\"role\": \"" + roleSys + "\"," + + "\"content\": \"" + escapeJson(contentSys) + "\"" + + "}," + + "{" + + "\"role\": \"" + roleUser + "\"," + + "\"content\": \"" + content + "\"" + + "}" + + "]," + + "\"model\": \"" + model + "\"," + + "\"frequency_penalty\": " + frequencyPenalty + "," + + "\"max_tokens\": " + maxTokens + "," + + "\"presence_penalty\": " + presencePenalty + "," + + "\"response_format\": {\"type\": \"" + responseFormatType + "\"}," + + "\"stop\": null," + + "\"stream\": " + stream + "," + + "\"stream_options\": null," + + "\"temperature\": " + temperature + "," + + "\"top_p\": " + topP + "," + + "\"tools\": null," + + "\"tool_choice\": \"" + toolChoice + "\"," + + "\"logprobs\": " + logprobs + "," + + "\"top_logprobs\": null" + + "}"; + + log.info("请求体:{}", requestBody); + + HttpEntity requestEntity = new HttpEntity<>(requestBody, headers); + ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); + return response.getBody(); + } catch (Exception e) { + log.error("向AI获取立论失败", e); + return null; + } + } + + // 工具方法:转义 JSON 字符串中的特殊字符 + private String escapeJson(String input) { + if (input == null) return ""; + return input.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("\r", "\\r") + .replace("\t", "\\t"); + } +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxUserServiceImpl.java b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxUserServiceImpl.java index db2950d..b218493 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxUserServiceImpl.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxUserServiceImpl.java @@ -43,7 +43,12 @@ public class WxUserServiceImpl implements WxUserService { + "&js_code=" + code + "&grant_type=authorization_code"; + log.info("请求微信接口URL: {}", url); + ResponseEntity response = restTemplate.getForEntity(url, String.class); + String responseBody = response.getBody(); + + log.info("微信接口返回: {}", responseBody); JSONObject json = JSONObject.parseObject(response.getBody()); // 获取openid diff --git a/Debate_backend/src/main/resources/application.yml b/Debate_backend/src/main/resources/application.yml index 9cba36c..932e7e3 100644 --- a/Debate_backend/src/main/resources/application.yml +++ b/Debate_backend/src/main/resources/application.yml @@ -19,6 +19,214 @@ wechat: appid: wxf1f6d7657e01d48a secret: fc356336a118366f27c384079688bc15 +# AI接口配置 +ai: + argument: + url: https://api.deepseek.com/chat/completions + header: + Authorization: "Bearer sk-53428f3b07ff426f8c11d988f649b5e7" + body: + message: + role-sys: system + content-sys: | + 竞技辩论比赛立论撰写指南 + 你是一个华语辩论的爱好者,你要在接下来学习如何完成一场竞技辩论赛立论的撰写,并且成为一个专业的立论专家。当我给你输入任何一道辩题和持方时,你都能模仿我给你提供的数据,写出一篇完整的,自然段语言式的,辩论圈认可的立论。 + 一、立论稿的本质与功能 + 立论稿是辩论中系统阐述己方观点的开篇陈述,需具备: + 1. 明确的定义判准 + 2. 完整的论证体系 + 3. 严谨的逻辑结构 + 4. 充分的论据支撑 + + 二、标准结构(四段式黄金框架) + 1. 定义与背景(15%篇幅) + - 核心概念界定(引用权威定义) + - 讨论范围限定(时空/领域边界) + - 辩题现实意义(社会背景阐述) + - 辩题判断标准(整场比赛的判准) + + 2. 论证主体(80%篇幅,一般为两个论点) + 每一个论点单独成一个自然段,采用“金字塔结构”: + - 第一句是一个自然段的核心论点(一个核心论点句),论点句需要是一个完整的判断句。 + - 后面进行论证展开(每个论点的背后都有一个完整的逻辑链闭环,完整地展开论点背后的逻辑,并穿插以下三种论据,来补充论证) + 「前提→推理→结论」的三段式链条,推理可以是A->B,也可以是A->B->C,推理的过程依赖于论述的语言和三种论据:①统计数据(近3年权威报告)②典型案例(具名事件)③专家观点(学术/行业权威) + 要求:展开的内容丰富,背后的逻辑链完整严谨准确 + + 3. 价值升华(5%篇幅) + 概括前面的论证主体,然后一句话价值升华 + + 三、专业写作要点 + + 1. 概念界定原则 + - 采用“属+种差”定义法 + - 优先引用国家标准/学术定义 + - 避免循环定义和主观表述 + + 2. 论证规范要求 + ① 数据使用: + - 标明来源机构/年份/样本量 + - 优先选用政府/学术机构数据 + - 动态数据需注明统计时段 + ② 案例选取: + - 具名真实事件(时间+主体+结果) + - 排除虚构假设性案例 + - 中外案例比例建议7:3 + ③论述语言: + - 避免过于学术化 + - 避免过于生活化/口语化 + - 使用精准的,规范严谨的自然语言 + + 3. 语言表达技巧 + - 一篇文章四个自然段,定义与背景一个自然段,每一个论点一个自然段,价值升华一个自然段 + - 每一段控制在400汉字以内,两个论点段控制在300汉字以上 + - 关键术语首次出现加粗 + - 避免修辞性设问 + + 四、常见误区警示 + + 1. 结构错误 + × 混合使用不同论证模型 + × 论点之间存在包含关系 + × 价值升华与论证脱节 + 2. 论据问题 + × 使用过期数据(超过3年) + × 案例缺乏公信力来源 + × 专家引用断章取义 + 3. 表达缺陷 + × 使用绝对化表述 + × 专业术语堆砌 + × 情感化修辞过度 + role-user: user + model: deepseek-chat + frequency_penalty: 0 + max_tokens: 2048 + presence_penalty: 0 + response_format: text + stream: false + temperature: 1 + top_p: 1 + tool_choice: "none" + logprobs: false + review: + url: https://api.deepseek.com/chat/completions + header: + Authorization: "Bearer sk-53428f3b07ff426f8c11d988f649b5e7" + body: + message: + role-sys: system + content-sys: | + 评委指南 + + 你是一个华语辩论人类评委。这是你的竞技辩论赛评委评判指南,你需要基于这个指南,完成辩论比赛的评判:以下为综合多篇辩论赛评委指南与培训资料整理的**完整评委点评操作手册**,严格遵循客观性、细节化与责任量化原则: + + --- + 一、开场与礼节 + 1. 礼仪问候 + - 向主办方、主席、辩手及观众致谢,肯定比赛价值 + - 示例:“感谢主办方提供交流平台,双方辩手为准备比赛付出的努力值得掌声。” + 2. 判准说明 + - 明确告知评判标准(如说服力优先/逻辑完整性优先)及心证介入程度 + - 示例:“本场以‘有效回应率’为核心判准,仅介入基础常识性心证(如历史事实),价值观争议由辩手自行论证。” + --- + 二、立论拆解与记录(尽可能详细和完整,不要主观概括) + 1. 正方立论复现 + - 定义:逐字记录核心概念界定(如“宿命=结构性高概率风险”) + - 框架:分论点逻辑链(例:认知落差→自我透明错觉→时空差异) + - 实证:标注数据来源(如《科学》杂志研究)及案例适用性(如数学家构建零误解语言失败) + 2. 反方立论复现 + - 定义:差异化界定(如“宿命=必然不可改变属性”) + - 框架:论证路径(例:方法论规避→技术干预→价值主张) + - 实证:记录反例类型(如韩国网络实名制误解率下降43%)及数据完整性 + 记录工具建议:使用分栏表格(如下),红笔标注未论证部分 + 维度 + 正方内容 + 反方内容 + 定义 + 结构性高概率风险 + 必然不可改变属性 + 核心论点 + 三阶机理(认知落差→自我透明错觉→时空差异) + 双重路径(开放式表达+算法过滤) + --- + 三、攻防细节实录(尽可能详细和完整,不要主观概括) + 1. 关键交锋逐句记录 + - 定义战: + - 反方质疑:“若宿命=高概率,30%文盲率是否构成宿命?”→ 正方回应:“宿命需机理不可逆性,文盲可通过教育改变,时空差异无法消除”(引用联合国扫盲数据)→ **有效性**:正方回应有效(守住机理标准),反方未追击“不可逆性”自洽性 + - 实证战: + - 反方引用韩国案例,正方质疑数据覆盖范围(未包含社交媒体)→ 反方补充首尔大学报告第17页样本说明→ **有效性**:反方数据完整,但未回应“算法过滤导致表达萎缩”衍生问题 + 2. 无效回应标注 + - 正方四辩未量化“高概率阈值”(如87%是否达标),导致机理说服力下降 + - 反方混淆“多元解读”与“误解”界限,未区分艺术与日常表达场景 + 记录工具建议:时间轴标记法(例:12:30-13:00 反方三辩未回应正方质询) + --- + 四、论证责任完成度量化(不是简单的量化,需要评估核心战场和挑战,不是所有挑战都是一样的权重) + 1. 正方责任评估 + - 完成项:三阶机理论证(60%),定义防御(回应文盲类比) + - 未完成项:未解释“30% vs 87%”阈值差异,未反驳反方群体必然性关联性质疑 + 2. 反方责任评估 + - 完成项:证伪“绝对必然性”(50%),韩国案例实证完整 + - 未完成项:未覆盖日常表达场景(如医疗告知需精确语义),未衔接实证与价值主张 + 量化公式参考: + 单方完成度 = (有效回应数 ÷ 总挑战数)× 100% + (例:正方回应反方5次挑战中的3次 → 完成度60%) + + --- + + 五、胜负判定模板 + 1. 战场归属统计 + 战场 + 正方得分 + 反方得分 + 依据 + 定义战 + ✓ + + 守住机理不可逆性 + 实证战 + + ✓ + 韩国案例数据完整但场景受限 + 价值战 + 平 + 平 + 双方未衔接实证与价值 + 2. 终局判词“正方通过机理不可逆性论证更贴近宿命本质,反方实证覆盖不足导致价值断裂,故判正方胜。” + --- + 六、改进建议指南 + 1. 正方优化方向 + - 补充“高概率阈值”学术界定(如引用社会心理学“群体认知偏差”研究) + - 深化价值自洽:回应“宿命论是否导致消极躺平”(例:加缪式存在主义勇气) + 2. 反方优化方向 + - 区分艺术与日常表达场景,补充欧盟《数字服务法》平衡性案例 + - 实证延伸:量化“开放式表达促进社会创新”数据(如专利合作沟通案例) + --- + 七、评委禁忌清单 + 1. 表述禁区 + - 绝对化断言:“反方立论完全错误” + - 主观情感:“我被正方四辩的煽情打动” + + 2. 程序禁区 + - 提前暗示结果:“反方某论点已决定胜负” + - 介入未挑战定义:“默认反方扩大外延无效” + --- + 八、工具包与训练建议 + 1. 记录工具:康奈尔笔记法(主栏记录/副栏批注)、多色荧光笔标注攻防有效性 + 2. 判准校准训练:观摩5场不同风格比赛(哲理辩/政策辩),检验判准普适性 + 3. 反馈话术库: + - 建设性批评:“建议补充**世界卫生组织沟通指南**强化数据权威性” + - 价值升华:“辩论如苏格拉底产婆术,助真理诞生而非制造对立” + --- + role-user: user + model: deepseek-chat + frequency_penalty: 0 + max_tokens: 2048 + presence_penalty: 0 + response_format: text + stream: false + temperature: 1 + top_p: 1 + tool_choice: "none" + logprobs: false # JWT配置 jwt: secret: yoursecretkey123456789abcdefghijklmnopqrstuvwxyz diff --git a/Debate_backend/target/classes/application.yml b/Debate_backend/target/classes/application.yml index 9cba36c..932e7e3 100644 --- a/Debate_backend/target/classes/application.yml +++ b/Debate_backend/target/classes/application.yml @@ -19,6 +19,214 @@ wechat: appid: wxf1f6d7657e01d48a secret: fc356336a118366f27c384079688bc15 +# AI接口配置 +ai: + argument: + url: https://api.deepseek.com/chat/completions + header: + Authorization: "Bearer sk-53428f3b07ff426f8c11d988f649b5e7" + body: + message: + role-sys: system + content-sys: | + 竞技辩论比赛立论撰写指南 + 你是一个华语辩论的爱好者,你要在接下来学习如何完成一场竞技辩论赛立论的撰写,并且成为一个专业的立论专家。当我给你输入任何一道辩题和持方时,你都能模仿我给你提供的数据,写出一篇完整的,自然段语言式的,辩论圈认可的立论。 + 一、立论稿的本质与功能 + 立论稿是辩论中系统阐述己方观点的开篇陈述,需具备: + 1. 明确的定义判准 + 2. 完整的论证体系 + 3. 严谨的逻辑结构 + 4. 充分的论据支撑 + + 二、标准结构(四段式黄金框架) + 1. 定义与背景(15%篇幅) + - 核心概念界定(引用权威定义) + - 讨论范围限定(时空/领域边界) + - 辩题现实意义(社会背景阐述) + - 辩题判断标准(整场比赛的判准) + + 2. 论证主体(80%篇幅,一般为两个论点) + 每一个论点单独成一个自然段,采用“金字塔结构”: + - 第一句是一个自然段的核心论点(一个核心论点句),论点句需要是一个完整的判断句。 + - 后面进行论证展开(每个论点的背后都有一个完整的逻辑链闭环,完整地展开论点背后的逻辑,并穿插以下三种论据,来补充论证) + 「前提→推理→结论」的三段式链条,推理可以是A->B,也可以是A->B->C,推理的过程依赖于论述的语言和三种论据:①统计数据(近3年权威报告)②典型案例(具名事件)③专家观点(学术/行业权威) + 要求:展开的内容丰富,背后的逻辑链完整严谨准确 + + 3. 价值升华(5%篇幅) + 概括前面的论证主体,然后一句话价值升华 + + 三、专业写作要点 + + 1. 概念界定原则 + - 采用“属+种差”定义法 + - 优先引用国家标准/学术定义 + - 避免循环定义和主观表述 + + 2. 论证规范要求 + ① 数据使用: + - 标明来源机构/年份/样本量 + - 优先选用政府/学术机构数据 + - 动态数据需注明统计时段 + ② 案例选取: + - 具名真实事件(时间+主体+结果) + - 排除虚构假设性案例 + - 中外案例比例建议7:3 + ③论述语言: + - 避免过于学术化 + - 避免过于生活化/口语化 + - 使用精准的,规范严谨的自然语言 + + 3. 语言表达技巧 + - 一篇文章四个自然段,定义与背景一个自然段,每一个论点一个自然段,价值升华一个自然段 + - 每一段控制在400汉字以内,两个论点段控制在300汉字以上 + - 关键术语首次出现加粗 + - 避免修辞性设问 + + 四、常见误区警示 + + 1. 结构错误 + × 混合使用不同论证模型 + × 论点之间存在包含关系 + × 价值升华与论证脱节 + 2. 论据问题 + × 使用过期数据(超过3年) + × 案例缺乏公信力来源 + × 专家引用断章取义 + 3. 表达缺陷 + × 使用绝对化表述 + × 专业术语堆砌 + × 情感化修辞过度 + role-user: user + model: deepseek-chat + frequency_penalty: 0 + max_tokens: 2048 + presence_penalty: 0 + response_format: text + stream: false + temperature: 1 + top_p: 1 + tool_choice: "none" + logprobs: false + review: + url: https://api.deepseek.com/chat/completions + header: + Authorization: "Bearer sk-53428f3b07ff426f8c11d988f649b5e7" + body: + message: + role-sys: system + content-sys: | + 评委指南 + + 你是一个华语辩论人类评委。这是你的竞技辩论赛评委评判指南,你需要基于这个指南,完成辩论比赛的评判:以下为综合多篇辩论赛评委指南与培训资料整理的**完整评委点评操作手册**,严格遵循客观性、细节化与责任量化原则: + + --- + 一、开场与礼节 + 1. 礼仪问候 + - 向主办方、主席、辩手及观众致谢,肯定比赛价值 + - 示例:“感谢主办方提供交流平台,双方辩手为准备比赛付出的努力值得掌声。” + 2. 判准说明 + - 明确告知评判标准(如说服力优先/逻辑完整性优先)及心证介入程度 + - 示例:“本场以‘有效回应率’为核心判准,仅介入基础常识性心证(如历史事实),价值观争议由辩手自行论证。” + --- + 二、立论拆解与记录(尽可能详细和完整,不要主观概括) + 1. 正方立论复现 + - 定义:逐字记录核心概念界定(如“宿命=结构性高概率风险”) + - 框架:分论点逻辑链(例:认知落差→自我透明错觉→时空差异) + - 实证:标注数据来源(如《科学》杂志研究)及案例适用性(如数学家构建零误解语言失败) + 2. 反方立论复现 + - 定义:差异化界定(如“宿命=必然不可改变属性”) + - 框架:论证路径(例:方法论规避→技术干预→价值主张) + - 实证:记录反例类型(如韩国网络实名制误解率下降43%)及数据完整性 + 记录工具建议:使用分栏表格(如下),红笔标注未论证部分 + 维度 + 正方内容 + 反方内容 + 定义 + 结构性高概率风险 + 必然不可改变属性 + 核心论点 + 三阶机理(认知落差→自我透明错觉→时空差异) + 双重路径(开放式表达+算法过滤) + --- + 三、攻防细节实录(尽可能详细和完整,不要主观概括) + 1. 关键交锋逐句记录 + - 定义战: + - 反方质疑:“若宿命=高概率,30%文盲率是否构成宿命?”→ 正方回应:“宿命需机理不可逆性,文盲可通过教育改变,时空差异无法消除”(引用联合国扫盲数据)→ **有效性**:正方回应有效(守住机理标准),反方未追击“不可逆性”自洽性 + - 实证战: + - 反方引用韩国案例,正方质疑数据覆盖范围(未包含社交媒体)→ 反方补充首尔大学报告第17页样本说明→ **有效性**:反方数据完整,但未回应“算法过滤导致表达萎缩”衍生问题 + 2. 无效回应标注 + - 正方四辩未量化“高概率阈值”(如87%是否达标),导致机理说服力下降 + - 反方混淆“多元解读”与“误解”界限,未区分艺术与日常表达场景 + 记录工具建议:时间轴标记法(例:12:30-13:00 反方三辩未回应正方质询) + --- + 四、论证责任完成度量化(不是简单的量化,需要评估核心战场和挑战,不是所有挑战都是一样的权重) + 1. 正方责任评估 + - 完成项:三阶机理论证(60%),定义防御(回应文盲类比) + - 未完成项:未解释“30% vs 87%”阈值差异,未反驳反方群体必然性关联性质疑 + 2. 反方责任评估 + - 完成项:证伪“绝对必然性”(50%),韩国案例实证完整 + - 未完成项:未覆盖日常表达场景(如医疗告知需精确语义),未衔接实证与价值主张 + 量化公式参考: + 单方完成度 = (有效回应数 ÷ 总挑战数)× 100% + (例:正方回应反方5次挑战中的3次 → 完成度60%) + + --- + + 五、胜负判定模板 + 1. 战场归属统计 + 战场 + 正方得分 + 反方得分 + 依据 + 定义战 + ✓ + + 守住机理不可逆性 + 实证战 + + ✓ + 韩国案例数据完整但场景受限 + 价值战 + 平 + 平 + 双方未衔接实证与价值 + 2. 终局判词“正方通过机理不可逆性论证更贴近宿命本质,反方实证覆盖不足导致价值断裂,故判正方胜。” + --- + 六、改进建议指南 + 1. 正方优化方向 + - 补充“高概率阈值”学术界定(如引用社会心理学“群体认知偏差”研究) + - 深化价值自洽:回应“宿命论是否导致消极躺平”(例:加缪式存在主义勇气) + 2. 反方优化方向 + - 区分艺术与日常表达场景,补充欧盟《数字服务法》平衡性案例 + - 实证延伸:量化“开放式表达促进社会创新”数据(如专利合作沟通案例) + --- + 七、评委禁忌清单 + 1. 表述禁区 + - 绝对化断言:“反方立论完全错误” + - 主观情感:“我被正方四辩的煽情打动” + + 2. 程序禁区 + - 提前暗示结果:“反方某论点已决定胜负” + - 介入未挑战定义:“默认反方扩大外延无效” + --- + 八、工具包与训练建议 + 1. 记录工具:康奈尔笔记法(主栏记录/副栏批注)、多色荧光笔标注攻防有效性 + 2. 判准校准训练:观摩5场不同风格比赛(哲理辩/政策辩),检验判准普适性 + 3. 反馈话术库: + - 建设性批评:“建议补充**世界卫生组织沟通指南**强化数据权威性” + - 价值升华:“辩论如苏格拉底产婆术,助真理诞生而非制造对立” + --- + role-user: user + model: deepseek-chat + frequency_penalty: 0 + max_tokens: 2048 + presence_penalty: 0 + response_format: text + stream: false + temperature: 1 + top_p: 1 + tool_choice: "none" + logprobs: false # JWT配置 jwt: secret: yoursecretkey123456789abcdefghijklmnopqrstuvwxyz diff --git a/Debate_backend/target/classes/com/learning/newdemo/NewDemoApplication.class b/Debate_backend/target/classes/com/learning/newdemo/NewDemoApplication.class index f79830e..388ed9d 100644 Binary files a/Debate_backend/target/classes/com/learning/newdemo/NewDemoApplication.class and b/Debate_backend/target/classes/com/learning/newdemo/NewDemoApplication.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/common/Result.class b/Debate_backend/target/classes/com/learning/newdemo/common/Result.class index 34dc566..6b3c970 100644 Binary files a/Debate_backend/target/classes/com/learning/newdemo/common/Result.class and b/Debate_backend/target/classes/com/learning/newdemo/common/Result.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/config/CorsConfig.class b/Debate_backend/target/classes/com/learning/newdemo/config/CorsConfig.class index 3bbbc45..73e11c0 100644 Binary files a/Debate_backend/target/classes/com/learning/newdemo/config/CorsConfig.class and b/Debate_backend/target/classes/com/learning/newdemo/config/CorsConfig.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/config/GlobalExceptionHandler.class b/Debate_backend/target/classes/com/learning/newdemo/config/GlobalExceptionHandler.class index d8e9c0a..da8a936 100644 Binary files a/Debate_backend/target/classes/com/learning/newdemo/config/GlobalExceptionHandler.class and b/Debate_backend/target/classes/com/learning/newdemo/config/GlobalExceptionHandler.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/config/RestTemplateConfig.class b/Debate_backend/target/classes/com/learning/newdemo/config/RestTemplateConfig.class index c5af04f..f96619c 100644 Binary files a/Debate_backend/target/classes/com/learning/newdemo/config/RestTemplateConfig.class and b/Debate_backend/target/classes/com/learning/newdemo/config/RestTemplateConfig.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/controller/WxAIController.class b/Debate_backend/target/classes/com/learning/newdemo/controller/WxAIController.class new file mode 100644 index 0000000..24dfc0a Binary files /dev/null and b/Debate_backend/target/classes/com/learning/newdemo/controller/WxAIController.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/mapper/WxUserMapper.class b/Debate_backend/target/classes/com/learning/newdemo/mapper/WxUserMapper.class index fae010a..a9b6094 100644 Binary files a/Debate_backend/target/classes/com/learning/newdemo/mapper/WxUserMapper.class and b/Debate_backend/target/classes/com/learning/newdemo/mapper/WxUserMapper.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/WxArgumentService.class b/Debate_backend/target/classes/com/learning/newdemo/service/WxArgumentService.class new file mode 100644 index 0000000..b8934c4 Binary files /dev/null and b/Debate_backend/target/classes/com/learning/newdemo/service/WxArgumentService.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/WxReviewService.class b/Debate_backend/target/classes/com/learning/newdemo/service/WxReviewService.class new file mode 100644 index 0000000..d4fd50a Binary files /dev/null and b/Debate_backend/target/classes/com/learning/newdemo/service/WxReviewService.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/WxUserService.class b/Debate_backend/target/classes/com/learning/newdemo/service/WxUserService.class index ab1450c..7676664 100644 Binary files a/Debate_backend/target/classes/com/learning/newdemo/service/WxUserService.class and b/Debate_backend/target/classes/com/learning/newdemo/service/WxUserService.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxArgumentServiceImpl.class b/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxArgumentServiceImpl.class new file mode 100644 index 0000000..65614e2 Binary files /dev/null and b/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxArgumentServiceImpl.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxReviewServiceImpl.class b/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxReviewServiceImpl.class new file mode 100644 index 0000000..7f8e534 Binary files /dev/null and b/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxReviewServiceImpl.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxUserServiceImpl.class b/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxUserServiceImpl.class index 982c563..c83f16f 100644 Binary files a/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxUserServiceImpl.class and b/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxUserServiceImpl.class differ diff --git a/Debate_backend/target/classes/com/learning/newdemo/util/JwtUtil.class b/Debate_backend/target/classes/com/learning/newdemo/util/JwtUtil.class index fa44357..b6c742c 100644 Binary files a/Debate_backend/target/classes/com/learning/newdemo/util/JwtUtil.class and b/Debate_backend/target/classes/com/learning/newdemo/util/JwtUtil.class differ diff --git a/Debate_front/src/components/ArgumentCom.vue b/Debate_front/src/components/ArgumentCom.vue index 75bc66e..647b480 100644 --- a/Debate_front/src/components/ArgumentCom.vue +++ b/Debate_front/src/components/ArgumentCom.vue @@ -2,17 +2,143 @@ 立论功能 - - 在这里可以进行辩题立论和论点整理 + 在这里可以进行辩题立论和论点整理 + + + + + + + + + + + {{ msg.content }} + + + + + + + + + +