尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

DeepSeek-R1 本地部署实战:用 Ollama 与 Chainlit 搭建 100% 本地运行的 ChatGPT 替代应用

DeepSeek-R1 本地部署实战:用 Ollama 与 Chainlit 搭建 100% 本地运行的 ChatGPT 替代应用 DeepSeek-R1 本地部署实战用 Ollama 与 Chainlit 搭建 100% 本地运行的 ChatGPT 替代应用【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub在 ai-engineering-hub 仓库的local-chatgpt with DeepSeek项目中作者给出了一条把 DeepSeek-R1 推理大模型真正跑在你自己机器上的完整技术路径模型权重由 Ollama 本地托管、Web 聊天界面由 Chainlit 驱动、Python 侧通过官方ollama库完成流式调用全程不依赖任何云端 API。读完本文你将掌握从安装 Ollama、拉取 DeepSeek-R1到逐行理解 Chainlit 回调式对话实现、并用 notebook 验证多轮推理效果的完整实战能力。项目概览为什么是“Ollama DeepSeek-R1 Chainlit”三件套从 README.md 的定位描述看该项目要解决的核心诉求是把 ChatGPT 式的对话体验以 100% 本地100% locally running的方式复刻出来。它选取的三个组件各司其职组件在项目中的职责Ollama大模型运行时负责在本地加载并执行 DeepSeek-R1对外提供ollama调用入口DeepSeek-R1对话与推理大脑承担实际的问答生成属于开源推理Reasoning类模型Chainlit前端对话框架提供类似 ChatGPT 的流式消息界面以及会话/步骤管理机制这套组合的直接收益是数据与隐私可控、无需申请云端 API Key、不产生按 token 计费且换模型 换一条ollama pull命令后续想迁移到其他开源模型成本极低。仓库内还提供了一段真实运行的演示录像 deepseek-chatgpt.mp4可以在配置完成后对照效果。第一步环境准备与依赖安装1.1 安装 Ollama 并拉取 DeepSeek-R1原文档给出了 Linux 环境下一键安装脚本与模型拉取命令# setup ollama on linux curl -fsSL https://ollama.com/install.sh | sh # pull the DeepSeek-R1 model ollama pull deepseek-r1两点实操提示ollama pull deepseek-r1未带标签tag会拉取该模型在 Ollama 模型库中默认的量化版本安装完成后可用ollama list查看本机已缓存模型及其实际占用确认拉取成功。安装完成后 Ollama 会以后台服务形式常驻首次执行对话时模型需要加载到内存后续请求会明显变快——这一点在后面 notebook 的运行指标中可以得到印证。1.2 安装 Python 依赖原文档明确要求Python 3.11 或更高版本随后安装三个依赖pip install pydantic2.10.1 chainlit ollamachainlit提供 Web 对话 UI 与事件回调 APIollamaPython 侧访问本地 Ollama 服务的官方客户端核心函数是ollama.chat(...)pydantic2.10.1被固定到精确版本以保证与当前 Chainlit 生态的兼容性避免因 pydantic 大版本 API 差异导致运行时类型校验报错。建议照原样锁定安装。第二步逐行拆解核心对话实现 app.py项目真正的大脑是 app.py全文只有几十行却完整实现了初始化、工具步骤、流式回复、多轮记忆四件事。下面先给出完整代码再分段说明import chainlit as cl import ollama cl.on_chat_start async def start_chat(): cl.user_session.set( interaction, [ { role: system, content: You are a helpful assistant., } ], ) msg cl.Message(content) start_message Hello, Im your 100% local alternative to ChatGPT running on DeepSeek-R1. How can I help you today? for token in start_message: await msg.stream_token(token) await msg.send() cl.step(typetool) async def tool(input_message): interaction cl.user_session.get(interaction) interaction.append({role: user, content: input_message}) response ollama.chat(modeldeepseek-r1, messagesinteraction) interaction.append({role: assistant, content: response.message.content}) return response cl.on_message async def main(message: cl.Message): tool_res await tool(message.content) msg cl.Message(content) for token in tool_res.message.content: await msg.stream_token(token) await msg.send()2.1 会话开始注入 System Prompt 与流式欢迎语cl.on_chat_start装饰的回调在每个新会话建立时触发一次。它做了两件事用cl.user_session.set(interaction, [...])在会话级内存里初始化一份system角色的系统提示词You are a helpful assistant.。这份interaction列表就是整个多轮对话的历史缓冲区贯穿整个会话生命周期。构造一个空的cl.Message然后通过await msg.stream_token(token)逐字符把欢迎语推送到前端最后await msg.send()落屏从而在界面上模拟出打字机式的欢迎效果。从 app.py 可以看到欢迎语明确点出自称 100% local alternative to ChatGPT running on DeepSeek-R1与项目定位完全一致。2.2 工具步骤把每次提问并入历史再交给模型tool(input_message)被cl.step(typetool)装饰这会让 Chainlit 在对话界面中把该函数渲染成一个可折叠的工具步骤用户能直观看到模型调用发生的过程而不是黑盒一闪而过。它的内部逻辑见 app.py是典型的两段式追加interaction.append({role: user, content: input_message}) # 追加用户提问 response ollama.chat(modeldeepseek-r1, messagesinteraction) # 携带完整历史调用模型 interaction.append({role: assistant, content: response.message.content}) # 追加模型回答注意ollama.chat的第二个参数传的是累积后的完整interaction列表而不是只有当前这一条消息。这正是该应用能记住上下文、支持多轮连续对话的关键模型每次都能看到此前全部的用户消息与自己的回答。DeepSeek-R1 在这里扮演标准的 OpenAI Chat Completions 风格角色response.message.content保存最终生成的文本。2.3 收到消息模型出词后逐字流式上屏cl.on_message是每次用户发消息时的入口见 app.py。它先await tool(message.content)拿到完整回复再构造一个新的cl.Message并对回复内容逐字符执行stream_token后发送到界面。一个值得理解的实现细节本项目的流式发生在Chainlit 展示层——ollama.chat(...)本身是阻塞式地等模型生成完整结果拿到content后才由前端按字符流式打印。这与通过streamTrue让 Ollama 逐 token 吐出文本的真流式不同。其好处是逻辑简单、状态易维护代价是首字延迟等于模型整体生成时间在推理类长输出场景下等待感会更明显。想进一步优化可以在ollama.chat中开启流式并把生成器接入stream_token。第三步用 notebook 验证 DeepSeek-R1 的本地推理表现项目内的 notebook.ipynb 不依赖 Chainlit 界面直接用ollama库对本地模型做裸调用是验证模型是否就绪、观察其推理行为的最快途径。3.1 基础对话调用第一个 cell 演示了最小可用的调用形式import ollama response ollama.chat(modeldeepseek-r1, messages[{role: user, content: Hello, how are you?}]) print(response)其运行输出中值得关注的是结构化返回字段这正是 notebook 为开发者留下的体检报告modeldeepseek-r1 created_at2025-01-24T09:17:46.91998Z doneTrue done_reasonstop total_duration5721435416 load_duration31235125 prompt_eval_count9 prompt_eval_duration4015000000 eval_count45 eval_duration1673000000done_reasonstop模型按正常终止符结束没有触发长度截断prompt_eval_count/eval_count分别统计了提示词与生成部分的 token 数load_duration仅为数十毫秒量级说明该 notebook 运行于模型已加载就绪的状态下total_duration等时间指标为该运行时刻的观测值仅用于理解处理流程不代表固定的性能承诺。3.2 观察 R1 的思考过程Reasoning 特性第二个 cell 抛出了一个需要逻辑推断的脑筋急转弯式问题import ollama response ollama.chat(modeldeepseek-r1, messages[{role: user, content: if 113, 4510, what is 58?}]) print(response)DeepSeek-R1 属于推理型Reasoning模型其响应文本中会先出现以think包裹的内部思考过程再给出answer性质的形式化推导与最终结论。在该 notebook 记录的输出中模型完整执行了标准加法不符 → 尝试字符串拼接 → 尝试进制解释 → 回归标准加法假设 → 给出 13的推理链并对每一步做出文字化推演后才输出最终结果对应输出中 940 个 eval token、数十秒生成时长的观测数据也是推理型模型想得久、答得稳的直观体现。这个特征同样会呈现在 Chainlit 界面中R1 的思考内容与正式回答都会以流式文本展示给用户。如果你不希望把原始思考链暴露给最终用户可以在展示层对think.../think片段做过滤或折叠属于工程化收尾工作。第四步启动应用并开始对话依赖装好、模型就绪后一条命令即可拉起应用chainlit run app.py -wchainlit run app.py告诉 Chainlit 加载 app.py 并启动对话服务-w开启 watch热重载模式修改app.py后服务会自动重启便于边改边调试。启动完成后按终端提示的地址在浏览器打开对话界面即可使用。对照演示录像 deepseek-chatgpt.mp4你可以逐轮追问、验证多轮记忆是否生效并观察tool步骤在界面中的展示效果。运行前提与注意事项综合 README、源码与 notebook 输出实际部署时有几点需要心里有数硬件与模型体积DeepSeek-R1 需要完整加载到本地内存/显存后才能提供可交互的响应速度首次对话或模型冷启动时延迟会明显高于后续。默认拉取的量化版本在参数规模上已做了取舍具体资源占用请以你本机ollama list显示为准。Python 版本README 明确要求 Python 3.11低于该版本可能无法正常安装或运行 Chainlit。版本锁定pydantic2.10.1的精确固定不是随手为之升级前请先验证与 Chainlit 的兼容性避免隐性 break。数据范围从实现看模型调用全部指向本地 Ollama 服务聊天记录仅保存在应用进程内的cl.user_session中——这意味着关闭会话后历史即释放若需要长期持久化需要在现有interaction结构上自行接入存储。ollama.chat默认非流式当前版本是先生成完整结果、再逐字渲染若追求更低的感知延迟可自行改造为流式生成。延伸同一思路的模型替换由于架构完全解耦这套Chainlit 界面 ollama 本地模型的组合天然支持换模型。ai-engineering-hub 仓库中还提供了结构一致的姊妹项目 local-chatgpt with Gemma 3核心差别仅在拉取的模型与ollama.chat(model...)参数上。参考对比即可理解把 DeepSeek-R1 换成任意 Ollama 支持的模型通常只涉及ollama pull与一处 model 名改动这正是本地大模型应用方案在选型上的最大灵活性所在。【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表