AI论文生成系统JAVA代码简单实现

这篇具有很好参考价值的文章主要介绍了AI论文生成系统JAVA代码简单实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       大学开学了,博主的堂弟现在正值大四,论文是分毫未动,想要用国内网上的AI辅助写作拟一篇文章进行完成,刚好聊天了解此事,我有点感兴趣,去百度了一下,各个AI生成网站价格不菲,临时起意想做一个AI代码生成程序,当然这种生成的论文问题还是特别多,无法和成熟的软件相比不过胜在成本低,可塑性强。

前置条件

        首先我们需要对接现有大模型的接口,国内的各个大模型都有自己的商场,GPT-4在理解和生成自然语言方面比国内的模型在具有更强的能力,因此作者嫌麻烦花了10米去搞了个国内的中转接口去调用GPT-4的api,否则你就需要魔法上网,去弄openAI的接口了。

代码实现

        首先简单讲解一下AI对话的原理,首先要了解tokens,引用一句AI的解释:

        在AI和机器学习的上下文中,"tokens" 通常是指文本数据被预处理后得到的基本单位。这些单位可以是单词、子词(subwords)、字符或更复杂的结构,取决于你选择的分词方法。Tokenization是自然语言处理中的一个重要步骤,它有助于将文本转换为机器学习模型可以理解和处理的形式。

        简单来说就是你发送的消息和AI返回给你的内容都与tokens有关,字符越多,tokens越大,一般来说400个汉字,相当于1000tokens

        而对话简单来讲就是你请求的时候会携带上文AI的回答或者你的塑造的上下文进行调用,如果不加限制就很容易消耗特别多的tokens,有些网站都是将次数限制到10条可能就是这个原因。

        论文这个东西文本实在太多,使用我直接不考虑带上文,这里是我的创建对话的代码实现:

 private ChatResponseWrapper createChat(String message, String model) {
        try {
            if (!chatConfig.isEnable()) {
                log.warn("createChat fail,ai is unable!");
                throw new AIExecuteException("check ai is enable!");
            }
            List<ChatMessagesDto> messages = new ArrayList<>();
            ChatMessagesDto systemMessage = new ChatMessagesDto(role, message);
            messages.add(systemMessage);
            //model 代表gpt当前的模型,我开发时使用的是3.5,role代表当前的角色
            ChatRequest chatCompletionRequest = ChatRequest.builder().model(model).messages(messages).user(role).maxTokens(4096).temperature(BigDecimal.ONE).build();

            ObjectMapper objectMapper = new ObjectMapper();
            //对接大模型的url
            HttpRequest request = HttpUtil.createPost(chatConfig.getUrl());
            request.setConnectionTimeout(TIMEOUT);
            request.body(objectMapper.writeValueAsBytes(chatCompletionRequest));
            // 设置请求头
            request.header("Content-Type", "application/json");
            //携带token
            request.header("Authorization", "Bearer " + chatConfig.getAccessKey());
            String body;
            try (HttpResponse response = request.execute()) {
                body = response.body();
            }
            if (log.isDebugEnabled()) {
                log.debug("get Ai response body:{}", body);
            }
            ChatResponseWrapper wrapper = new ChatResponseWrapper();
            wrapper.setResponse(objectMapper.readValue(body, ChatResponse.class));
            wrapper.setQuestion(message);
            return wrapper;
        } catch (JsonProcessingException e) {
            log.error("Json Parse error,message:{}", message, e);
            throw new AIExecuteException(e.getMessage());
        } catch (Exception e) {
            log.error("createChat error,message:{}", message, e);
            throw new AIExecuteException(e.getMessage());
        }
    }

        接下来创建生成大纲的接口,入参是标题,也就是前端传入的值

public List<ThesisOutline> genThesisOutline(String message) {
        try {
            String template = "以《{}》为题目,给我一篇计算类论文的大纲,使用中文回答,一级目录使用编号1,二级目录使用编号1.1,以此类推";
            //对ai的问句
            String askQuestion = StringUtil.format(template, message);
            ChatResponseWrapper wrapper = aiClient.createChat35(askQuestion);
            ChatResponse response = wrapper.getResponse();
            if (response == null) {
                throw new AIExecuteException();
            }
            List<ThesisOutline> thesisOutlines = new ArrayList<>();
            for (ChatChoice choice : response.getChoices()) {
                ChatMessagesDto choiceMessage = choice.getMessage();
                String content = choiceMessage.getContent();
                if (StringUtil.isEmpty(content)) {
                    continue;
                }
                //过滤为空的行和不为数字的行
                List<String> outlines = StringUtil.split(content, "\n").stream().filter(StringUtil::isNotBlank).filter(StringUtil::isStartsWithDigit).map(String::trim).collect(Collectors.toList());
                for (String outlineContent : outlines) {
                    ThesisOutline outline = new ThesisOutline();
                    outline.setContent(outlineContent);
                    thesisOutlines.add(outline);
                }
            }
            return thesisOutlines;
        } catch (Exception e) {
            log.error("genThesisOutline error", e);
            return Collections.emptyList();
        }
    }

/**
 * 论文标题实体
 * @author zwh
 */
@Data
public class ThesisOutline {

    /**
     * 层级
     */
    private Integer level;

    /**
     * 标题内容
     */
    private String content;
}

这个接口将生成的数据返回给前端

java 集成ai大模型 实现文档分析,人工智能,java,后端,毕业设计,AI写作

随手写的前端,样式什么的也懒的调了,能用就行,代码如下:

<template>
  <div class="app-container home">
    <el-card style="height: 95vh">
      <el-button @click="genThesisOutline" :disabled="showText">生成论文大纲</el-button>
      <el-button @click="toText" v-if="!showText">变更为文本</el-button>
      <el-button @click="toList" v-if="showText">保存并展示为列表</el-button>
      <el-button @click="downloadByOutline" icon="el-icon-download" v-if="!showText">生成并下载论文</el-button>


      <div style="margin-top: 20px">
        <div v-show="!showText">
          <el-row style="margin-bottom: 10px">
            <el-col :span="4">标题</el-col>
            <el-col :span="20">{{ thesis.title }}</el-col>
          </el-row>
          <el-table ref="table" :data="outlineData" max-height="1100px">
            <el-table-column type="index" width="100"/>
            <el-table-column label="大纲内容" prop="content"/>
          </el-table>
        </div>

        <el-form v-show="showText">
          <el-form-item label="标题">
            <el-input v-model="thesis.title"/>
          </el-form-item>
          <el-form-item label="大纲">
            <el-input type="textarea" v-model="outlineText" rows="45"/>
          </el-form-item>
        </el-form>
      </div>

    </el-card>


    <el-dialog title="生成论文大纲" :visible.sync="outline.visible">
      <el-form>
        <el-form-item label="论文题目">
          <el-input v-model="outline.content"/>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="outline.visible = false">取 消</el-button>
        <el-button type="primary" @click="genOutline">确认生成大纲</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import {downloadWord, genOutline} from "@/api";

export default {
  name: "Index",
  data() {
    return {
      outline: {
        visible: false,
        content: null,
      },
      outlineData: [],
      thesis: {
        title: null,
        messages: []
      },
      outlineText: null,
      showText: false,
    };
  },
  methods: {
    genThesisOutline() {
      this.outline.visible = true;
    },
    genOutline() {
      genOutline(this.outline.content).then(resp => {
        this.outlineData = resp.data
        this.thesis.title = this.outline.content
        this.outline.content = null
        this.outline.visible = false
      })
    },
    toText() {
      const fieldValues = this.outlineData.map(obj => obj.content);
      this.outlineText = fieldValues.join('\n');
      this.showText = true;
    },
    toList() {
      // 使用 split 方法按换行符分割字符串
      const lines = this.outlineText.split('\n');
      // 过滤掉空字符串,并将每个字符串转化回对象
      // 将每行转化为一个对象,该对象具有指定的字段名和内容
      this.outlineData = lines
        .filter(line => line.trim() !== '')
        .map(line => ({content: line}));
      this.showText = false;
    },
    downloadByOutline() {
      this.thesis.messages = this.outlineData.map(obj => obj.content);
      downloadWord(this.thesis).then(resp => {
        // 创建一个blob对象URL
        const url = window.URL.createObjectURL(new Blob([resp]));
        // 创建一个下载链接元素
        const link = document.createElement('a');
        link.href = url;
        link.setAttribute('download', this.thesis.title+'.docx'); // 设置下载文件名
        // 触发下载
        document.body.appendChild(link);
        link.click();
        // 清理
        window.URL.revokeObjectURL(url);
      })
    }
  },
};
</script>

正文生成,因为是要对大纲的内容进行循环的请求,使用需要异步请求chatgpt,因为每一个论点请求花费的时间都十分之长,计算了一下一个论点大约30s左右,所以我们这里需要异步去请求论文返回的结果,我这里是使用CompletableFuture去异步请求,方法通过异步方式与AI交互,生成论文文本,并将结果导出为Word文档供用户下载。

@Override
    public void genThesisText(List<String> messages, String title, HttpServletResponse resp) {
        try {
            String template = "请继续以{}为题生成关于:{}的内容,内容需要在500字以上";
            List<CompletableFuture<ThesisTextModel>> futures = new ArrayList<>(messages.size());
            // 每个标题异步创建会话
            for (String message : messages) {
                String question = StringUtil.format(template, title, message);
                CompletableFuture<ThesisTextModel> future = CompletableFuture.supplyAsync(() -> ThesisTextModel.builder().wrapper(aiClient.createChat35(question)).message(message).build(), executor).exceptionally(e -> {
                    log.error("createChat sync execute error", e);
                    return null;
                });
                futures.add(future);
            }

            // 获取所有消息内容 (key: 问题, value: 回答)
            Map<String, List<String>> allContent = new LinkedHashMap<>();
            for (CompletableFuture<ThesisTextModel> future : futures) {
                ThesisTextModel model = future.get();
                ChatResponse response = model.getWrapper().getResponse();
                List<ChatChoice> choices = response.getChoices();
                String outline = model.getMessage();
                ArrayList<String> perContent = new ArrayList<>();
                for (ChatChoice choice : choices) {
                    ChatMessagesDto choiceMessage = choice.getMessage();
                    // 获取某个标题的回答内容
                    String content = choiceMessage.getContent().replaceAll("\n+", "\n");
                    if (StringUtil.isEmpty(content)) {
                        continue;
                    }
                    perContent.add(content);
                }
                allContent.put(outline, perContent);
            }
            // 生成 word 文档
            ThesisBuildHelper.exportWordDocument(resp, allContent);
        } catch (Exception e) {
            log.error("genThesisText error", e);
        }
    }

调用ThesisBuildHelper设置好相应的格式,这里贴上我大学时使用的论文格式(ps.还是从吃灰的老电脑里翻到的)

java 集成ai大模型 实现文档分析,人工智能,java,后端,毕业设计,AI写作

总结

经过两天的努力,到现在程序已经能够生成结构清晰、内容丰富的论文。同时,通过导出为Word文档的形式,使得我能够方便地查看和编辑生成的论文。

这样生成的论文成本也特别的低,我开发中使用的是gpt3.5,大概2w字的论文花费就2毛左右,可想而知百度到的论文生成网站里面利润之高,其实我还想了将gpt3.5生成的文章交给gpt4润色,加入参考文献,不过嫌麻烦,也没有好的思路,就懒得做了,说到底也是心血来潮。

最后,附以一张我毕业的论题生成的论文,27页字数23184,虽然不是标准的论文,但是再也不需要去冥思苦想论文该咋写了。

java 集成ai大模型 实现文档分析,人工智能,java,后端,毕业设计,AI写作文章来源地址https://www.toymoban.com/news/detail-844816.html

到了这里,关于AI论文生成系统JAVA代码简单实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Java-代码生成器的实现

    Java-代码生成器的实现

    最近看了一个开源的项目, jfinal-layui ,然后这个项目里面有一个 代码生成器 的功能 之前虽然有用过代码生成器,但是从来没有看过相关的源码,所以就研究了一下,个人感觉这个项目的代码生成器还是蛮好的,能够根据指定的数据库和表生成前后端的代码,不过这个项目

    2024年02月02日
    浏览(44)
  • 图书管理系统(Java简单版)(完整代码+详解)

    图书管理系统(Java简单版)(完整代码+详解)

    目录 详解:  BookList类: InOperation接口  User类(父类) 和 Main类(这俩要一起看) 完整代码  book包  Book类  BookList类 operation包   AddBook类 BorrowBook类 DeleteBook类 FindBook类 PrintBook类 ReturnBook类 Exit类 InOperation接口 user包  Domestic类 Administrator类 User类  Main类  按照上图逻辑来写

    2024年02月08日
    浏览(13)
  • ASP.NET基于cs的电子邮件简单收发系统设计与实现(源代码+论文)

    电子邮件作为互联网中交换信息广泛的通信工具之一,如今都已被广大用户接受。 早期的电子邮件只是从一个计算机终端向另外一个计算机终端传送文本信息,而现在的电子邮件不仅可以发送文本信息,还可以传送声音、图片、文档等多种信息。很多邮件邮件客户端软件不断

    2024年02月08日
    浏览(9)
  • JAVA+SQL离散数学题库管理系统(源代码+论文+外文翻译)

    题库、试卷建设是教学活动的重要组成部分,传统手工编制的试卷经常出现内容雷同、知识点不合理以及笔误、印刷错误等情况。为了实现离散数学题库管理的信息化而开发了离散数学题库管理系统。 该系统采用C/S 模式,前台采用JAVA(JBuilder2006),后台采用SQLServer2000数据库

    2024年02月09日
    浏览(11)
  • Java生成微信小程序二维码,5种实现方式,一个比一个简单

    Java生成微信小程序二维码,5种实现方式,一个比一个简单

    先介绍一下 项目场景 ,主要是通过微信小程序二维码 裂变分享 ,每个账号有专属邀请二维码,分享出去,有新人扫码入驻,就可以得到现金奖励或红包奖励。当然,产品设计会更丰富,不止有裂变模式,还有渠道推广模式,还有各种奖励规则,但核心实现都是生成二维码。

    2024年02月03日
    浏览(47)
  • 经纬度坐标为中心点生成米距离长度半径的圆形面,含java js源码+在线绘制,代码简单零依赖

    经纬度坐标为中心点生成米距离长度半径的圆形面,含java js源码+在线绘制,代码简单零依赖

    目录 java版源码 js版源码 在线绘制预览效果 关于计算的精确度 前些时间在更新我的坐标边界查询工具的时候,需要用到经纬度坐标点的距离计算,和以坐标点为中心生成一个指定距离为半径的圆,搜了一下没有找到现成简单又合适的代码,于是把自己压箱底的代码翻出来了

    2024年02月08日
    浏览(47)
  • java毕业设计——基于Java+Spring Boot+MySQL的论文选题系统设计与实现(毕业论文+程序源码)——论文选题系统

    java毕业设计——基于Java+Spring Boot+MySQL的论文选题系统设计与实现(毕业论文+程序源码)——论文选题系统

    大家好,今天给大家介绍基于Java+Spring Boot+MySQL的论文选题系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦 文章目录: 伴随着我国高

    2024年01月21日
    浏览(13)
  • JAVA+access综合测评系统毕业设计(源代码+论文+开题报告+任务书)

    大学期间,综合测评计算是每学期必不可少的工作。人工计算综合测评是一个很繁杂的过程:每个学生先计算自己的综合测评成绩,制成草表,上交给班委;然后班委核对并将成绩录入制成电子文档上交给院系相关部门。在这个过程中,学生常常感到厌烦,因而草表的准确率

    2024年02月09日
    浏览(13)
  • JAVA 3D的网络三维技术的设计与实现(源代码+论文+说明)

    互联网的出现及飞速发展使IT业的各个领域发生了深刻的变化,它必然引发一些新技术的出现。3D图形技术并不是一个新话题,在图形工作站以至于PC机上早已日臻成熟,并已应用到各个领域。然而互联网的出现,却使3D图形技术发生了和正在发生着微妙而深刻的变化。Web3D协会

    2024年02月10日
    浏览(8)
  • java代码实现自动生成数据库表er图

    最近有同事看到字节跳动产品设计文档里有数据库表er图。就想问问又没有现成的工具也给直接生成一个er图,经查找验证发现并没有。因为现在表关系都是用的逻辑外键而非物理外键约束的,所以像navicat等工具就算生成了也没有描述关系的连接线。那么为了满足需求,这边

    2024年02月19日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包