本例是个业务 Demo,只实现业务能力,不做代码质量哀求,请大佬放过细节。
痛难点AI 天生论文,准确说是 AGI 天生论文,实在真正的痛点只有两个:
1、大略的指令工程,用来办理如何与 AI 沟通并获取想要的结果;
2、足够长度的 AI 对话高下文。
其他的都是我们所说的:搬砖的活。
详细的东西实在代码里面都有,虽说比较糙,但是功能是有的,且是可用的(你也不能哀求我把“商业机密”透露不是么,哈哈。
技能解释上面这个是大致的一个技能架构,很大略是吧。
这里选择 ChatGLM 的缘故原由有几方面:
1、安全,有算法备案;
2、便宜……
3、高下文足够普通论文利用;
4、对接大略。
中间的做事器,我供应了一个免费的 GLM 对话云函数 API web 接口,请各位温顺调用,不然关了,大家都没得玩。
上面的做事端接口,请自行查阅对应大模型(这里是 GLM)的官方调用文档,由于涉及到付费 key,以是无法公开。
而上面的前端页面包含核心逻辑,大略到不须要 200 行的一个 index.html 文件就够了,下面会完全放出:
<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>AI 论文</title> <style> form { display: flex; flex-direction: column; } </style></head><body> <h1>提交表单</h1> <form action=""> <label for="">论文题目</label> <input id="title" type="text" placeholder="论文题目"> <label for="">论文择要</label> <textarea name="" id="abstract" cols="30" rows="10" placeholder="论文择要"></textarea> <label for="">关键词</label> <input id="keywords" type="text" placeholder="关键词"> <button type="submit">提交</button> </form> <pre style="white-space: pre-wrap;"></pre> <script> const baseData = { title: '土工格拉斯比与土体性子关系研究', abstract: '本文以士工格拉斯比与土体性子关系为研究工具,采取实验方法和数值仿照手段,磋商了土工格拉斯比与土体性子之间的关系。首先,通过一系列的实验,网络了不同土体类型下的土工格拉斯比数据,并剖析了其与土体性子之间的干系性。其次,利用数值仿照方法,构建了士工格拉斯比与土体性子关系的数学模型,并进一步剖析了模型中的参数对士工格拉斯比与土体性子关系的影响。末了,根据实验结果和数值仿照结果,提出了土工格拉斯比在土体性子评价中的主要性和实用性。本文的研究结果为土工格拉斯比在土体性子评价中的运用供应了理论依据和实践履历。', keywords: '土工格拉斯比 土体性子 实验 数值仿照 干系性 运用', } const dom = { form: document.querySelector('form'), title: document.getElementById('title'), abstract: document.getElementById('abstract'), keywords: document.getElementById('keywords'), } dom.title.value = baseData.title dom.abstract.value = baseData.abstract dom.keywords.value = baseData.keywords // 正经逻辑 const formData = { title: dom.title.value, abstract: dom.abstract.value, keywords: dom.keywords.value, } const messages = [] // {role, content} const result = [] // string[] dom.form.addEventListener('submit', onSubmit) function onSubmit(e) { e.preventDefault() generateOutline() .then(generateContext) } function renderPre() { document.querySelector('pre').textContent = result.reduce((p, c) => p += c, '') document.documentElement.scrollTop = document.documentElement.scrollHeight } function generateOutline() { messages.push({ "role": "user", // user, assistant, user, assistant ... "content": `请帮我写一篇专业的学术论文目录,下面是干系的信息:【论文题目:${formData.title}论文择要:${formData.abstract}论文关键词:${formData.keywords}】请你基于上述开题报告干系信息,给我一段论文的大纲。哀求:1、扁平化,一级标题利用一、二、三,二级标题利用1.1、1.2、1.3这种;2、第一章为“一 绪论,1.1 研究意义和目的,1.2 国内外研究现状,1.3文本研究内容”,这些作为第一章是固定的;3、第二章写出你要研究干系问题涉及到的基本理论;4、第三章提出问题,并对其进行剖析;5、第四章提出办理对策;6、第五章给出建议;7、第七章固定是《参考文献》;9、第八章固定是《结语》;10、第九章是末了一章,固定是《致谢》。`// 指令工程 }) return completion().then(async data => { console.log(data) const content = getContent(data) messages.push({ role: 'assistant', content }) result.push(content) renderPre() const outline = GLM2JSONArray(content) return outline }) } / 传入glm返回值 / function getContent(data) { return data.data.choices[0].message.content.trim() } async function generateContext(outline) { // {title: string, content?: string, subs: {title: string, content: string}[]}[] const remind = `1、论述一定要有非常充分的论据;2、要有多角度、有层次、逻辑严密、科学、严谨;3、整体论述要2000字以上。` for(const item of outline) { let content = `当前章节名:${item.title || '无'}请天生当前章节内容。严格按照如下哀求:${remind}` // 如果有子目录 if(item.subs && item.subs.length) { for(const subItem of item.subs) { content = `当前章节名:${item.title || '无'}当前子章节名:${subItem.title}请天生当前子章节内容。严格按照如下哀求:${remind}` content = await generateContent(content) subItem.content = content } } else { content = await generateContent(content) item.content = content } } } async function generateContent(content) { messages.push({ role: 'user', content }) const data = await completion() content = getContent(data) messages.push({ role: 'assistant', content }) result.push(content) renderPre() } function completion() { // 天生内容 return fetch('https://1251835910-gyna32po0i-bj.scf.tencentcs.com/api/sync', { method: 'POST', body: JSON.stringify({ messages }), headers: { 'Content-Type': 'application/json' } }) .then(res => res.json()) .catch(console.error) } function GLM2JSONArray(content) { console.log('转JSON的原始字符串') let result = [] let temp_item let ss = content.split('\n') ss.forEach(s => { if(!s) return s = s.trim() s = s.replace(/^["']\s/, '') // 奇怪的引号删除 console.log(s) let is_sub = s.match(/^[1|2|3|4|5|6|7|8|9|0]/) if(is_sub) { temp_item.subs.push({ title: s }) } else { // 大目录得是汉字开头 let is_cn = s.match(/^第[一|二|三|四|五|六|七|八|九|十]/) console.log({ is_cn: !!is_cn }) temp_item = { title: s, } if(is_cn) { temp_item.subs = [] } else { console.warn('莫名奇妙的标题,须要排查') } result.push(temp_item) } }) console.log(result) console.log('格式化后的JSON') return result } </script></body></html>
页面样式
就上面这个东西,就可以实现一篇极简的 AI 天生论文了。
代码解释大略的阐明下关键代码:
1、messages 是高下文保存工具,用来供应给大模型对话的高下文,即天生下一章节内容的高下文;
2、result 是用来渲染结果的,参考用;
3、指令那一块可以多看看,随便改;
4、代码很随意,够用就好,如有哀求,请自行完善。
其他想了想实在很多,落笔写创造没什么讲的,就 200 行代码,基本都在了,说啥?
有问题评论区谈论呗,嘿嘿。
PS:这个论文工具是真的在盈利的项目哈,还是我个人的哦。(肯定不是长这样和这个质量)