调用智谱AI实现特定角色扮演对话

1.作者介绍

朱甜甜,女,西安工程大学电子信息学院,2025级研究生

研究方向:图像生成

电子邮件:1946451925@qq.com

李逸超,男,西安工程大学电子信息学院,2025级研究生,张宏伟人工智能课题组

研究方向:机器视觉与人工智能

电子邮件:2317314922@qq.com

2.系统整体架构

图 1系统核心流程

2.1 用户交互层

作为系统入口,接收用户的输入请求与交互指令,是用户与系统之间的核心交互枢纽。

2.2 API网关层

负责接收来自用户交互层的请求,实施路由与限流策略,并将合法请求转发至后端核心服务。

2.3 Flask后端服务层

Flask后端作为核心服务调度层,接收用户输入并执行路由分发,协调各模块完成业务逻辑处理与响应生成。

2.4 角色选择模块

实现虚拟角色的选取与配置,根据用户选择的角色设定,约束后续大模型的回复风格与行为边界。

2.5 GLM-4-Flash生成引擎

基于智谱AI的GLM-4-Flash模型实现语义理解与文本生成,根据上游选定的角色设定与用户输入,输出符合预期的角色化回复

2.6 SSE数据流

采用Server-Sent Events(SSE)技术建立长连接,将GLM-4-Flash生成引擎输出的语义信息以数据流形式实时推送至客户端,无需等待完整响应生成,显著降低感知延迟。

2.7 页面实时渲染

客户端接收流式数据后立即执行增量渲染,每个数据块到达即显示,实现平滑的逐字输出视觉效果。

3、系统页面展示

图 2系统页面

本界面包含以下功能组件:

角色选择器:选择福尔摩斯、黑客、诗人、说书人之一

文本输入框:输入用户问题

发送按钮:触发对话请求

清空按钮:清除所有历史对话记录

4、核心算法实现

4.1角色身份约束(Prompt工程)

核心思想:通过Prompt约束为大模型赋予"角色灵魂"

通过预定义的提示词模板,为大模型注入虚拟身份和行为约束,使模型回复始终保持一致的角色风格。

实现原理:

身份设定: 说明"你是谁"(如"你是黑客")

行为约束: 限定"应该怎么说"(如"用数字化与系统思维回答")

角色配置代码(app.py

python 复制代码
# 角色系统(Prompt算法核心)

roles = {

    "detective": {

        "name": "福尔摩斯",

        "prompt": "你是福尔摩斯,依据逻辑推理,按严谨流程回答问题。"

    },

    "hacker": {

        "name": "黑客",

        "prompt": "你是冷酷黑客,说话充满数字化与系统思维。"

    },

    "poet": {

        "name": "诗人",

        "prompt": "你是抒情诗人,语言需要富有诗意。"

    },

    "storyteller": {

        "name": "说书人",

        "prompt": "你是市井说书人,用叙事手法回答问题。"

    }

}

4.2流式输出实现机制(SSE)

核心优势:将"等待延迟"转化为"渐进式交互"

传统模式的问题

传统模式下,系统需要等待大模型生成完整回复后才一次性返回数据。用户在整个生成过程中无法获得任何反馈,造成明显的响应等待感,严重削弱实时交互体验。

流式输出流程

  1. 逐块生成:大模型逐块生成响应内容,每生成一个数据块即立即输出
  2. 实时推送:后端通过SSE协议将每个数据块实时推送至数据流通道
  3. 持续监听:客户端持续监听数据流,每收到一个数据块即可立即获取
  4. 流式渲染:客户端按顺序拼接数据块并实时更新页面显示

后端代码实现(app.py

python 复制代码
@app.route("/chat", methods=["POST"])

def chat():

    data = request.json

    user_text = data["message"]

    role_key = data["role"]



    system_prompt = roles[role_key]["prompt"]



    messages = [

        {"role": "system", "content": system_prompt}

    ]

    messages.extend(chat_history)

    messages.append({"role": "user", "content": user_text})



    def generate():

        full_text = ""



        response = client.chat.completions.create(

            model="glm-4-flash",

            messages=messages,

            stream=True          # 关键参数:启用流式输出

        )



        for chunk in response:

            delta = chunk.choices[0].delta.content

            if delta:

                full_text += delta

                yield delta      # 逐块返回数据



                # 演示优化:让流式效果"看得见"

                time.sleep(random.uniform(0.02, 0.06))



        # 保存短期记忆

        chat_history.append({"role": "user", "content": user_text})

        chat_history.append({"role": "assistant", "content": full_text})



        # 存入数据库

        conn = sqlite3.connect("chat.db")

        c = conn.cursor()

        c.execute(

            "INSERT INTO chat(role,user,ai,time) VALUES (?,?,?,?)",

            (role_key, user_text, full_text, str(datetime.datetime.now()))

        )

        conn.commit()

        conn.close()



return Response(stream_with_context(generate()), content_type="text/plain")

前端代码实现(script.js)

python 复制代码
// 流式读取并渲染

const reader = response.body.getReader();

const decoder = new TextDecoder();

let aiText = "";



while (true) {

    const { done, value } = await reader.read();

    if (done) break;

    

    aiText += decoder.decode(value);

    aiDiv.querySelector(".bubble").innerHTML = aiText;  // 实时更新UI

    chatbox.scrollTop = chatbox.scrollHeight;           // 自动滚动

}

5、数据集介绍

本系统的数据集包含用户输入、模型回复、角色设定及时间戳四类字段。核心设计原则为保证对话一致性,其中角色设定的一致性通过时间戳进行验证。

表 1 数据采集维度说明

|------|------------------|
| 字段 | 说明 |
| 用户输入 | 用户在交互界面提交的原始文本 |
| 模型回复 | 大模型结合角色设定生成的反馈文本 |
| 角色设定 | 用户当前选择的交互角色 |
| 时间戳 | 对话发生的具体时间(精确到秒) |

6、实验验证

6.1 角色设定实验

输入问题:"人工智能和人类的区别是什么"

表 2 不同角色回复风格对比

|------|---------------------|
| 角色 | 回复风格 |
| 福尔摩斯 | 逻辑严谨,以事实为依据,术语使用规范 |
| 黑客 | 使用数字化术语,以系统架构视角分析问题 |
| 诗人 | 语言优美,富有意象和隐喻,如诗般表达 |
| 说书人 | 叙事生动,富有画面感,以章回体方式铺陈 |

图 3 福尔摩斯回复

图 4 黑客回复

图 5 诗人回复

图 6 说书人回复

6.2 上下文记忆回溯实验

实验目的验证系统是否能依据历史对话上下文进行准确回应

回溯实验第1轮:

****用户输入:"****我喜欢红色"

预期结果 ****:****系统以所选角色风格回复

图 7 回溯实验第1轮

回溯实验第2轮:

****用户输入:****我先前说我喜欢什么颜色"

预期结果 ****:****系统回复"红色"

实验结果:系统能依据历史对话上下文准确回忆用户之前输入的内容,验证了对话一致性机制的有效性。

图 8 回溯实验第2轮

相关推荐
nexustech1 小时前
simplejson:Python JSON 处理的备用引擎
开发语言·python·其他·json
lulu12165440781 小时前
OpenAI 如何用开源前端生态为 GPT-5.6 铺路? - 微元算力(weytoken)
java·前端·人工智能·python·gpt·开源·ai编程
CC数学建模2 小时前
2026年第十六届APMCM 亚太地区大学生数学建模竞赛(中文赛项)赛题A题:自来水厂水质预测与评估完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模
天天进步20152 小时前
Python全栈项目--基于机器学习的异常检测系统
开发语言·python·机器学习
xxie12379410 小时前
return与print
开发语言·python
秋910 小时前
从 Python 后端工程师转型 AI Engineer(AI 工程化)的完整补课清单(2026实战版)
开发语言·人工智能·python
慕木沐11 小时前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python
Tbisnic11 小时前
AI大模型学习第十一天:技术选型、安全防护与金融实战
python·学习·ai·大模型·提示词工程
hboot11 小时前
AI工程师第一课 - Python
前端·后端·python