记录下学习agent应用开发的第九天(agent可视化界面)
各位访问大哥能否留一些宝贵建议给小弟没人的话就当个人日常blog我结合前面学过的知识给agent补充了一些功能流式输出、历史会话保存和读取、滑窗裁剪并仿照之前做过的网页版聊天机器人利用Streamlit给agent包装了一个web。因为本项目架构的各个功能模块都是参照之前做过的demo下面就仅做简单介绍不深入解释。第一部分是初始化内容包括接入模型api和接口网址、加载 Embedding 模型将文本转为向量、加载 token 计数器计算会话消耗的token、设置安全阈值token超出就触发滑窗裁剪、设置文件保存路径和连接 ChromaDB 向量数据库。root Path(__file__).parent.parent load_dotenv(root / .env) client OpenAI( api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(DEEPSEEK_BASE_URL), ) emb_model SentenceTransformer(paraphrase-multilingual-MiniLM-L12-v2) encoder tiktoken.get_encoding(cl100k_base) MAX_TOKENS 100_000 SAVE_DIR Path(__file__).parent / agent_output HISTORY_FILE Path(__file__).parent / chat_history.json # ChromaDB chroma_client chromadb.PersistentClient(pathstr(Path(__file__).parent / chroma_db)) collection chroma_client.get_or_create_collection(nameknowledge_base)第二部分是工具编写包括工具函数定义、工具描述TOOLS和系统提示词system prompt。def load_knowledge(): if collection.count() 0: return know_file Path(__file__).parent / python_knowledge.txt with open(know_file, r, encodingutf-8) as f: text f.read() chunks [s.strip() 。 for s in text.split(。) if s.strip()] embeddings emb_model.encode(chunks).tolist() collection.add( ids[fchunk_{i} for i in range(len(chunks))], embeddingsembeddings, documentschunks, ) def search_knowledge(query: str) - str: results collection.query( query_embeddingsemb_model.encode([query]).tolist(), n_results3 ) if not results[documents][0]: return 未找到相关内容 return \n.join([f- {doc} for doc in results[documents][0]]) def calculator(expression: str) - str: allowed set(0123456789-*/.() ) if not all(c in allowed for c in expression): return f错误表达式包含不允许的字符 try: return str(eval(expression)) except Exception as e: return f计算错误{e} def save_file(filename: str, content: str) - str: SAVE_DIR.mkdir(exist_okTrue) filepath SAVE_DIR / filename with open(filepath, w, encodingutf-8) as f: f.write(content) return f文件已保存{filepath} TOOLS [ { type: function, function: { name: search_knowledge, description: 在 Python 知识库中搜索相关内容。当用户问 Python 相关的技术问题时使用, parameters: { type: object, properties: { query: {type: string, description: 搜索关键词或问题} }, required: [query] } } }, { type: function, function: { name: calculator, description: 执行数学计算。当需要做算术运算时使用, parameters: { type: object, properties: { expression: {type: string, description: 数学表达式如 35*2} }, required: [expression] } } }, { type: function, function: { name: save_file, description: 将内容保存为文件。当用户要求保存、导出、记录内容时使用, parameters: { type: object, properties: { filename: {type: string, description: 文件名如 summary.txt}, content: {type: string, description: 要保存的内容} }, required: [filename, content] } } } ] SYSTEM_PROMPT 你是小码一个智能助手。你可以使用工具完成任务 - search_knowledge: 搜索 Python 知识库 - calculator: 执行数学计算 - save_file: 保存内容为文件 工作方式逐步调用工具每步观察结果完成后向用户汇报。 规则用中文回答简洁清晰。任务完成后输出总结不要反复调同一个工具。第三部分是会话处理包含读取历史会话、保存会话内容、计算会话总消耗token和滑窗裁剪。def load_history() - list: if HISTORY_FILE.exists(): with open(HISTORY_FILE, r, encodingutf-8) as f: return json.load(f) return [] def save_history(history: list): with open(HISTORY_FILE, w, encodingutf-8) as f: json.dump(history, f, ensure_asciiFalse, indent2) def count_tokens(messages: list) - int: total 0 for msg in messages: total len(encoder.encode(msg.get(content, ) or )) return total def trim_history(history: list) - list: while len(history) 2 and count_tokens(history) MAX_TOKENS: history history[2:] return history第四部分是基于Function Calling的react循环是agent最核心的部分同时实现流式输出功能。def run_agent(user_query: str, history: list, status_container, placeholderNone) - str: Agent 主循环。placeholder 用于流式展示最终回答。 messages [ {role: system, content: SYSTEM_PROMPT}, ] history [ {role: user, content: user_query}, ] step 0 while step 10: step 1 response client.chat.completions.create( modeldeepseek-v3.2, messagesmessages, toolsTOOLS, tool_choiceauto, ) msg response.choices[0].message if msg.tool_calls: for tool_call in msg.tool_calls: func_name tool_call.function.name func_args json.loads(tool_call.function.arguments) status_container.write(f 第 {step} 步调用 {func_name}({func_args})) if func_name search_knowledge: result search_knowledge(**func_args) elif func_name calculator: result calculator(**func_args) elif func_name save_file: result save_file(**func_args) else: result f未知工具: {func_name} messages.append({ role: assistant, content: None, tool_calls: [tool_call] }) messages.append({ role: tool, tool_call_id: tool_call.id, content: result, }) else: # 流式输出 if placeholder: stream client.chat.completions.create( modeldeepseek-v3.2, messagesmessages, streamTrue, ) full for chunk in stream: content chunk.choices[0].delta.content if content: full content placeholder.markdown(full) # 逐字刷新 return full return msg.content or 任务已完成 return 任务未在限定步数内完成请简化任务重试。第五部分是通过Streamlit实现界面化。st.set_page_config(page_title小码 Agent, page_icon, layoutwide) st.title( 小码 Agent) st.caption(多工具自主智能助手 — 查知识库 · 做计算 · 存文件) # 初始化知识库 load_knowledge() # 初始化会话状态 if conversation_history not in st.session_state: st.session_state.conversation_history load_history() history st.session_state.conversation_history # 侧边栏 with st.sidebar: st.header( 状态) st.metric(知识库段落, collection.count()) st.metric(对话轮数, len(history) // 2) token_count count_tokens(history) st.metric(Token 用量, f{token_count} / {MAX_TOKENS}) st.metric(保存的文件, len(list(SAVE_DIR.glob(*))) if SAVE_DIR.exists() else 0) st.divider() if st.button(️ 清空对话记忆): st.session_state.conversation_history [] save_history([]) st.rerun() # 显示历史消息 for msg in history: with st.chat_message(msg[role]): st.markdown(msg[content]) # 用户输入 if user_input : st.chat_input(输入你的任务...): # 显示用户消息 with st.chat_message(user): st.markdown(user_input)外部知识库内容如下Python 是一门解释型、面向对象的高级编程语言。 Python 由 Guido van Rossum 在 1989 年圣诞节期间开始设计1991 年首次发布。 Python 的名字来源于 Guido 喜爱的 BBC 电视节目《蒙提·派森的飞行马戏团》。 Python 的设计哲学强调代码可读性使用缩进来表示代码块而不是花括号。 Python 2.0 于 2000 年发布引入了列表推导式、垃圾回收机制。 Python 3.0 于 2008 年发布是一次不向后兼容的大版本更新。 Python 3.0 的主要变化包括print 变为函数、整数除法返回浮点数、Unicode 成为默认字符串类型。 Python 2.7 是 Python 2 系列的最后一个版本官方支持于 2020 年 1 月 1 日终止。 pip 是 Python 的包管理工具用于安装和管理第三方库。 Python 的标准库非常丰富涵盖文件操作、网络通信、正则表达式、JSON 处理等。 Python 最流行的 Web 框架包括 Django、Flask 和 FastAPI。 Python 在数据科学领域的主要库包括 NumPy、Pandas 和 Matplotlib。 Python 在机器学习领域的主要库包括 Scikit-learn、TensorFlow 和 PyTorch。 Python 的变量不需要声明类型是动态类型语言。 Python 支持多种编程范式包括面向对象、函数式和过程式编程。 Python 使用 GIL全局解释器锁来保证线程安全但这限制了多线程的并行性能。 Python 3.12 引入了子解释器为绕过 GIL 提供了新的可能性。测试网页版agent功能RAG向量检索测试网页版agent功能数字计算测试网页版agent功能内容保存测试询问知识库外的内容测试上下文关联以上测试结果均通过。总结今天给agent包装了一个网页因为网页端比终端界面更美观且更方便使用同时补充了流式输出、历史会话保存和读取、滑窗裁剪等功能。做到这里算是完成一次完整的agent应用开发只是功能还不是那么强大技术也算不上成熟。后面我会进一步学习来完善争取做个满意的版本上传github。第九天就到这吧。

相关新闻

贝叶斯决策阈值:让分类模型真正理解业务成本

贝叶斯决策阈值:让分类模型真正理解业务成本

1. 为什么“一刀切”的0.5阈值在真实场景中常常失效?在实际项目里,我经手过二十多个分类模型落地案例,从医疗影像辅助诊断到金融信贷风控,再到工业设备故障预警,几乎每个项目都会卡在同一个地方:模型输出一…

2026/7/20 10:22:59阅读更多 →
AI模型定价策略:从奢侈品经济学看技术溢价

AI模型定价策略:从奢侈品经济学看技术溢价

1. 从奢侈品经济学看AI模型定价策略最近在技术社区看到个有趣的观点:德银分析师将前沿AI模型比作奢侈品包包,认为其定价逻辑与传统开源模型存在本质差异。这个类比确实戳中了当前AI行业的痛点——为什么同样功能的模型,价格能差出几个数量级&…

2026/7/20 10:22:59阅读更多 →
机器人软件开发中的关键领域:时间最优运动规划深度解析

机器人软件开发中的关键领域:时间最优运动规划深度解析

在当今机器人技术飞速发展的时代,运动规划作为核心组成部分,直接影响机器人的智能化水平和执行效率。特别是在工业自动化和服务型机器人领域,如何在保证安全性和精度要求的同时,最大限度地减少运动时间,成为开发者关注的焦点。本文将聚焦于时间最优运动规划(Time-Optimal…

2026/7/20 10:22:59阅读更多 →
C++多层分支结构:if-else if与switch-case的实战应用与优化

C++多层分支结构:if-else if与switch-case的实战应用与优化

1. 从“如果”到“迷宫”:理解多层分支的逻辑本质很多刚接触C的朋友,在学完简单的if-else后,会觉得程序逻辑已经尽在掌握。直到你面对一个现实问题:根据用户的会员等级(普通、白银、黄金、钻石)和本次消费金…

2026/7/21 4:46:34阅读更多 →
2026年Python自动化生态全景与实战技巧

2026年Python自动化生态全景与实战技巧

1. 2026年Python自动化生态全景扫描在自动化技术持续渗透各行业的当下,Python凭借其简洁语法和丰富生态成为自动化领域的首选语言。根据2025年Stack Overflow开发者调查报告,Python在自动化脚本领域的采用率已达67%,较2020年增长近40个百分点…

2026/7/21 4:46:34阅读更多 →
C++17结构化绑定引用:性能优化与生命周期管理实战解析

C++17结构化绑定引用:性能优化与生命周期管理实战解析

1. 项目概述:为什么结构化绑定引用值得深挖? 在C17标准引入的诸多特性里,结构化绑定(Structured Binding)因其简洁的语法糖特性,迅速成为处理元组、数组和结构体的“明星”功能。但很多开发者,包…

2026/7/21 4:46:34阅读更多 →
C++ bitset set与reset深度剖析:从内存布局到指令优化的完整指南

C++ bitset set与reset深度剖析:从内存布局到指令优化的完整指南

1. 项目概述:为什么需要深究bitset的set与reset?在C的日常开发中,std::bitset是一个看似简单、实则暗藏玄机的工具。很多开发者,尤其是刚接触C的朋友,常常把它当作一个“高级的布尔数组”来用——无非就是set()一下置位…

2026/7/21 4:46:34阅读更多 →
AI短剧分镜脚本写作:结构化指令与参数化技巧

AI短剧分镜脚本写作:结构化指令与参数化技巧

1. AI短剧分镜脚本的核心价值在传统影视制作中,分镜脚本需要美术人员手绘数十张场景示意图,一个5分钟短剧至少需要3天制作周期。而AI工具如OpenCreator已经实现输入文字自动生成分镜图,将制作时间压缩到10分钟以内。但关键在于:AI…

2026/7/21 4:46:34阅读更多 →
高效记忆英语短语的277个核心方法与工具

高效记忆英语短语的277个核心方法与工具

1. 英语短语记忆痛点与解决方案背英语短语对大多数学习者来说都是个头疼的问题。我自己在备考雅思的时候也深有体会,翻开任何一本短语手册,动辄就是上千个短语,看着就让人望而生畏。更糟的是,很多短语看起来很像,实际用…

2026/7/21 4:44:34阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/20 18:51:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/20 18:51:18阅读更多 →