十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

GPT-OSS 本地推理 + 思考过程可视化:gpt-oss-thinking-ui 聊天应用实战指南

GPT-OSS 本地推理 + 思考过程可视化:gpt-oss-thinking-ui 聊天应用实战指南 GPT-OSS 本地推理 思考过程可视化gpt-oss-thinking-ui 聊天应用实战指南【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub本指南围绕本仓库gpt-oss-thinking-ui子项目展开讲解如何用 Ollama 在本地运行 GPT-OSS:20B并通过 Streamlit 构建一个能“看见模型思考过程”的对话界面。阅读并动手复现后你将掌握 Ollama Python 客户端的流式thinking通道解析、Streamlit 会话级聊天历史维护以及将模型推理过程折叠展示的完整实现方案。项目定位让开源推理模型在本机“边想边说”gpt-oss-thinking-ui是一个典型的“本地大模型 思考可视化”演示工程其核心思路可以概括为100% 本地运行模型由 Ollama 托管于本机gpt-oss:20b对话数据默认不经过云端 API也不产生按 token 计费的费用看得见的推理界面用可展开的面板呈现模型的思考内容正文与思维链分层展示流式响应底层通过 Ollama 的流式接口逐块接收内容避免长时间静默等待完整历史st.session_state中保存整段会话包括每次回复附带的思考内容刷新式重放历史时思考面板依然保留。项目的安装与运行说明、环境要求见 gpt-oss-thinking-ui/README.md全部界面逻辑集中在 gpt-oss-thinking-ui/app.py依赖声明见 gpt-oss-thinking-ui/pyproject.toml。安装与运行环境前置要求原文档明确了两个运行前提二者缺一不可Python 3.12 或更高版本——pyproject.toml中requires-python 3.12包管理器uv官方推荐或pip。第一步安装 Ollama 并拉取模型# 通过 Ollama 官方安装脚本安装Linux/macOS curl -fsSL https://ollama.com/install.sh | sh # 拉取 GPT-OSS 20B 模型 ollama pull gpt-oss:20b从源码看app.py 中get_chat_model()固定请求modelgpt-oss:20b因此必须先完成上述ollama pull否则运行时 Ollama 会报模型不存在。模型体积较大首次拉取取决于网络与磁盘空间。第二步安装 Python 依赖项目采用 pyproject 风格管理依赖两种方式任选其一# 方式一uv推荐按 pyproject.toml 与 uv.lock 精确还原环境 uv sync # 方式二pip 手动安装两个核心依赖 pip install streamlit ollamapyproject.toml声明的依赖版本底线为依赖版本约束作用ollama0.5.1Python 客户端负责调用本地 Ollama 服务并支持流式thinking通道streamlit1.47.1Web 应用框架提供聊天组件、会话状态与可展开面板第三步启动应用# uv 环境 uv run streamlit run app.py # 或 pip 环境 streamlit run app.py启动后浏览器默认访问http://localhost:8501若 8501 被占用Streamlit 会自动顺延到 8502终端会打印实际地址。整体数据流从提问到“思考 回答”结合 app.py 的函数划分一次完整交互的调用链为用户输入 → handle_user_input() 写入 session_state → get_chat_model() 构造 Ollama chat(model, streamTrue, thinkTrue) → 流式返回 chunk → process_thinking_stream() 分别累积 thinking 与 content → display_assistant_message() 折叠展示思考 正文 → 整条回复含 thinking 字段回写 session_state其中thinkTrue是打开“思维链通道”的关键开关在 get_chat_model() 中通过缓存工厂返回的匿名函数统一传入使每个流式数据块中可能同时携带推理文本与最终回答文本。核心实现逐段解析1. 思考内容的流式分流process_thinking_stream()def process_thinking_stream(stream): Process streaming response with native thinking support. thinking_content response_content with st.status(Thinking..., expandedTrue) as status: for chunk in stream: # Handle thinking content if chunk[message].get(thinking): thinking_content chunk[message][thinking] # Handle response content if chunk[message].get(content): response_content chunk[message][content] # Update status when done if thinking_content: status.update(labelThinking complete!, statecomplete, expandedFalse) return thinking_content, response_content这段代码揭示了 Ollama 流式响应的消息结构每个chunk[message]除content最终回答增量外还可能出现thinking字段推理增量。函数以两个独立缓冲区分别累积最后返回(thinking_content, response_content)二元组。界面交互上st.status(Thinking..., expandedTrue)会在思考期间展示一个展开的进度状态框思考结束后通过status.update(labelThinking complete!, statecomplete, expandedFalse)将其标记为完成并折叠——这正是用户观察“模型正在推理”的即时反馈来源。2. 思考内容的分层呈现display_assistant_message()def display_assistant_message(content, thinking_contentNone): # Display thinking content in expander if present if thinking_content and thinking_content.strip(): with st.expander( Thinking process, expandedFalse): st.markdown(thinking_content) # Display response content in the main chat area if content: st.markdown(content)这里实现了“思考与回答分离”的视觉范式思考文本放进默认收起的st.expander标题为 Thinking process而最终回答直接渲染在聊天主区域。既保留完整的思维链可供随时展开复查又不挤占正文的阅读空间。3. 带缓存的模型客户端get_chat_model()st.cache_resource def get_chat_model(): Get a cached instance of the chat model. return lambda messages: chat( modelgpt-oss:20b, messagesmessages, streamTrue, thinkTrue, )st.cache_resource保证整个应用生命周期内只创建一次模型调用闭包避免每次用户输入都重建连接资源返回的匿名函数接收完整messages历史并触发一次流式chat()调用。4. 会话状态与消息结构if messages not in st.session_state: st.session_state[messages] [ {role: system, content: You are a helpful assistant.} ]历史消息统一存放在st.session_state[messages]中其中assistant 消息是扩展结构{role: assistant, content: response_content, thinking: thinking_content}即在标准role/content之外额外保存了thinking字段。display_chat_history() 每次渲染含每次交互后的整页重跑都会遍历该列表先跳过system消息再按角色分别交给display_message()——assistant 消息会重新读取其thinking字段并折叠展示从而实现“刷新后思考过程依然可回溯”。需要注意的是一处从实现上可推断的行为差异README 强调 “Real-time Streaming”但当前代码在process_thinking_stream()中是累积式接收——流式分块持续写入缓冲区待思考结束后才整体渲染正文。因此从用户观感上思考阶段看到的是Thinking...状态框而回答文本是一次性呈现的。若要实现逐 token 打字的流式 UI可在该函数中用st.empty()占位并逐 chunkmarkdown刷新思路与本仓库内 deepseek-thinking-ui/app.py 的process_thinking_phase()先播放思考文本、再输出正文同源。5. 页面装配与品牌头图main()先通过st.set_page_config(page_titleOllama Streaming Chat, layoutcentered)设置页面标题与居中布局再读取 gpt-oss-thinking-ui/assets/openai.png 与 gpt-oss-thinking-ui/assets/ollama.png 并做base64.b64encode编码以data:image/png;base64,前缀内嵌渲染进标题栏 HTML构成 “GPT-OSS Chat With thinking UI” 的品牌化页面头。随后依次执行display_chat_history()回放历史与handle_user_input()等待新输入。使用体验与验证要点复现完成后可以按以下路径验证各模块是否按预期工作思考可视化向模型提出一道需要分步推理的问题观察先出现Thinking...状态完成后转为可展开的 “ Thinking process” 面板其中应包含逐步推理文本正文与会话隔离正文显示在面板之外二者内容互不混淆历史回溯切换浏览器标签再回来触发 Streamlit 重跑或滚动查看历史消息此前回复的思考面板仍可展开查看完全本地断网状态下对话仍可正常进行验证推理与回答均由本机 Ollama 完成。常见问题排查端口被占用8501 被其他进程占用时Streamlit 自动切换至 8502以终端输出的 URL 为准模型不存在报错确保已执行ollama pull gpt-oss:20b且本地服务正在运行ollama list可确认未返回 thinking 字段thinkTrue依赖较新版本的 Ollama 服务与 Python 客户端pyproject.toml 中ollama0.5.1请确认两者均已升级Python 版本过低项目要求 Python ≥ 3.12低版本可能无法解析依赖或语法。仓库内的同类参考实现“本地模型 思考可视化 UI”是本仓库的高频范式与gpt-oss-thinking-ui结构对标的实现还包括 deepseek-thinking-uiDeepSeek 推理流 思考播放与 qwen3-thinking-ui默认qwen3:4b。跨项目对比这些app.py的thinking分流与展开面板写法可以提炼出一套适用于任何 Ollama 推理模型支持原生思考的通用聊天 UI 模板。若需了解模型能力横向对比还可参考 gpt-oss-vs-qwen3 等评测工程。【免费下载链接】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),仅供参考
返回列表