引言

2023年以来,大语言模型如同“数字大脑”走进日常开发,但在实际落地时,很多朋友仍停留在聊天界面浅尝辄止。如何将大模型无缝接入自己的项目,打造一个真正可用的智能问答系统,依然是不少开发者面临的挑战。今天,我们以性价比极为突出的 DeepSeek 为例,从调用API到实现完整的命令行问答机器人,一步步写出生产可用的代码。无论你是想给内部知识库配上自然语言接口,还是希望在自己的应用中集成智能对话能力,这篇文章都能帮你迈出扎实的第一步。

一、核心概念:用大模型构建问答系统

传统的问答系统依赖规则、关键词匹配或人工整理的FAQ,维护成本高且理解能力弱。而基于大语言模型的方式,只需提供提示词(Prompt)对话历史(Messages) 即可获得高质量回答。

一个典型的智能问答交互流程可以抽象为:

  1. 接收用户输入
  2. 构造请求体(包含系统指令、历史消息、当前问题)
  3. 调用大模型API
  4. 解析返回结果并展示
  5. 将本轮对话追加到历史中,以便下一轮继续

其中最关键的是如何调用API以及如何管理对话上下文。DeepSeek提供了完全兼容OpenAI接口格式的API,这意味着我们可以直接使用官方Python库 openai 来调用DeepSeek的模型,只需修改 base_urlapi_key 即可。

二、准备工作

在开始编码之前,请确保你拥有 DeepSeek 的 API 密钥。你可以登录 DeepSeek 开放平台 注册账号并创建 API Key。新用户一般会获得一定额度的免费调用量,足够完成本教程的实验。

本教程基于 Python 3.8+ 开发,依赖 openai 库(版本≥1.0.0)。执行以下命令安装:

pip install openai

我们将所有代码组织在单个 Python 文件中,方便你直接复制运行。

三、实战:从单轮问答到多轮对话机器人

我们将分步骤实现两个版本:基础单次问答具备记忆的多轮对话系统,并加入友好的流式输出效果。

3.1 基础调用:向 DeepSeek 提问

先编写一个最简单的函数,用来向 DeepSeek 发送一个问题并获取答案。这里我们使用 deepseek-chat 模型,它是性价比极高的对话模型,适合大多场景。

import os
from openai import OpenAI

# 配置 API 相关信息
client = OpenAI(
    api_key="your-deepseek-api-key",  # 替换为你的真实 API Key
    base_url="https://api.deepseek.com"
)

def ask_deepseek(question: str) -> str:
    """发送单轮问题到 DeepSeek,返回回答内容"""
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "user", "content": question}
        ],
        temperature=0.7,  # 控制创造性,0-2之间,越大越随机
        max_tokens=1024   # 限制回答最长长度
    )
    # 提取回答内容
    answer = response.choices[0].message.content
    return answer

if __name__ == "__main__":
    # 简单测试
    question = "请用Python写一个快速排序算法"
    print("问题:", question)
    print("回答:", ask_deepseek(question))

运行这段代码,你就能在终端看到模型的回答。虽然只有短短几行,但它已经是一个最简问答系统。不过,这种方式每次都是“一次性的”,模型记不住你之前说过什么,无法进行连续对话。

3.2 多轮对话:让系统记住上下文

要实现多轮对话,我们需要在 messages 中维护完整的对话历史。每一轮都将用户的提问和模型的回答加入消息列表,下一次请求时携带全部历史消息。

下面我们构建一个 ChatBot 类,封装多轮对话逻辑,并支持流式输出(类似 ChatGPT 逐字弹出的效果)。

import os
from openai import OpenAI

class DeepSeekChatBot:
    def __init__(self, api_key: str, system_prompt: str = ""):
        """
        初始化聊天机器人
        :param api_key: DeepSeek API 密钥
        :param system_prompt: 系统级提示词,定义机器人的角色和行为
        """
        self.client = OpenAI(api_key=api_key, base_url="https://api.deepseek.com")
        # 对话历史,如果提供了系统提示词作为第一条消息
        self.messages = []
        if system_prompt:
            self.messages.append({"role": "system", "content": system_prompt})

    def ask(self, user_input: str, stream: bool = True) -> str:
        """
        发送用户消息并获得回答
        :param user_input: 用户输入文本
        :param stream: 是否使用流式输出
        :return: 模型回答的完整文本
        """
        # 将用户消息加入历史
        self.messages.append({"role": "user", "content": user_input})

        if stream:
            # 流式请求
            response_stream = self.client.chat.completions.create(
                model="deepseek-chat",
                messages=self.messages,
                temperature=0.8,
                max_tokens=2048,
                stream=True
            )
            print("助手: ", end="", flush=True)
            collected_content = ""
            for chunk in response_stream:
                if chunk.choices[0].delta.content:
                    content_piece = chunk.choices[0].delta.content
                    print(content_piece, end="", flush=True)
                    collected_content += content_piece
            print()  # 换行
            # 将完整的助手回答加入历史
            self.messages.append({"role": "assistant", "content": collected_content})
            return collected_content
        else:
            # 非流式请求
            response = self.client.chat.completions.create(
                model="deepseek-chat",
                messages=self.messages,
                temperature=0.8,
                max_tokens=2048
            )
            answer = response.choices[0].message.content
            print(f"助手: {answer}")
            self.messages.append({"role": "assistant", "content": answer})
            return answer

    def clear_history(self):
        """清除对话历史(保留系统提示词)"""
        self.messages = self.messages[:1] if self.messages and self.messages[0]["role"] == "system" else []
        print("对话历史已清空。")

这个 DeepSeekChatBot 类会将每次对话自动记录在 self.messages 中,下次调用时模型就能“记得”之前的内容。此外,流式输出代码对于用户体验提升很大,尤其在回答较长的生成任务中。

3.3 完整的命令行交互程序

接下来,我们写一个简单的命令行main函数,让用户可以在终端中持续与机器人对话。同时加入一些实用指令,比如清空历史、退出等。

```python
import os

def main():
# 从环境变量读取 API Key,更安全
api_key = os.getenv("DEEPSEEK_API_KEY")
if not api_key:
api_key = input("请输入你的 DeepSeek API Key: ").strip()
if not api_key:
print("API Key 不能为空,程序退出。")
return

# 定义一个有帮助且友好的系统提示词
system_prompt = "你是一个知识渊博、耐心细致的智能助手。请用中文回答用户的问题,并提供清晰、有用的信息。"
bot = DeepSeekChatBot(api_key=api_key, system_prompt=system_prompt)

print("
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐