??陔p語網(wǎng)站建設(shè)楚雄seo
本文只包含最基礎(chǔ)的請求后端大佬給得對話接口,大部分模型的傳參是差不多的,核心還是如何處理 fetch 獲取的流數(shù)據(jù)
import { defineStore } from 'pinia';
import { ElMessage } from 'element-plus';type Role = 'system' | 'user' | 'assistant';
export interface Message {role: Role;content: string;
}
interface ChatStore {model: 'Gnosis' | 'chatglm2-6b' | 'cc-13b-chat';chatApi: string;messages: Message[];done: boolean | null;
}
const DEFAULT_PROMPT = `你應(yīng)該根據(jù)用戶回答生成答案。答案必須盡可能簡明扼要。字?jǐn)?shù)控制在512個(gè)字符以內(nèi)`;export const useChatStore = defineStore({id: 'chatStore',state: (): ChatStore => {return {model: 'cc-13b-chat',chatApi: 'chat_api/chat/knowledge_base_chat',messages: [{role: 'system',content: DEFAULT_PROMPT,},],done: null,};},actions: {async fetchChat(query: string) {this.messages.push({role: 'user',content: query,});let response: any = null;try {response = await fetch(this.chatApi, {headers: {'Content-Type': 'application/json',},method: 'POST',body: JSON.stringify({query: query,history: this.messages,model_name: this.model,stream: true,knowledge_base_name: 'lb_test',top_k: 1,score_threshold: 1,temperature: 0.7,max_tokens: 4096,prompt_name: 'default',}),});} catch (error) {console.log(error);ElMessage.error('請求失敗');return;}const data = response.body;this.messages.push({role: 'assistant',content: '',});// 處理流式數(shù)據(jù)if (data) {const reader = data.getReader();const decoder = new TextDecoder('utf-8');this.done = false;while (!this.done) {const { value, done: readerDone } = await reader.read();// value值// {"answer": "幫助解決"}if (value) {const char = decoder.decode(value);console.log(char);// if (char === '\n') {// this.messages[this.messages.length - 1].content += '\n';// continue;// }if (char) {const res = JSON.parse(char);this.messages[this.messages.length - 1].content += res.answer ?? '';}}if (!this.done) {this.done = readerDone;}}}// 對話結(jié)束this.done = null;},},// persist: {// key: 'store',// storage: window.localStorage,// },
});