从零到一:用DeepSeek API构建你的专属智能问答系统(附完整代码)
引言
2023年以来,大语言模型如同“数字大脑”走进日常开发,但在实际落地时,很多朋友仍停留在聊天界面浅尝辄止。如何将大模型无缝接入自己的项目,打造一个真正可用的智能问答系统,依然是不少开发者面临的挑战。今天,我们以性价比极为突出的 DeepSeek 为例,从调用API到实现完整的命令行问答机器人,一步步写出生产可用的代码。无论你是想给内部知识库配上自然语言接口,还是希望在自己的应用中集成智能对话能力,这篇文章都能帮你迈出扎实的第一步。
一、核心概念:用大模型构建问答系统
传统的问答系统依赖规则、关键词匹配或人工整理的FAQ,维护成本高且理解能力弱。而基于大语言模型的方式,只需提供提示词(Prompt) 和对话历史(Messages) 即可获得高质量回答。
一个典型的智能问答交互流程可以抽象为:
- 接收用户输入
- 构造请求体(包含系统指令、历史消息、当前问题)
- 调用大模型API
- 解析返回结果并展示
- 将本轮对话追加到历史中,以便下一轮继续
其中最关键的是如何调用API以及如何管理对话上下文。DeepSeek提供了完全兼容OpenAI接口格式的API,这意味着我们可以直接使用官方Python库 openai 来调用DeepSeek的模型,只需修改 base_url 和 api_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("
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)