前言
随着科技的不断发展,人工智能(AI)在我们生活中的角色越来越重要。其中自然语言处理(NLP)技术在AI领域中占据着重要地位,而ChatGPT作为一种强大的自然语言处理模型,它正逐渐改变着我们与计算机和智能系统交互的方式。本文将介绍简单如何搭建一个自己的chatGPT
AI模型
作为科大讯飞的老用户了,经常在工作和生活中询问讯飞星火如何解决和实现问题。
近期讯飞星火的API也是免费向新老用户提供,所以我们利用讯飞星火的API开发一个自己的应用来实现AI的能力并进行包装,也是个非常不错的程序员业余变现思路。
我们采用讯飞星火认知大模型开放的api 讯飞星火认知大模型
注册账号登录
注册账号登陆这里就不做演示了,登录后可以看到API免费试用

领取免费tokens
完全免费!0 门槛领取 20 万讯飞星火认知大模型 API Tokens;
通过专属二维码个人用户最高可再申请 400 万 Tokens,企业用户最高可申请 1000 万 Tokens。

进入服务控制台
进入到后台可以看到AppId,密钥和ApiKey,接入文档等内容。

API接入
不同接口地址对应的是不同的模型版本,1.5版本和2.0版本对应都是10万token数,3.0版本200万token数,前期调试阶段建议使用1.5即可

通用鉴权URL生成
html文档中引入CryptoJS:
1 2
| <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.js"><script> <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/hmac-sha256.js"></script>
|
鉴权URL生成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| async function getWebsocketUrl () { return new Promise(async (resolve, reject) => { var apiKey = API_KEY var apiSecret = API_SECRET var url = 'wss://spark-api.xf-yun.com/v1.1/chat' var host = location.host var date = new Date().toGMTString() var algorithm = 'hmac-sha256' var headers = 'host date request-line' var signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v1.1/chat HTTP/1.1` var signatureSha = CryptoJS.HmacSHA256(signatureOrigin, apiSecret); var signature = CryptoJS.enc.Base64.stringify(signatureSha); var authorizationOrigin = `api_key="${apiKey}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"` var authorization = btoa(authorizationOrigin) url = `${url}?authorization=${authorization}&date=${date}&host=${host}` resolve(url) }) }
|
连接WebSocket
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| class TTSRecorder { constructor({ appId = APPID } = {}) { this.appId = appId this.status = 'init' } setStatus (status) { this.onWillStatusChange && this.onWillStatusChange(this.status, status) this.status = status } connectWebSocket () { this.setStatus('ttsing') return getWebsocketUrl().then(url => { let ttsWS if ('WebSocket' in window) { ttsWS = new WebSocket(url) } else if ('MozWebSocket' in window) { ttsWS = new MozWebSocket(url) } else { alert('浏览器不支持WebSocket') return } this.ttsWS = ttsWS ttsWS.onopen = e => { this.webSocketSend() } ttsWS.onmessage = e => { this.result(e.data) } ttsWS.onerror = e => { clearTimeout(this.playTimeout) this.setStatus('error') alert('WebSocket报错,请f12查看详情') console.error(`详情查看:${encodeURI(url.replace('wss:', 'https:'))}`) } ttsWS.onclose = e => { } }) } webSocketSend () { this.ttsWS.send(JSON.stringify(params)) } start () { total_res = ""; this.connectWebSocket() } result (resultData) { let jsonData = JSON.parse(resultData) total_res += jsonData.payload.choices.text[0].content if (jsonData.header.status == 0) { let chatBox = document.createElement('div') let dom = ` <img src="/img/ai.jpg" alt=""> <pre class="chatpdfContent">${total_res}</pre> ` chatBox.innerHTML = dom chatBox.classList.add('chatpdfRow','assistant') chatpdfLine.appendChild(chatBox) } var lastChild = chatpdfLine.lastElementChild; lastChild.children[1].textContent = total_res if (jsonData.header.code !== 0) { alert(`提问失败: ${jsonData.header.code}:${jsonData.header.message}`) console.error(`${jsonData.header.code}:${jsonData.header.message}`) return } if (jsonData.header.code === 0 && jsonData.header.status === 2) { params.payload.message.text.push({ "role": "assistant", "content": total_res }) this.ttsWS.close() this.setStatus("init") } } }
|
发送消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| function requestOnlineConnection () { let chatBox = document.createElement('div') let dom = ` <img src="/img/user.webp" alt=""> <pre class="chatpdfContent">${textarea.value}</pre> ` chatBox.innerHTML = dom chatBox.classList.add('chatpdfRow', 'chatpdfAsk') chatpdfLine.appendChild(chatBox) params.payload.message.text.push({ "role": "user", "content": textarea.value }) bigModel.start() textarea.value = '' textarea.style.height = 'auto'; } send.addEventListener('click', function (event) { requestOnlineConnection() });
|
页面刷新恢复聊天数据
1 2 3 4 5 6 7 8 9 10 11
| let elementAsString = sessionStorage.getItem("chat_message"); if (chatpdfLine.children.length == 1 && elementAsString) { chatpdfLine.innerHTML = JSON.parse(elementAsString).element } window.addEventListener('beforeunload', function(event) { if(chatpdfLine.children.length > 1){ sessionStorage.setItem('chat_message',JSON.stringify({element:chatpdfLine.innerHTML})) } event.preventDefault(); event.returnValue = ''; });
|
效果展现

写在最后
至此,文章就分享完毕了,我是程序员LinXiao,一位前端开发工程师。
文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注
如果你对我有兴趣,欢迎添加我的个人微信Lxlucky2022
Github:https://github.com/KevinLin8