Skip to content

Latest commit

 

History

History
419 lines (304 loc) · 9.71 KB

File metadata and controls

419 lines (304 loc) · 9.71 KB
Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0783
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
- 本教程同步发布在: 
	- 个人网站: `https://oeasy.org` 
	- 蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
	- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
	- Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

文生图模型调用

回忆

  • 上次我们研究了渲染的问题

图片描述

  • 无论是 浏览器 还是 终端
    • 都可以 按照md的文档格式 进行渲染
  • 还有什么 可以玩吗?🤔

回到最初

图片描述

from openai import OpenAI

client = OpenAI(
    base_url='https://api-inference.modelscope.cn/v1',   
    api_key = 'ms-81c1f87a-fa0a-4edc-a4a5-4bc7ba3cbbba'
)

response = client.chat.completions.create(
    model='Qwen/Qwen3-Next-80B-A3B-Instruct', # ModelScope Model-Id
    messages=[
        {
            'role': 'system',
            'content': 'You are a helpful assistant.'
        },
        {
            'role': 'user',
            'content': '你好'
        }
    ],
    stream=True
)

for chunk in response:
    print(chunk.choices[0].delta.content, end='', flush=True)

  • 如何 把用户信息
    • 修改为 实施输入 呢?

图片描述

实施输入

图片描述

  • 想要设置人设

系统人设

图片描述

  • 哪我是谁呢?

我是谁?

图片描述

  • 想告诉大模型
    • 你是孙悟空
    • 我是猪八戒

还是系统人设

图片描述

  • 可以多轮对话吗?

循环

  • 添加外层循环

图片描述

运行效果

记忆问题

  • 但是 对话中发现
    • 不论前端 还是 后端
    • 大模型都 没有记忆

图片描述

  • 怎么 让大模型 有记忆 呢?🤔

循环发问

  • 定义函数 分色显示messages
def show_messages(messages):
    print("==========消息开始==============")
    counter = 1
    for message in messages:
        print("\033[4" + str(counter) + "m",end="")
        print(message,end="")
        print("\33[0m")
        counter = counter + 1
        if counter == 7:
            counter = 1
    print("==========消息结束==============")
  • 在流式输出响应之前
    • 调用函数
    • 输出消息
show_messages(messages)
  • 效果

图片描述

  • 每次都是新发的消息
  • 所以没有历史

新要求

图片描述

  • 现在提出新的要求
现在 每次都直接 与大模型对话,
我希望修改代码 变成一个智能体,
把相应的上下文 都记录着,
就是我们之间的对话 有记忆

提要求

  • 观察代码
    • 除了system、user之外
    • 添加了新的角色 assistant
from openai import OpenAI
import sys

def show_messages(messages):
    print("==========消息开始==============")
    counter = 1
    for message in messages:
        print("\033[4" + str(counter) + "m",end="")
        print(message,end="")
        print("\33[0m")
        counter = counter + 1
        if counter == 7:
            counter = 1
    print("==========消息结束==============")

# 初始化OpenAI客户端
client = OpenAI(
    base_url='https://api-inference.modelscope.cn/v1',    api_key='ms-b0ae5a32-3e85-44d7-b20f-ba2782189024', # ModelScope
)

# 初始化消息历史,包含系统提示词
messages = [
    {
        'role': 'system',
        'content': '你是孙悟空,我是猪八戒。'
    }
]

print("欢迎使用智能对话助手!输入'退出'或'q'结束对话。\n")

# 对话循环
while True:
    # 获取用户输入
    user_input = input("问题: ")
   
    # 添加用户消息到历史
    messages.append({
        'role': 'user',
        'content': user_input
    })
    
    try:
    	
		show_messages(messages)
    
        # 发送请求到模型
        response = client.chat.completions.create(
            model='Qwen/Qwen3-Next-80B-A3B-Instruct', # ModelScope Model-Id
            messages=messages,
            stream=True
        )
        
        print("助手: ", end='', flush=True)
        assistant_reply = ""
        
        # 处理流式响应
        for chunk in response:
            if chunk.choices[0].delta.content:
                print(chunk.choices[0].delta.content, end='', flush=True)
                assistant_reply += chunk.choices[0].delta.content
        
        print()  # 换行
        
        # 添加助手回复到历史
        messages.append({
            'role': 'assistant',
            'content': assistant_reply
        })
        
    except Exception as e:
        print(f"发生错误: {e}")
        # 发生错误时,移除最后添加的用户消息
        if messages and messages[-1]['role'] == 'user':
            messages.pop()
  • 上下文里面到底增加了什么?

新增内容

  • 先把用户问题
    • 放进上下文

图片描述

  • 再把模型回答内容
    • 也放进上下文

图片描述

观察

  • 大模型有了记忆
    • 直到刚才说的最后一种水果 是葡萄

图片描述

  • 这个messages本质上就是
    • 对话历史(conversation_history)
  • 这和记忆有什么关系?

对话历史(conversation_history)

  • 将 对话历史(conversation_history) 作为上下文 传给大模型
    • 于是大模型有了记忆

图片描述

  • 可以 输出 对话历史(conversation_history)吗?

观察上下文

  • 先埋好 system人设 后
    • 先输出一把
messages = [
    {
        'role': 'system',
        'content': '你是言简意赅的回答者。'
    }
]
  • 在 三个位置 输出对话历史message
    1. 人设完成
    2. 用户新发了新消息
    3. 系统新回了
print(messages)

修改后的代码

  • 可以看到 上下文中
    • 包括了上次的问和答
    • 大模型 就是这样用有记忆的
from openai import OpenAI
import sys



# 初始化OpenAI客户端
client = OpenAI(
    base_url='https://api-inference.modelscope.cn/v1',    api_key='ms-b0ae5a32-3e85-44d7-b20f-ba2782189024', # ModelScope
)

# 初始化消息历史,包含系统提示词
messages = [
    {
        'role': 'system',
        'content': '你是言简意赅的回答者。'
    }
]

print(messages)

# 对话循环
while True:
    # 获取用户输入
    user_input = input("你: ")

    # 检查是否退出
    if user_input.lower() in ['退出', 'q', 'quit', 'exit']:
        print("再见!")
        break

    # 添加用户消息到历史
    messages.append({
        'role': 'user',
        'content': user_input
    })
    print(messages)

    try:
        # 发送请求到模型
        response = client.chat.completions.create(
            model='Qwen/Qwen3-Next-80B-A3B-Instruct', # ModelScope Model-Id
            messages=messages,
            stream=True
        )

        print("助手: ", end='', flush=True)
        assistant_reply = ""

        # 处理流式响应
        for chunk in response:
            if chunk.choices[0].delta.content:
                print(chunk.choices[0].delta.content, end='', flush=True)
                assistant_reply += chunk.choices[0].delta.content

        # 添加助手回复到历史
        messages.append({
            'role': 'assistant',
            'content': assistant_reply
        })
        print(messages)

    except Exception as e:
        print(f"发生错误: {e}")
        # 发生错误时,移除最后添加的用户消息
        if messages and messages[-1]['role'] == 'user':
            messages.pop()

对话效果

图片描述

⚠️新概念

会话期(Session)

概念解析

概念 中文 核心含义 作用
Chunk 数据块 文本片段
渐进式内容生成
实时响应
提升用户体验
Chat 对话 一问一答 用户与模型交互
模型回答问题
Session 会话期 多轮交互 维护多轮上下文
让模型有记忆

图片描述

新角色

  • 由于 有了聊天历史
    • 大模型(llm) 拥有了 记忆
    • 成为了 智能体(agent)

图片描述

角色 核心定位 作用与特点 场景举例
system 最初人设 1. 提前设定模型行为
2.用户看不到
3. 影响方向
你是耐心的数学老师
解题步骤详细
user 用户提问消息 1. 用户的提问
2. 模型回答的直接触点
什么是质数?
写一段生日祝福
assistant 大模型的回复 1. 模型的回答
2. 传入历史
模型的回答
  • 以上三种角色的内容(content)
    • 都会进入 聊天历史(conversation_history)

总结

  • 这次 通过messages
    • 给大语言模型 添加了聊天记录
    • 这样大语言模型 就有了 记忆
    • 成为了智能体(agent)

图片描述

  • 但是
    • 目前智能体无法知道
    • 当前日期时间
    • 怎么办呢?🤔
  • 下次再说👋

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。