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

资讯详情

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

双非 AI 求职备战 Day29-34:工程化!Streamlit 网页端,把 Agent 做成可演示项目

双非 AI 求职备战 Day29-34:工程化!Streamlit 网页端,把 Agent 做成可演示项目 双非AI求职备战 Day29-34工程化Streamlit网页端把Agent做成可演示项目前言前面所有代码都是命令行运行求职需要可以直接演示的成品项目。这阶段给Agent做网页界面重构代码结构规范项目目录。Streamlit 快速搭建Web聊天界面Streamlit用纯Python写网页不用前端JS几分钟就能做出浏览器聊天页面。项目可以本地打开也支持一键部署到公网给面试官直接在线演示。它很快不用刻意写循环啊记忆啊自己就实现的而且让我震惊的是它可以一键部署到公网。然后我发现有好多东西都可以一键部署到公网的我之前以为总得有一台服务器自己部署到服务器。我在这里列举几个Cloudflare Tunnel推荐免费不限速国内可访问一行命令 ngrok ngrok http 8000一键起隧道免费版带宽、连接有限域名随机国内访问偶尔不稳。 花生壳国内 1. GUI 图形界面小白友好国内访问稳定。免费版限速固定域名、大流量要付费适合国内答辩演示。 frp完全开源免费 需要你自己有一台 VPS 做服务端适合长期自用需要一点点配置不算纯 “一键开箱”。提交3117260 使用了streamlit在网页可以打开看自己的agent还可以部署在网上在终端输入streamlit run app.py即可运行这个项目项目源码importos os.environ[HF_HUB_OFFLINE]1os.environ[TRANSFORMERS_OFFLINE]1importstreamlitasstimportsqlite3importnumpyasnpimportfaissfromsentence_transformersimportSentenceTransformerfromtypingimportTypedDict,Annotatedfromlanggraph.graphimportStateGraph,START,ENDfromlanggraph.graph.messageimportadd_messagesfromlanggraph.prebuiltimportToolNodefromlanggraph.checkpoint.sqliteimportSqliteSaverfromlangchain_openaiimportChatOpenAIfromlangchain_core.toolsimporttoolfromlangchain_core.messagesimportHumanMessage# 加载 Agent只做一次 st.cache_resourcedefload_agent():# RAG 资源model_embedSentenceTransformer(BAAI/bge-small-zh-v1.5)indexfaiss.read_index(my_index.faiss)withopen(../my-agent/my_docs.txt,encodingutf-8)asf:documents[p.strip()forpinf.read().split(\n\n)ifp.strip()]# 工具tooldefsearch_my_docs(query:str)-str:搜索我的资料库。当用户问关于太原、山西的问题时使用。q_vectormodel_embed.encode(query).astype(float32)_,indicesindex.search(np.array([q_vector]),3)return\n.join(documents[i]foriinindices[0])tooldefget_weather(city:str)-str:查询指定城市的天气。参数 city 是城市名。returnf{city}今天晴天25度tools[search_my_docs,get_weather]# 状态classState(TypedDict):messages:Annotated[list,add_messages]# 模型modelChatOpenAI(modelglm-4-flash,api_keyad0e34a9b3b4486db1cac65af204ccbc.Y2FcPICz0Y1h48je,base_urlhttps://open.bigmodel.cn/api/paas/v4).bind_tools(tools)defllm_node(state:State):respmodel.invoke(state[messages])return{messages:[resp]}defshould_continue(state:State):returntoolsifstate[messages][-1].tool_callselseEND# 建图graphStateGraph(State)graph.add_node(llm,llm_node)graph.add_node(tools,ToolNode(tools))graph.add_edge(START,llm)graph.add_conditional_edges(llm,should_continue,{tools:tools,END:END})graph.add_edge(tools,llm)# 持久化记忆connsqlite3.connect(chat_memory.db,check_same_threadFalse)memorySqliteSaver(conn)appgraph.compile(checkpointermemory)returnapp# 网页界面 st.title(我的 Agent)appload_agent()# 网页版的记忆ifmessagesnotinst.session_state:st.session_state.messages[]# 显示历史formsginst.session_state.messages:st.chat_message(msg[role]).write(msg[content])# 输入框ifprompt:st.chat_input(问点什么):# 显示用户消息st.session_state.messages.append({role:user,content:prompt})st.chat_message(user).write(prompt)# 调 Agentresultapp.invoke({messages:[HumanMessage(contentprompt)]},config{configurable:{thread_id:user_1}})answerresult[messages][-1].content# 显示 Agent 回复st.session_state.messages.append({role:assistant,content:answer})st.chat_message(assistant).write(answer)阶段收获从脚本玩具升级成工程化可展示项目。求职作品集核心要点能跑、能演示、代码整洁、上传GitHub。
返回列表