【学习记录】DeepSeek 代码助手FastAPI 后端 Streamlit 前端完整实现在上一篇文章中我们展示了如何将 DeepSeek 大模型封装为 FastAPI 服务。今天我们为其打造一个友好的 Web 界面——DeepSeek 代码助手。用户可以通过浏览器输入编程问题系统调用后端 DeepSeek 模型生成代码或解答并以高亮代码块的形式展示。本文详细讲解前后端代码、运行方法、原理及注意事项帮助你快速搭建属于自己的 AI 编程助手。 目录项目概览后端实现FastAPI DeepSeek2.1 依赖安装与配置2.2 代码详解前端实现Streamlit 界面3.1 页面布局与组件3.2 调用后端 API3.3 结果展示与错误处理运行指南4.1 启动后端服务4.2 启动前端界面4.3 测试效果注意事项与优化建议总结一、项目概览本系统由两部分组成组件技术栈职责后端 APIFastAPI LlamaIndex DeepSeek接收用户问题及系统提示词调用 DeepSeek 模型生成回答前端 UIStreamlit提供 Web 交互界面发送请求并展示模型返回的代码/文本工作流程用户在 Streamlit 界面输入问题可附带系统提示词。前端向 FastAPI 后端发送 HTTP POST 请求。后端调用 DeepSeek 模型返回生成的回答。前端将回答以代码块形式展示并显示模型信息。二、后端实现FastAPI DeepSeek2.1 依赖安装创建虚拟环境并安装以下包pipinstallfastapi uvicorn llama-index-core llama-index-llms-deepseek2.2 完整代码app.pyimportosimportloggingfromfastapiimportFastAPI,HTTPExceptionfrompydanticimportBaseModel,Fieldfromllama_index.llms.deepseekimportDeepSeekfromllama_index.core.llmsimportChatMessage# 日志配置logging.basicConfig(levellogging.INFO)loggerlogging.getLogger(__name__)# DeepSeek 配置请勿硬编码生产环境使用环境变量DEEPSEEK_API_KEYsk-xxxxxxxxxxxx# 替换为你的真实 KeyDEFAULT_MODELdeepseek-chatllmDeepSeek(modelDEFAULT_MODEL,api_keyDEEPSEEK_API_KEY,temperature0.3,max_tokens2048,timeout60.0,)# 请求/响应模型classGenerateRequest(BaseModel):prompt:strField(...,description用户输入的提示词)system_prompt:str|NoneField(None,description可选的系统提示词)classGenerateResponse(BaseModel):response:strmodel:str# FastAPI 应用appFastAPI(titleDeepSeek LLM API)app.get(/health)asyncdefhealth():return{status:ok,model:DEFAULT_MODEL}app.post(/generate,response_modelGenerateResponse)asyncdefgenerate_text(request:GenerateRequest):try:messages[]ifrequest.system_prompt:messages.append(ChatMessage(rolesystem,contentrequest.system_prompt))messages.append(ChatMessage(roleuser,contentrequest.prompt))responsellm.chat(messages)answerresponse.message.contentreturnGenerateResponse(responseanswer,modelDEFAULT_MODEL)exceptExceptionase:logger.error(f推理失败:{str(e)},exc_infoTrue)raiseHTTPException(status_code500,detailf模型推理失败:{str(e)})代码要点使用DeepSeek类初始化模型配置temperature控制随机性、max_tokens输出长度、timeout超时。ChatMessage支持多轮对话这里构造了可选的system消息和必填的user消息。/generate端点接收 JSON 格式的请求返回模型生成的文本。统一异常处理避免将内部错误直接暴露给客户端。⚠️安全警告API Key 硬编码在代码中是严重的安全隐患。生产环境请使用环境变量如os.getenv(DEEPSEEK_API_KEY)或密钥管理服务。三、前端实现Streamlit 界面3.1 依赖安装pipinstallstreamlit requests3.2 完整代码ui.pyimportstreamlitasstimportrequestsimportjson# ---------- 页面配置 ----------st.set_page_config(page_titleDeepSeek 代码助手,page_icon,layoutcentered)st.title( DeepSeek 代码助手)st.markdown(基于 DeepSeek 模型专注代码生成与解答)# ---------- 侧边栏配置 ----------withst.sidebar:st.header(⚙️ 设置)backend_urlst.text_input(后端 API 地址,valuehttp://localhost:8000)system_promptst.text_area(系统提示词可选,value你是一个严谨的代码助手只输出代码和简洁注释不要额外解释。,help设定模型行为风格)st.markdown(---)st.markdown(### 使用说明)st.markdown(1. 在下方输入你的编程问题)st.markdown(2. 点击「生成回答」按钮)st.markdown(3. 等待模型返回代码或解答)# ---------- 主区域 ----------st.header( 问题输入)user_promptst.text_area(请输入你的问题,height150,placeholder例如用Python写一个计算斐波那契数列的函数,keyprompt_input)col1,col2st.columns([1,5])withcol1:submitst.button( 生成回答,typeprimary,use_container_widthTrue)# ---------- 结果展示区 ----------ifsubmit:ifnotuser_prompt.strip():st.warning(⚠️ 请输入问题内容)st.stop()api_endpointf{backend_url.rstrip(/)}/generatepayload{prompt:user_prompt,system_prompt:system_promptifsystem_prompt.strip()elseNone}withst.spinner( DeepSeek 正在思考中请稍候...):try:responserequests.post(api_endpoint,jsonpayload,headers{Content-Type:application/json},timeout60)response.raise_for_status()resultresponse.json()st.success(✅ 生成成功)st.subheader( 回答内容)# 使用代码块展示如果是代码会自动高亮st.code(result[response],languagepythonifpythoninresult[response].lower()elsetext)st.caption(f模型{result[model]})st.info( 提示点击代码块右上角的复制图标可直接复制代码)exceptrequests.exceptions.ConnectionError:st.error(f❌ 无法连接到后端服务请确认后端已启动且地址正确{backend_url})st.info(启动后端命令uvicorn app:app --host 0.0.0.0 --port 8000)exceptrequests.exceptions.Timeout:st.error(⏰ 请求超时请稍后重试或检查模型响应时间)exceptrequests.exceptions.HTTPErrorase:st.error(f❌ 后端返回错误{e}\n{response.text})exceptjson.JSONDecodeError:st.error(❌ 解析响应失败后端可能返回了非 JSON 内容)exceptExceptionase:st.error(f❌ 未知错误{str(e)})st.markdown(---)st.markdown( 提示如果生成内容不全可尝试在侧边栏修改系统提示词或检查后端 max_tokens 设置。)前端要点侧边栏配置允许用户修改后端 API 地址和系统提示词增强灵活性。错误处理覆盖连接失败、超时、HTTP 错误、JSON 解析错误等常见情况给出友好提示。结果展示使用st.code自动识别代码语言简单判断是否包含“python”支持复制功能。用户体验提交时显示加载动画st.spinner成功/失败有明确的状态反馈。四、运行指南4.1 启动后端服务在终端中执行# 设置 API KeyLinux/macOSexportDEEPSEEK_API_KEYsk-xxxxxxxxxxxx# 或 Windows (cmd)setDEEPSEEK_API_KEYsk-xxxxxxxxxxxx# 启动 FastAPI 服务uvicorn app:app--host0.0.0.0--port8000--reload看到类似输出表示成功INFO: Uvicorn running on http://0.0.0.0:8000 INFO: Application startup complete.4.2 启动前端界面打开另一个终端运行streamlit run ui.py浏览器将自动打开http://localhost:8501。4.3 测试效果在 Streamlit 界面的输入框中输入问题例如用Python写一个快速排序函数。点击「生成回答」按钮。稍等片刻后端返回的代码会显示在代码块中并标注模型名称。—五、注意事项与优化建议方面注意事项优化建议API Key 安全代码中硬编码了 Key有泄露风险使用环境变量os.getenv(DEEPSEEK_API_KEY)生产环境使用密钥管理服务CORS 问题前端和后端可能端口不同但 Streamlit 默认请求后端时属于跨域实际上 Streamlit 是客户端发送请求到后端不涉及浏览器跨域限制。无需额外配置。若前端部署在独立域名后端需启用CORSMiddleware。请求超时模型生成较长内容可能超过 60 秒可适当调高timeout参数或改为异步任务队列并发处理FastAPI 的同步llm.chat会阻塞事件循环使用asyncio.to_thread将同步调用放入线程池或改用 DeepSeek 的异步 API如果提供前端代码高亮当前仅通过判断字符串中是否含“python”来决定高亮语言可根据返回代码块中的语言标记如python更精确高亮也可使用pygments库对话历史当前仅支持单轮对话扩展前端维护messages历史并通过 API 传递完整的对话列表六、总结通过本文我们构建了一个完整的DeepSeek 代码助手包括✅ 基于 FastAPI 的模型调用后端支持系统提示词和用户问题。✅ 基于 Streamlit 的 Web 前端提供直观的交互界面。✅ 完善的错误处理和用户提示提升可用性。✅ 清晰的代码注释和运行指南方便二次开发。你可以将此系统部署在个人服务器上作为团队内部的 AI 编程辅助工具。后续还可以扩展支持多轮对话保存历史消息。集成代码执行环境如 Jupyter 内核。添加用户认证与计费功能。希望这篇文章能帮助你快速搭建自己的大模型应用。如果在实践过程中遇到问题欢迎在评论区留言交流。