DeepSeek-R1聊天机器人开发教程,我们用 Python 构建一个 DeepSeek-R1聊天机器人

DeepSeek-R1聊天机器人开发教程,我们用 Python 构建一个 DeepSeek-R1聊天机器人

AI 领域的进步速度确实在以前所未有的速度前进。短短一周多的时间,DeepSeek-R1 LLM 模型的发布就以其令人印象深刻的准确性震撼了 AI 世界,其准确性与现有模型相当,但创建成本仅为典型成本的一小部分。

DeepSeek 团队成功地将其庞大的 671B 参数模型的推理能力提炼为基于 Qwen(DeepSeek-R1-Distill-Qwen-1.5B、7B、14B 和 32B)和 Llama(DeepSeek-R1-Distill-Llama-8B 和 70B)的 6 个小模型。这实际上意味着你可以使用自己的模型副本 - 自定义它、进行更改、在本地运行它或将其托管在云平台上。

在本文中,我们用 Python 构建一个 DeepSeek-R1 聊天机器人。简而言之,Streamlit 用于前端,而在后端,通过对托管在 Snowflake 中的 DeepSeek-R1 模型的 API 调用,可以实现为应用程序的响应提供支持的 LLM 模型。

点击这里查看本教程的 GitHub 存储库。

1、什么是 DeepSeek-R1?

简而言之,DeepSeek-R1 是一种推理模型,它利用强化学习来教授基本语言模型 DeepSeek-V3 进行推理,而无需人工监督。

以下是 DeepSeek-R1 的 5 个主要功能:

  • 最先进的推理:DeepSeek-R1 在高级数学任务上可以达到 97.3% 的准确率,优于早期的基准。同样,它在 AIME 2024 上的得分为 79.8%,在 SWE-bench Verified 上的得分为 49.2%,也优于其他模型。
  • 成本效率:与行业标准相比,DeepSeek 模型的训练成本显著降低
  • 应用广泛:在创意写作、长上下文理解和事实问答方面表现出色。
  • 可扩展性:模型有多个精简版本(1.5B 到 70B 个参数),从而优化了能力和资源使用之间的平衡。
  • 可访问性:开源可用性使开发人员和研究人员能够尝试该模型,以将高级 AI 工具应用于实际项目。

尽管其性能出色,但人们仍可能对其使用方面的安全问题感到担忧。鉴于此,由于模型是开源的,因此可以检查底层代码,而模型本身可以在用户自己的计算资源上自行部署。

在本教程中,我们将使用托管在 Snowflake 平台中的 DeepSeek-R1 模型

2、应用程序概述

以下是 DeepSeek-R1 聊天机器人应用程序的高级概述:

  • 用户提供提示输入(即提出问题)。
  • 通过使用  SNOWFLAKE.CORTEX.COMPLETE()进行 LLM 调用,其中提交提示输入,并获取 LLM 生成的响应,并将其显示在应用程序中。

3、聊天机器人的运行

让我们看看聊天机器人的实际运行,启动聊天机器人并在聊天输入中输入问题:

DeepSeek-R1聊天机器人开发教程,我们用 Python 构建一个 DeepSeek-R1聊天机器人

作为推理模型,LLM 首先进入思考阶段:

DeepSeek-R1聊天机器人开发教程,我们用 Python 构建一个 DeepSeek-R1聊天机器人

思考过程完成后,最终答案将在下面显示:

DeepSeek-R1聊天机器人开发教程,我们用 Python 构建一个 DeepSeek-R1聊天机器人

应该注意的是,思考和答案的深度直接受到最大令牌参数的影响。在这里,我们将最大令牌限制为 800 个以进行测试,但你可以将其增加到 20,480。

4、构建 DeepSeek-R1 聊天机器人

现在让我们继续在 Snowflake 平台上构建 DeepSeek-R1 聊天机器人。

4.1 设置开发环境

要访问必要的工具,请确保你可以访问 Snowflake 帐户。

接下来,导航到 Snowflake 中的 Streamlit,转到项目→Streamlit,然后单击 + Streamlit App 以创建应用程序(然后你将指定应用程序位置和仓库):

DeepSeek-R1聊天机器人开发教程,我们用 Python 构建一个 DeepSeek-R1聊天机器人

接下来,你将看到一个示例入门应用程序来帮助入门:

DeepSeek-R1聊天机器人开发教程,我们用 Python 构建一个 DeepSeek-R1聊天机器人

Snowflake 中的 Streamlit 界面类似于在线代码编辑器,您可以在左侧编辑代码并在右侧查看呈现的应用程序。

继续将其替换为我们今天要构建的应用程序。

4.2 检索代码

我们今天要构建的 DeepSeek-R1 聊天机器人应用程序由以下部分组成:

  • environment.yml — 应用程序的环境依赖项
  • streamlit_app.py — Streamlit 应用程序文件

首先,environment.yml 文件的内容如下所示:

  1. name: app_environment
  2. channels:
  3. - snowflake
  4. dependencies:
  5. - python=3.11.*
  6. - snowflake-ml-python
  7. - snowflake-snowpark-python
  8. - streamlit

其次,sis_app.py 文件的内容如下所示:

  1. import streamlit as st
  2. from snowflake.snowpark.context import get_active_session
  3. import pandas as pd
  4. import json
  5. import re
  6. # App configuration
  7. st.set_page_config(page_title="🐳💬 DeepSeek R1 Chatbot", initial_sidebar_state="expanded")
  8. session = get_active_session()
  9. # Helper functions
  10. def clear_chat_history():
  11. st.session_state.messages = [{"role": "assistant", "content": "How may I assist you today?"}]
  12. def escape_sql_string(s):
  13. return s.replace("'", "''")
  14. def extract_think_content(response):
  15. think_pattern = r'<think>(.*?)</think>'
  16. think_match = re.search(think_pattern, response, re.DOTALL)
  17. if think_match:
  18. think_content = think_match.group(1).strip()
  19. main_response = re.sub(think_pattern, '', response, flags=re.DOTALL).strip()
  20. return think_content, main_response
  21. return None, response
  22. def generate_deepseek_response(prompt, **params):
  23. string_dialogue = "".join(
  24. f"{msg['content']}\n\n"
  25. for msg in st.session_state.messages
  26. )
  27. cortex_prompt = f"'[INST] {string_dialogue}{prompt} [/INST]'"
  28. prompt_data = [{'role': 'user', 'content': cortex_prompt}], params
  29. prompt_json = escape_sql_string(json.dumps(prompt_data))
  30. response = session.sql(
  31. "select snowflake.cortex.complete(?, ?)",
  32. params=['deepseek-r1', prompt_json]
  33. ).collect()[0][0]
  34. return response
  35. # Model parameters configuration
  36. MODEL_PARAMS = {
  37. 'temperature': {'min': 0.01, 'max': 1.0, 'default': 0.7, 'step': 0.01},
  38. 'top_p': {'min': 0.01, 'max': 1.0, 'default': 1.0, 'step': 0.01},
  39. 'max_tokens': {'min': 10, 'max': 100, 'default': 20, 'step': 10},
  40. 'presence_penalty': {'min': -1.0, 'max': 1.0, 'default': 0.0, 'step': 0.1},
  41. 'frequency_penalty': {'min': -1.0, 'max': 1.0, 'default': 0.0, 'step': 0.1}
  42. }
  43. # Sidebar UI
  44. with st.sidebar:
  45. st.title('🐳💬 DeepSeek R1 Chatbot')
  46. st.write('This chatbot is created using the DeepSeek R1 LLM model via Snowflake Cortex.')
  47. st.subheader('⚙️ Model parameters')
  48. params = {
  49. param: st.sidebar.slider(
  50. param.replace('_', ' ').title(),
  51. min_value=settings['min'],
  52. max_value=settings['max'],
  53. value=settings['default'],
  54. step=settings['step']
  55. )
  56. for param, settings in MODEL_PARAMS.items()
  57. }
  58. st.button('Clear Chat History', on_click=clear_chat_history)
  59. # Initialize chat history
  60. if "messages" not in st.session_state:
  61. st.session_state.messages = [{"role": "assistant", "content": "How may I assist you today?"}]
  62. # Display chat messages
  63. for message in st.session_state.messages:
  64. with st.chat_message(message["role"]):
  65. st.write(message["content"])
  66. # Handle user input
  67. if prompt := st.chat_input():
  68. with st.chat_message("user"):
  69. st.write(prompt)
  70. st.session_state.messages.append({"role": "user", "content": prompt})
  71. if st.session_state.messages[-1]["role"] != "assistant":
  72. with st.chat_message("assistant"):
  73. status_container = st.status("Thinking ...", expanded=True)
  74. with status_container:
  75. response = generate_deepseek_response(prompt, **params)
  76. think_content, main_response = extract_think_content(response)
  77. if think_content:
  78. st.write(think_content)
  79. status_container.update(label="Thoughts", state="complete", expanded=False)
  80. st.markdown(main_response)
  81. st.session_state.messages.append({"role": "assistant", "content": main_response})

你还可以从此 DeepSeek-R1 聊天机器人 Github存储库下载必要的应用文件。

4.3 运行应用

要运行应用,请复制粘贴上述代码,然后单击“运行”按钮。

DeepSeek-R1聊天机器人开发教程,我们用 Python 构建一个 DeepSeek-R1聊天机器人

你可以将鼠标光标放在代码/应用程序面板的分隔线上,然后将其向左移动,直到代码面板消失(见下文)。这会将应用程序面板扩展至全屏。

继续并输入提示以开始你的聊天会话:

DeepSeek-R1聊天机器人开发教程,我们用 Python 构建一个 DeepSeek-R1聊天机器人

此外,请参阅上面的 Chatbot 实际操作部分,了解 LLM 生成的思维过程和答案。

5、代码说明

让我们探索每个代码块在做什么……

5.1 导入库

我们首先从导入先决条件库开始。

  1. import streamlit as st
  2. from snowflake.snowpark.context import get_active_session
  3. import pandas as pd
  4. import json
  5. import re

5.2 应用程序配置

接下来,我们使用 st.set_page_config() 定义应用程序页面并设置其初始页面参数,我们将设置 initial_sidebar_state="expanded",以便它们完全按照那样做,展开侧边栏。在这里,我们还设置了会话变量,我们稍后会用到它。

  1. # App configuration
  2. st.set_page_config(page_title="🐳💬 DeepSeek R1 Chatbot", initial_sidebar_state="expanded")
  3. session = get_active_session()

5.3 辅助函数

在此部分中,我们定义了几个将在应用程序的后面部分使用的辅助函数:

  • clear_chat_history() — 这允许我们将聊天记录清除到初始状态
  • escape_sql_string()— 在执行一些文本格式化时替换 SQL 字符串
  • extract_think_content()— 解析并分离包含在 XML 样式“think”标签( 和 )中的内容,并将其与最终响应分开。
  1. # Helper functions
  2. def clear_chat_history():
  3. st.session_state.messages = [{"role": "assistant", "content": "How may I assist you today?"}]
  4. def escape_sql_string(s):
  5. return s.replace("'", "''")
  6. def extract_think_content(response):
  7. think_pattern = r'<think>(.*?)</think>'
  8. think_match = re.search(think_pattern, response, re.DOTALL)
  9. if think_match:
  10. think_content = think_match.group(1).strip()
  11. main_response = re.sub(think_pattern, '', response, flags=re.DOTALL).strip()
  12. return think_content, main_response
  13. return None, response

例如,假设我们有以下生成的响应:

  1. <think>Let me analyze this problem step by step...</think>
  2. Here's the solution you're looking for...

它将解析并分离为:

  • think_content:“让我一步一步分析这个问题……”
  • main_response:“这是您正在寻找的解决方案……”

让我们继续使用最后一个辅助函数:

  • generate_deepseek_response() — 使用 Snowflake 的 Cortex 服务和 DeepSeek R1 模型生成 LLM 响应
  1. def generate_deepseek_response(prompt, **params):
  2. string_dialogue = "".join(
  3. f"{msg['content']}\n\n"
  4. for msg in st.session_state.messages
  5. )
  6. cortex_prompt = f"'[INST] {string_dialogue}{prompt} [/INST]'"
  7. prompt_data = [{'role': 'user', 'content': cortex_prompt}], params
  8. prompt_json = escape_sql_string(json.dumps(prompt_data))
  9. response = session.sql(
  10. "select snowflake.cortex.complete(?, ?)",
  11. params=['deepseek-r1', prompt_json]
  12. ).collect()[0][0]
  13. return response

5.4 侧边栏 UI

我们首先将  变量定义为字典格式,其中包含模型参数以及相关的最小值、最大值、默认值和步长值。

MODEL_PARAMS

接下来,我们将定义以应用程序标题和应用程序描述开头的侧边栏。在这里,我们还包括几个通过 for 循环迭代创建的滑块小部件。最后,我们有一个清除聊天历史记录按钮,它调用clear_chat_history回调函数将历史记录重置为初始状态。

  1. # Model parameters configuration
  2. MODEL_PARAMS = {
  3. 'temperature': {'min': 0.01, 'max': 1.0, 'default': 0.7, 'step': 0.01},
  4. 'top_p': {'min': 0.01, 'max': 1.0, 'default': 1.0, 'step': 0.01},
  5. 'max_tokens': {'min': 10, 'max': 100, 'default': 20, 'step': 10},
  6. 'presence_penalty': {'min': -1.0, 'max': 1.0, 'default': 0.0, 'step': 0.1},
  7. 'frequency_penalty': {'min': -1.0, 'max': 1.0, 'default': 0.0, 'step': 0.1}
  8. }
  9. # Sidebar UI
  10. with st.sidebar:
  11. st.title('🐳💬 DeepSeek R1 Chatbot')
  12. st.write('This chatbot is created using the DeepSeek R1 LLM model via Snowflake Cortex.')
  13. st.subheader('⚙️ Model parameters')
  14. params = {
  15. param: st.sidebar.slider(
  16. param.replace('_', ' ').title(),
  17. min_value=settings['min'],
  18. max_value=settings['max'],
  19. value=settings['default'],
  20. step=settings['step']
  21. )
  22. for param, settings in MODEL_PARAMS.items()
  23. }
  24. st.button('Clear Chat History', on_click=clear_chat_history)

5.5 聊天元素

在应用程序的最后部分,我们将初始化聊天历史记录的会话状态变量,迭代显示传入的聊天消息,并最终定义处理用户/应用程序聊天逻辑的条件流。后一部分利用先前定义的辅助函数来处理 LLM 生成的响应。

  1. # Initialize chat history
  2. if "messages" not in st.session_state:
  3. st.session_state.messages = [{"role": "assistant", "content": "How may I assist you today?"}]
  4. # Display chat messages
  5. for message in st.session_state.messages:
  6. with st.chat_message(message["role"]):
  7. st.write(message["content"])
  8. # Handle user input
  9. if prompt := st.chat_input():
  10. with st.chat_message("user"):
  11. st.write(prompt)
  12. st.session_state.messages.append({"role": "user", "content": prompt})
  13. if st.session_state.messages[-1]["role"] != "assistant":
  14. with st.chat_message("assistant"):
  15. status_container = st.status("Thinking ...", expanded=True)
  16. with status_container:
  17. response = generate_deepseek_response(prompt, **params)
  18. think_content, main_response = extract_think_content(response)
  19. if think_content:
  20. st.write(think_content)
  21. status_container.update(label="Thoughts", state="complete", expanded=False)
  22. st.markdown(main_response)
  23. st.session_state.messages.append({"role": "assistant", "content": main_response})

将这些代码块拼凑在一起,我们就得到了 DeepSeek-R1 聊天机器人!

6、结束语

构建自己的聊天机器人,该聊天机器人由强大的 DeepSeek-R1 模型提供支持。这在不到 100 行代码中令人印象深刻地实现。

你可能会注意到,代码的很大一部分涉及“思考”标签和大量内联注释的处理,如果删除这些注释,应用程序会大大缩小。

声明:内容来源公开的各类媒体平台,若收录的内容侵犯了您的权益,请联系邮箱,本站将第一时间处理。
百科

在本地运行 DeepSeek-R1 的成本是多少?DeepSeek-R1本地运行成本

2025-2-10 12:31:13

教程百科

教你用AI制作视频,看了都会的AI视频短片制作教程

2025-2-11 10:59:26

搜索