50 行代码搞定智能问答 + 股票查询!DeepSeek 模型实战教程

110 阅读6分钟

在人工智能技术快速发展的今天,大语言模型(LLM)已经成为推动应用智能化的核心引擎。本文将结合实际代码示例,介绍如何利用阿里云魔搭平台(ModelScope)提供的开源模型资源,通过 Python 编程和 Jupyter Notebook 环境,搭建一个基于 DeepSeek 推理模型的智能问答系统,并深入探讨其多轮对话能力与工具调用机制。


一、环境准备:ModelScope 与 Jupyter Notebook

阿里云推出的 魔搭(ModelScope) 我的Notebook · 魔搭社区是一个开放的模型平台,汇聚了大量高质量的机器学习和深度学习模型,涵盖语音、视觉、自然语言处理(NLP)等多个领域。它不仅支持模型下载与微调,还提供便捷的在线部署环境。

image.png

我们使用的是 WebIDE 中的 Jupyter Notebook 功能,其 .ipynb 文件格式非常适合进行交互式编程实验。Python 作为科学计算和 AI 开发的事实标准语言,在此环境中可以逐行运行代码,方便调试和验证算法逻辑。

python
编辑
# 导入必要的库
import json
from openai import OpenAI

注:尽管名称为 openai,但这里实际上是对接 DeepSeek API 的客户端,遵循 OpenAI 标准接口协议。

初始化客户端时,指定 API Key 和 Base URL:

client = OpenAI(
    api_key='这里填写你的api_key',
    base_url='https://api.deepseek.com/v1'
)

二、核心接口:chat.completions.create

DeepSeek 提供了 chat.completions.create 接口用于实现聊天完成任务,这是构建对话系统的基石。

1. 消息结构(messages)

该接口接受一个消息列表,每个消息包含 rolecontent 字段:

  • system: 设置角色身份或行为规范,仅在会话开始时设置一次。
  • user: 用户输入的问题。
  • assistant: 模型生成的回答。

例如,我们可以构造一个多轮对话场景来询问足球运动员国籍:

completion = client.chat.completions.create(
    model='deepseek-reasoner',
    messages=[
        {
            'role': 'system',
            'content': '你是一个足球领域的专家,请尽量帮我回答与足球相关的问题。'
        },
        {
            'role': 'user',
            'content': 'C罗是哪个国家的足球运动员?'
        },
        {
            'role': 'assistant',
            'content': 'C罗是葡萄牙的足球运动员。'
        },
        {
            'role': 'user',
            'content': '内马尔呢?'
        }
    ]
)

执行后输出如下:

思考过程:
好的,用户之前问了C罗是哪个国家的,现在接着问内马尔的情况。首先得确认内马尔和C罗一样都是著名球星,直接给出国籍就行。
嗯,用户可能是在对比不同球员的背景,或者单纯想了解巴西的球星。考虑到之前回答C罗时提到了国家队成就,这里也应该补充内马尔的国家队表现,比如世界杯和奥运会。
深层需求可能是想了解球员的国际影响力,或者为讨论足球强国的阵容做准备。需要保持回答简洁,同时突出关键成就,让用户快速获取信息。

最终答案:
内马尔是巴西的足球运动员。

image.png

可以看到,deepseek-reasoner 模型不仅能准确作答,还能展示出清晰的推理路径(reasoning_content),体现了其强大的思维链(Chain-of-Thought)能力。


三、增强能力:工具调用(Function Calling)

虽然大模型具备强大的语言理解和生成能力,但它无法实时访问外部数据。为了弥补这一短板,现代 LLM 支持“工具调用”功能,即让模型根据上下文决定是否调用外部函数以获取最新信息。

1. 定义工具(Tool JSON Schema)

我们需要按照 OpenAI 的标准定义工具接口:

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_closing_price",
            "description": "获取指定股票的收盘价",
            "parameters": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "description": "股票名称"
                    }
                },
                "required": ["name"]
            }
        }
    }
]

2. 实现工具函数

接下来编写对应的 Python 函数:

python
编辑
def get_closing_price(name):
    if name == '青岛啤酒':
        return '67.92'
    else:
        return '未找到该股票'

3. 调用流程

修改 send_message 函数,启用工具调用:


def send_message(messages):
    response = client.chat.completions.create(
        model='deepseek-reasoner',
        messages=messages,
        tools=tools,
        tool_choice='auto'  # 允许模型自主选择是否调用工具
    )
    return response

测试查询:


messages = [{"role": "user", "content": "青岛啤酒的收盘价是多少?"}]
response = send_message(messages)
message = response.choices[0].message
print(message)

输出结果如下:

ChatCompletionMessage(content='我来帮您查询青岛啤酒的收盘价。', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=[ChatCompletionMessageFunctionToolCall(id='call_00_Ys4tkBTVzd9hBK5TMheio05z', function=Function(arguments='{"name":"青岛啤酒"}', name='get_closing_price'), type='function', index=0)])

这表明模型识别到问题需要外部数据支持,自动触发了 get_closing_price 工具调用,并传入参数 "青岛啤酒"


四、模型局限性与应对策略

值得注意的是,DeepSeek 模型的知识来源于预训练阶段的数据,因此不具备实时性。例如:

当用户询问“青岛啤酒的收盘价是多少?”时,模型不会直接返回具体数字,而是提示:“我的数据并非实时更新,直接提供具体的股价数字可能不准确。”

此时,最佳做法是引导用户使用权威财经网站或 App 查询实时行情,如东方财富、同花顺等。也可以建议通过搜索引擎搜索关键词“青岛啤酒股价”获得最新信息。

此外,模型还可以提出“联网搜索”功能设想,未来可通过集成 Web Search API 实现真正的实时数据获取。


五、总结:构建可扩展的智能助手

通过本次实践,我们掌握了以下关键技术点:

  1. 模块化设计:使用 OpenAI 客户端封装 API 调用,提升代码复用性和可维护性。
  2. 多轮对话管理:利用 messages 列表维护上下文,实现连贯的交互体验。
  3. 推理可视化:借助 reasoning_content 展示模型决策过程,增强透明度。
  4. 工具集成:通过 tools 参数赋予模型调用外部函数的能力,拓展应用场景。

未来方向包括:

  • 集成更多真实工具(如天气查询、新闻摘要)
  • 引入记忆机制保存长期上下文
  • 结合 RAG 技术实现知识增强
  • 构建面向特定领域的垂直助手

六、结语

DeepSeek 作为一款高性能推理模型,结合 ModelScope 平台的强大生态,为我们提供了低门槛、高效率的 AI 应用开发路径。无论是初学者还是专业开发者,都可以通过简单的代码实验,快速验证想法并构建实用的智能应用。

本教程所使用的全部代码均基于 Jupyter Notebook 编写,适合在本地或云平台上复现。希望这篇文章能帮助你更好地理解大模型的工作原理及其工程化落地方式。