Commit f6a8833c authored by 周成波's avatar 周成波

按需求对接llm模型,人工匹配角色关键词

parent 76fbfb23
...@@ -4,11 +4,11 @@ ...@@ -4,11 +4,11 @@
import request from '@/api/request' import request from '@/api/request'
export default { export default {
submitGpt(prompt: string): Promise<string> { submitGpt(prompt: string, llm: string = "gpt"): Promise<string> {
if (!prompt) { if (!prompt) {
return Promise.reject("输入不能为空"); return Promise.reject("输入不能为空");
} }
const post_data = { source_text: prompt, llm: 'tyqw' } const post_data = { source_text: prompt, llm: llm }
return request.post('/text2video/text2gpt', post_data) return request.post('/text2video/text2gpt', post_data)
.then((res: any) => { .then((res: any) => {
// console.log(res); // console.log(res);
...@@ -21,7 +21,7 @@ export default { ...@@ -21,7 +21,7 @@ export default {
}) })
.catch((err: any) => { .catch((err: any) => {
console.log(err); console.log(err);
return Promise.reject("chatgpt通讯失败"); return Promise.reject("与LLM通讯失败");
}); });
}, },
......
...@@ -27,6 +27,16 @@ const form = reactive({ ...@@ -27,6 +27,16 @@ const form = reactive({
const sd_prompt_prefix = default_data.sd_prompt_prefix; const sd_prompt_prefix = default_data.sd_prompt_prefix;
const sd_negative_prompt_prefix = default_data.sd_negative_prompt_prefix; const sd_negative_prompt_prefix = default_data.sd_negative_prompt_prefix;
const wenan_llm = "langchain"
const wenan_llm_name = "baichuan2-7b"
const role_llm = "langchain"
const role_llm_name = "baichuan2-7b"
const tuili_llm = "langchain"
const tuili_llm_name = "baichuan2-7b"
const fanyi_llm = "langchain"
const fanyi_llm_name = "baichuan2-7b"
onMounted(() => { onMounted(() => {
// 初始化示例数据 // 初始化示例数据
onChangeScreen(form.screen); onChangeScreen(form.screen);
...@@ -34,7 +44,7 @@ onMounted(() => { ...@@ -34,7 +44,7 @@ onMounted(() => {
const onSubmitGpt = () => { const onSubmitGpt = () => {
text2videoService text2videoService
.submitGpt(form.chatgpt_prompt) .submitGpt(form.chatgpt_prompt, wenan_llm)
.then((result: string) => { .then((result: string) => {
console.log(form.chatgpt_prompt); console.log(form.chatgpt_prompt);
console.log(result); console.log(result);
...@@ -68,11 +78,17 @@ const onAdaptRoles = async () => { ...@@ -68,11 +78,17 @@ const onAdaptRoles = async () => {
要求: 要求:
角色和角色关键词要对应。 角色和角色关键词要对应。
严格以如下格式返回:[{"角色":"","角色关键词":""}]`; 严格以如下格式返回:[{"角色":"","角色关键词":""}]`;
const keywords = await text2videoService.submitGpt(form.chatgpt_answer + "\n" + adapt_restrict); const keywords = await text2videoService.submitGpt(form.chatgpt_answer + "\n" + adapt_restrict, role_llm);
console.log(keywords) console.log(keywords)
const keywords_obj = utils.formatJsonObj(keywords.replace(/```json/g, '').replace(/```/g, '')) const keywords_obj = utils.formatJsonObj(keywords.replace(/```json/g, '').replace(/```/g, ''))
console.log(keywords_obj) console.log(keywords_obj)
form.chatgpt_answer_roles = [] form.chatgpt_answer_roles = []
if ('error' in keywords_obj) {
ElMessage({
message: "未解析到角色",
type: "error",
});
} else {
for (let item of keywords_obj) { for (let item of keywords_obj) {
let newObjItem = { let newObjItem = {
"角色": JSON.stringify(item["角色"]).replace(/"/g, ''), "角色": JSON.stringify(item["角色"]).replace(/"/g, ''),
...@@ -81,6 +97,7 @@ const onAdaptRoles = async () => { ...@@ -81,6 +97,7 @@ const onAdaptRoles = async () => {
form.chatgpt_answer_roles.push(newObjItem); form.chatgpt_answer_roles.push(newObjItem);
} }
console.log(form.chatgpt_answer_roles) console.log(form.chatgpt_answer_roles)
}
} catch (error) { } catch (error) {
ElMessage({ ElMessage({
message: String(error), message: String(error),
...@@ -127,7 +144,7 @@ const onAdapt = async () => { ...@@ -127,7 +144,7 @@ const onAdapt = async () => {
async function processScenes() { async function processScenes() {
for (const item of form.adapt_result_json) { for (const item of form.adapt_result_json) {
await onAdaptOne(item); await onAdaptOne(item);
await delay(1000); await delay(100);
await onDrawOne(item); await onDrawOne(item);
} }
} }
...@@ -164,16 +181,21 @@ const onAdaptOne = async (item: any) => { ...@@ -164,16 +181,21 @@ const onAdaptOne = async (item: any) => {
指令: 指令:
请理解这个故事,针对其中的这个场景:“${item.场景描述}”,给出这个场景的: 请理解这个故事,针对其中的这个场景:“${item.场景描述}”,给出这个场景的:
场景关键词(年代,空间,时间段,地理环境,天气,物品,人物,镜头角度)、 场景关键词(年代,空间,时间段,地理环境,天气,物品,人物,镜头角度)、
角色(从所有角色中选择本场景的角色)、 角色(从所有角色中选择本场景的角色)。
角色关键词(从所有角色中选择本场景的角色关键字,原样拷贝)。
要求: 要求:
角色和角色关键词要对应。 角色和角色关键词要对应。
严格以如下格式返回:[{"场景关键词":"(多个词以逗号分隔)","角色":"(角色以逗号分隔)","角色关键词":"(分别给予对应角色的关键词,多个词以逗号分隔)"}] 严格以如下格式返回:[{"场景关键词":"(多个词以逗号分隔)","角色":"(角色以逗号分隔)"}]
除了按格式返回的内容之外,不要添加其他的任何说明。`; 除了按格式返回的内容之外,不要添加其他的任何说明。`;
const keywords = await text2videoService.submitGpt("故事:\n" + form.chatgpt_answer + "\n所有角色:\n"+ JSON.stringify(form.chatgpt_answer_roles)+"\n" + adapt_restrict); const keywords = await text2videoService.submitGpt("故事:\n" + form.chatgpt_answer + "\n所有角色:\n"+ JSON.stringify(form.chatgpt_answer_roles)+"\n" + adapt_restrict, tuili_llm);
// console.log(keywords) // console.log(keywords)
const keywords_obj = utils.formatJsonObj(keywords.replace(/```json/g, '').replace(/```/g, '')) const keywords_obj = utils.formatJsonObj(keywords.replace(/```json/g, '').replace(/```/g, ''))
// console.log(keywords_obj) // console.log(keywords_obj)
if ('error' in keywords_obj) {
ElMessage({
message: `分镜 ${item.编号} 推理关键词失败,请重试`,
type: "error",
});
} else {
item.场景关键词 = JSON.stringify(keywords_obj[0].场景关键词).replace(/"/g, ''); item.场景关键词 = JSON.stringify(keywords_obj[0].场景关键词).replace(/"/g, '');
if (form.chatgpt_answer_roles.length === 0) { if (form.chatgpt_answer_roles.length === 0) {
// 总角色为空 // 总角色为空
...@@ -181,8 +203,22 @@ const onAdaptOne = async (item: any) => { ...@@ -181,8 +203,22 @@ const onAdaptOne = async (item: any) => {
item.角色关键词 = ''; item.角色关键词 = '';
} else { } else {
// 总角色不为空 // 总角色不为空
item.角色 = JSON.stringify(keywords_obj[0].角色).replace(/"/g, ''); // item.角色 = JSON.stringify(keywords_obj[0].角色).replace(/"/g, '');
item.角色关键词 = JSON.stringify(keywords_obj[0].角色关键词).replace(/"/g, ''); // item.角色关键词 = JSON.stringify(keywords_obj[0].角色关键词).replace(/"/g, '');
const item_roles = JSON.stringify(keywords_obj[0].角色).replace(/"/g, '');
item.角色 = item_roles;
let role_kws = ""
const item_roles_arr = item_roles.split(/[,,]/);
item_roles_arr.forEach( one_item_role => {
// 人工指定角色关键词,包含则取
form.chatgpt_answer_roles.forEach(i => {
if (i["角色"].includes(one_item_role.trim()) || one_item_role.includes(i["角色"].trim())) {
role_kws = `${role_kws}${i["角色"]}${i["角色关键词"]}】`
}
})
})
item.角色关键词 = role_kws;
}
} }
} catch (error) { } catch (error) {
ElMessage({ ElMessage({
...@@ -214,7 +250,7 @@ const onDrawOne = async (item: any) => { ...@@ -214,7 +250,7 @@ const onDrawOne = async (item: any) => {
const sd_describe = await text2videoService.submitGpt( const sd_describe = await text2videoService.submitGpt(
`${temp_prompt} `${temp_prompt}
指令: 指令:
请理解以上内容,并返回一段英文的描述。` 请理解以上内容,并返回一段英文的描述。`, fanyi_llm
); );
item.画面描述词 = sd_describe; item.画面描述词 = sd_describe;
const sd_prompt = item.画面描述词 + "," + sd_prompt_prefix; const sd_prompt = item.画面描述词 + "," + sd_prompt_prefix;
...@@ -380,14 +416,14 @@ const handleExceed: UploadProps['onExceed'] = (files) => { ...@@ -380,14 +416,14 @@ const handleExceed: UploadProps['onExceed'] = (files) => {
<el-input v-model="form.chatgpt_prompt" :autosize="true" type="textarea" /> <el-input v-model="form.chatgpt_prompt" :autosize="true" type="textarea" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="onSubmitGpt">生成文案</el-button> <el-button type="primary" @click="onSubmitGpt">生成文案{{wenan_llm_name}}</el-button>
</el-form-item> </el-form-item>
<el-form-item label="文案"> <el-form-item label="文案">
<el-input v-model="form.chatgpt_answer" :autosize="true" type="textarea" /> <el-input v-model="form.chatgpt_answer" :autosize="true" type="textarea" />
</el-form-item> </el-form-item>
<!-- 角色 --> <!-- 角色 -->
<el-form-item> <el-form-item>
<el-button type="primary" @click="onAdaptRoles">推理所有角色</el-button> <el-button type="primary" @click="onAdaptRoles">推理所有角色{{role_llm_name}}</el-button>
<el-button plain @click="clean_roles">清空总角色列表</el-button> <el-button plain @click="clean_roles">清空总角色列表</el-button>
</el-form-item> </el-form-item>
<el-form-item label="角色"> <el-form-item label="角色">
...@@ -406,7 +442,7 @@ const handleExceed: UploadProps['onExceed'] = (files) => { ...@@ -406,7 +442,7 @@ const handleExceed: UploadProps['onExceed'] = (files) => {
</el-form-item> </el-form-item>
<!-- 分镜 --> <!-- 分镜 -->
<el-form-item> <el-form-item>
<el-button type="primary" @click="onAdapt">分镜、推理关键词、绘图</el-button> <el-button type="primary" @click="onAdapt">分镜、推理关键词({{tuili_llm_name}})、翻译({{fanyi_llm_name}})、绘图</el-button>
</el-form-item> </el-form-item>
<el-form-item label="分镜"> <el-form-item label="分镜">
<el-table :data="form.adapt_result_json" border style="width: 100%; z-index: calc(var(--el-table-index) -1)"> <el-table :data="form.adapt_result_json" border style="width: 100%; z-index: calc(var(--el-table-index) -1)">
...@@ -447,8 +483,8 @@ const handleExceed: UploadProps['onExceed'] = (files) => { ...@@ -447,8 +483,8 @@ const handleExceed: UploadProps['onExceed'] = (files) => {
</template> </template>
--> -->
<template v-slot="scope"> <template v-slot="scope">
<div style="margin: 10px 0"><el-button type="primary" size="default" @click="onAdaptOne(scope.row)">重新推理<br />关键字</el-button></div> <div style="margin: 10px 0"><el-button type="primary" size="default" @click="onAdaptOne(scope.row)">推理关键词</el-button></div>
<div style="margin: 10px 0"><el-button type="primary" size="default" @click="onDrawOne(scope.row)">重绘本镜</el-button></div> <div style="margin: 10px 0"><el-button type="primary" size="default" @click="onDrawOne(scope.row)">翻译、绘图</el-button></div>
<el-upload <el-upload
class="upload-demo" class="upload-demo"
ref="upload" ref="upload"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment