【大模型技术】基于 通义千问(Qwen)实现对话系统

一、项目背景与目标

目标:

  • 构建一个支持多轮对话的对话系统。
  • 实现上下文管理,确保对话历史能够被正确记录并影响后续回答。
  • 使用 Qwen 提供的 API 生成自然语言回复。

核心功能:

  • 多轮对话:用户可以连续提问,系统根据上下文生成连贯的回答。
  • 上下文管理:通过维护对话历史,确保模型理解用户的意图。
  • 灵活性:支持自定义提示模板和外部数据源。

技术栈:

  • Qwen API:用于生成自然语言回复。
  • Python:编程语言。

二、实现步骤

Step 1: 安装依赖
首先安装必要的库:

pip install dashscope

Step 2: 初始化 Qwen API
确保你有 Qwen API 密钥,并将其设置为环境变量:

import os
os.environ["DASHSCOPE_API_KEY"] = "your_qwen_api_key"

Step 3: 定义对话系统的结构
我们需要以下几个组件:

(1)Prompt 模板:定义如何将用户输入和上下文传递给模型。
(2)Memory:用于存储对话历史。
(3)API 调用逻辑:封装 Qwen API 的调用。

三、完整代码实现

以下是完整的代码示例:

import os
from dashscope import Generation

# Step 1: 初始化 Qwen API 密钥
os.environ["DASHSCOPE_API_KEY"] = "your_qwen_api_key"

# Step 2: 定义对话历史存储
class ConversationMemory:
    def __init__(self):
        self.history = []

    def add_message(self, role, content):
        self.history.append({"role": role, "content": content})

    def get_history(self):
        return self.history

# Step 3: 定义对话函数
def chat_with_qwen():
    print("欢迎使用基于 Qwen 的对话系统!输入 'exit' 结束对话。")
    
    # 初始化对话历史
    memory = ConversationMemory()

    while True:
        # 用户输入
        user_input = input("用户:")
        if user_input.lower() == "exit":
            print("对话结束,谢谢使用!")
            break

        # 将用户输入添加到对话历史
        memory.add_message("user", user_input)

        # 获取当前对话历史
        history = memory.get_history()

        # 构造 Prompt
        prompt = "\n".join([f"{msg['role'].capitalize()}: {msg['content']}" for msg in history])
        prompt += "\nAssistant:"

        # 调用 Qwen API
        response = Generation.call(
            model="qwen-max",  # 可选择不同版本的 Qwen 模型
            prompt=prompt,
            max_tokens=200,
            temperature=0.7
        )

        # 解析 API 响应
        if response.status_code == 200:
            assistant_reply = response.output.text.strip()
            print(f"助手:{assistant_reply}")

            # 将助手回复添加到对话历史
            memory.add_message("assistant", assistant_reply)
        else:
            print("抱歉,系统出现了一些问题,请稍后再试。")

# Step 4: 启动对话
if __name__ == "__main__":
    chat_with_qwen()

四、代码解析

1. 初始化 Qwen API

os.environ["DASHSCOPE_API_KEY"] = "your_qwen_api_key"

替换 your_qwen_api_key 为你在阿里云控制台申请的 Qwen API 密钥。

2. 定义对话历史存储

class ConversationMemory:
    def __init__(self):
        self.history = []

    def add_message(self, role, content):
        self.history.append({"role": role, "content": content})

    def get_history(self):
        return self.history
  • ConversationMemory 类用于存储对话历史。
  • add_message 方法将用户或助手的消息添加到历史中。
  • get_history 方法返回完整的对话历史。

3. 定义对话函数

def chat_with_qwen():
    ...
  • 用户输入通过 input() 函数获取。
  • 对话历史通过 memory.add_message() 动态更新。
  • 调用 Qwen API 时,构造的 prompt 包含完整的对话历史,确保上下文连贯。

4. 调用 Qwen API

response = Generation.call(
    model="qwen-max",
    prompt=prompt,
    max_tokens=200,
    temperature=0.7
)
  • model 指定使用的 Qwen 模型版本(如 qwen-max 或 qwen-turbo)。
  • prompt 是输入文本,包含对话历史。
  • max_tokens 控制生成文本的最大长度。
  • temperature 控制生成文本的随机性。

5. 解析 API 响应

if response.status_code == 200:
    assistant_reply = response.output.text.strip()
    print(f"助手:{assistant_reply}")

如果 API 调用成功,提取助手的回复并打印。
将助手回复添加到对话历史中,以便后续对话保持上下文。

五、运行效果

运行代码后,系统会进入交互模式,用户可以连续提问,系统会根据上下文生成连贯的回答。例如:

欢迎使用基于 Qwen 的对话系统!输入 'exit' 结束对话。
用户:你好!
助手:你好!有什么我可以帮你的吗?
用户:今天的天气怎么样?
助手:抱歉,我无法实时获取天气信息。不过你可以告诉我具体的城市,我可以为你提供一些相关的建议或信息。
用户:那北京呢?
助手:北京的天气通常比较干燥,尤其是在秋冬季节。如果你需要更详细的信息,建议查看天气预报应用。
用户:exit
对话结束,谢谢使用!

六、扩展功能

集成外部数据源:

可以通过 Qwen 的 API 集成知识库或数据库,增强系统的知识能力。
示例:结合向量数据库(如 Pinecone 或 FAISS)检索相关文档。
优化上下文管理:

如果对话历史过长,可以对历史进行总结或截断,减少上下文长度。
部署到生产环境:

使用 Flask 或 FastAPI 构建 RESTful API,将对话系统部署为服务。

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/chat", methods=["POST"])
def chat():
    user_input = request.json.get("message")
    response = Generation.call(
        model="qwen-max",
        prompt=user_input,
        max_tokens=200,
        temperature=0.7
    )
    if response.status_code == 200:
        return jsonify({"response": response.output.text.strip()})
    else:
        return jsonify({"error": "API 调用失败"}), 500

if __name__ == "__main__":
    app.run(debug=True)

七、总结

通过上述代码,我们实现了一个基于 Qwen 的对话系统框架,支持多轮对话和上下文管理。该框架具有以下特点:

  • 易扩展:可以轻松集成外部数据源或优化上下文管理。
  • 高效性:利用 Qwen 的强大生成能力,快速构建复杂的对话逻辑。
  • 灵活性:支持多种 Prompt 模板,适应不同场景需求。

你可能感兴趣的:(大模型,python,人工智能,学习方法,语言模型)