- 博客(522)
- 收藏
- 关注
原创 LLM 对话记忆功能实现深度解析
本文档详细解析了如何为无状态的大型语言模型(LLM)实现对话记忆功能。通过分层架构设计,系统采用四步流程:API接收请求、加载历史记录、构建上下文和调用LLM。核心优化在于数据库层面的查询限制(使用limit参数)和业务逻辑层的参数化配置,有效避免了内存爆炸和性能问题。这种设计既保证了对话连贯性,又确保了系统的高效性和可维护性,为LLM提供了可靠的"记忆"能力。
2025-12-03 17:38:58
566
原创 SSE 流式输出与 Markdown 渲染实现详解
本文详细介绍了基于SSE技术实现类似ChatGPT流式对话功能的全过程。系统采用前后端分离架构:后端使用Python/FastAPI生成符合OpenAI标准的SSE数据流,将每个Token封装为JSON格式;前端通过TypeScript/Lit建立连接,逐行解析JSON数据并实时渲染Markdown内容。关键实现包括后端严格遵循SSE协议规范、前端缓冲区管理和行分割处理、状态累积更新机制以及Markdown实时渲染等。文章还强调了后端数据格式标准化的重要性,确保跨层协作的稳定性和流畅性,最终实现了低延迟、打
2025-12-02 02:04:30
1081
原创 GKE Gateway 30秒超时问题深度排查全纪录
摘要: GKE Gateway服务在处理长耗时请求时出现30秒超时中断问题,排查发现Kubernetes配置(HTTPRoute和BackendConfig)未生效。测试确认集群内部请求正常,问题出在外部负载均衡器。深入GCP底层资源发现BackendService和URL Map均保持默认30秒超时,手动修改BackendService无效。最终确认GKE控制器存在Bug,未正确应用Kubernetes配置,导致外部请求被强制中断。需进一步解决GKE控制器与GCP资源的同步问题。
2025-12-02 00:14:07
853
原创 Agent架构升级:解决Gemini超大Prompt处理问题
本文介绍了从initialize_agent升级到create_agent解决Gemini Agent处理大型代码PR时prompt过大的问题。旧架构存在token超限、处理失败等问题,而新架构采用LCEL数据流图,直接处理system prompt并智能管理token。关键改进包括:简化API调用、优化token管理、增强错误隔离能力。测试显示新架构可处理50+个文件(旧架构仅5-10个),并成功完成大型PR审查。配套优化还包括自定义Gemini模型改用REST协议、实现异步批处理接口等,显著提升了系统性
2025-11-30 14:51:03
621
原创 GKE Gateway超时问题排查指南
本文记录了在GKE托管Web服务中排查/chat接口超时问题的完整过程。最初发现长文本生成请求被截断,通过curl确认是HTTP/2 INTERNAL_ERROR。排查发现应用层设置300秒超时无异常,但HTTPRoute超时配置无效,GKE Gateway回退到默认短超时。最终采用GCPBackendPolicy方案,为后端服务设置300秒超时成功解决问题。关键教训包括:验证配置实际生效状态、优先参考云厂商特定文档、善用kubectl诊断工具。此次排查不仅解决了技术问题,更深化了对GKE Gateway工
2025-11-30 14:35:01
1007
原创 构建企业级 GitHub AI Code Review Agent 全指南
本文详细复盘了py-github-agent项目中Code Review Agent功能的构建过程。系统采用分层架构,通过API路由接收PR请求,由CodeReviewService驱动LangChain Agent执行审查任务。核心难点在于高效获取PR的全量信息,GitHub Service通过异步并发请求优化性能,支持获取文件变更前后的完整内容。系统采用ReAct模式运行,Agent通过工具调用GitHub API获取代码上下文,并交由LLM生成审查报告。文档不仅包含核心代码实现,还深入解析了设计决策与
2025-11-30 03:22:00
820
原创 Agent 与 MCP 的区别与关系
AI架构中的Agent与MCP对比 Agent是具备自主决策能力的智能系统("大脑"),负责推理、规划和执行任务。MCP则是标准化通信协议("神经系统"),专注于提供上下文和工具连接。关键区别在于:Agent是主动决策者,具有高级智能;MCP是被动接口,仅规范通信标准。两者协同工作时,Agent通过MCP发现和调用工具,专注于智能决策,而MCP处理具体操作。这种架构实现了决策层与执行层的解耦,使系统更模块化。正确理解两者的定位和关系对构建高效AI系统至关重要。
2025-11-30 03:19:52
619
原创 一个简单的GitHub AI Agent 实现指南
本文档介绍了如何构建一个能与GitHub交互的AI Agent系统。系统采用模块化设计,包含工具层(调用GitHub API)、模型层(封装Gemini LLM)、代理组装层(结合LLM和工具)和服务层(提供API接口)。关键技术点包括:使用BaseTool定义GitHub操作工具、通过CustomGeminiChatModel封装LLM、创建AgentExecutor实现思考-行动循环,以及统一Runnable接口实现灵活调用。该架构具有高度模块化和可扩展性,只需添加新工具即可扩展功能,为开发者提供了与G
2025-11-29 22:04:04
958
1
原创 LangChain Agent 调用工具的实现原理揭秘
本文解析了Agent如何通过ReAct模式自主调用list_repository_files工具获取GitHub仓库信息。该过程包含四个角色:用户提出问题、LLM(Google Gemini)进行推理、工具执行代码、AgentExecutor协调交互。流程分为三个阶段:1)LLM分析问题并生成指令;2)AgentExecutor拦截指令并调用工具执行;3)将结果反馈给LLM生成最终答案。代码实现体现在工具定义、Agent组装和执行驱动三个模块,通过精心设计的Prompt让LLM指挥程序执行任务,完成&quo
2025-11-29 21:55:26
1191
原创 Gemini 模型流式输出(打字机效果)问题诊断全过程
本文记录了py-github-agent项目中解决Google Gemini模型astream方法无法实现"打字机"效果的问题。诊断发现,自定义封装类CustomGeminiChatModel未实现_astream方法导致一次性输出。通过添加_astream方法并包装返回值后,发现Gemini API在REST模式下固有行为是逐句而非逐词流式输出。测试表明,代码封装正确,问题根源在于不同LLM服务商对流式传输的实现策略差异:DeepSeek支持逐词流,而Gemini仅支持逐句流。最终确认
2025-11-29 19:42:42
810
原创 LangChain 模型调用指南:理解 `invoke` 与 `_generate`
本文介绍了LangChain中invoke和_generate两个关键方法的区别与用途。invoke是面向模型使用者的统一公共API,支持标准调用、组合操作和高级功能;而_generate是面向模型开发者的内部抽象方法,用于实现底层模型调用逻辑。两者的关系类似汽车方向盘和发动机,invoke提供统一接口,_generate实现核心功能。这种设计实现了接口统一和实现解耦,使LangChain既易用又易于扩展。使用者应通过invoke调用模型,开发者则需实现_generate来创建自定义模型。
2025-11-29 00:14:27
404
原创 解决 Gemini API 连接卡住问题的方案
本文记录了py-github-agent项目中调用Google Gemini API时程序卡住问题的诊断与解决方法。问题表现为程序在调用API后无响应,经分析发现是gRPC协议与HTTP代理不兼容所致。解决方案是强制客户端使用REST API而非gRPC,通过在ChatGoogleGenerativeAI初始化时添加transport="rest"参数实现。修改后程序恢复正常,验证了REST API对代理的兼容性更好。
2025-11-28 23:34:15
465
原创 GKE Gateway API: 统一入口下的前后端路由策略
本文解释了GKE Gateway API中前端UI和后端API服务路由规则的差异。前端应用(如SPA)通常需要URLRewrite过滤器进行路径剥离(如将/chat/profile重写为/profile),以简化开发并避免修改代码。而后端API服务(如FastAPI)则依靠框架的root_path配置自动处理完整路径(如/chat-api-svc/users/123),无需Gateway重写。这种差异源于前端静态资源无法动态适应路径,而后端框架具备运行时路径感知能力。通过合理选择路由策略,可实现统一域名下不
2025-11-28 03:13:17
284
原创 从零构建 GitHub App:原理、实现与部署指南
本文介绍了如何从零开始构建、部署和配置一个GitHub App,并以py-webhook-svc项目为例,展示了如何通过GitHub App自动监听Pull Request并发送欢迎评论。首先解释了GitHub App与Webhook的关系,说明GitHub App是Webhook的上层应用,解决了多仓库自动化配置和安全授权问题。随后详细解析了py-webhook-svc项目的核心功能,包括事件监听和API调用逻辑。接着提供了部署到Google Kubernetes Engine的完整步骤,包括镜像打包、H
2025-11-26 02:53:36
1247
原创 aiohttp.ClientSession` 的优雅管理:为何选择 `async with`
本文探讨了在异步编程中使用aiohttp.ClientSession时管理资源的最佳实践。通过分析三种方案:析构函数__del__(无法异步调用)、每次调用创建新Session(性能低下)和异步上下文管理器async with,指出后者是最佳选择。实现__aenter__和__aexit__方法可确保Session在代码块结束时自动关闭,既保证了资源释放的可靠性,又保持了连接复用的高效性。这种方案将资源管理逻辑封装在类内部,使调用方只需关注业务逻辑,是异步资源管理的标准实践。
2025-11-24 01:10:09
283
原创 Gidgethub.aiohttp vs 普通 aiohttp
如果你在写爬虫,爬取任意网站 -> 用普通的aiohttp。如果你在写 GitHub App / 工具-> 请务必用gidgethub。它不是为了取代aiohttp,而是为了让你在aiohttp上更舒服地操作 GitHub API。
2025-11-24 00:29:38
549
原创 Python 依赖管理:Pipfile 与 Pipfile.lock
本文介绍了Python项目中Pipfile和Pipfile.lock的作用及其与传统requirements.txt的区别。Pipfile用于声明项目依赖,区分生产与开发环境,而Pipfile.lock锁定具体版本和子依赖,确保环境一致性。相比requirements.txt,Pipenv提供更强的依赖解析和自动虚拟环境管理,但安装速度较慢。由于requirements.txt的通用性和生态分裂(如Conda、Poetry等),许多开发者仍沿用传统方式。建议根据项目需求选择工具:简单项目用requireme
2025-11-24 00:16:24
577
原创 Gidgethub 使用指南
Gidgethub 是一个现代化的异步 GitHub API 封装库,采用 Sans-I/O 设计理念,不绑定特定网络库。本文介绍了其核心概念和三种典型应用场景:使用 PAT 调用 API(示例展示了获取用户信息)、集成 FastAPI 处理 Webhook 事件(如自动回复 issue 评论),以及 GitHub App 认证流程(包括 JWT 生成和 Installation Token 获取)。重点讲解了 GitHubAPI 客户端、路由系统和事件处理机制,为构建 GitHub App 或 Webho
2025-11-23 23:29:41
992
原创 Arch Linux + Niri Desktop Installation Log
在目标机器上启动 Arch ISO 后,手动设置临时 root 密码并查看 IP,建立 SSH 连接。(此时执行重启,系统成功启动并联网,使用 gateman 用户重新 SSH 连接)为了重启后自动连接 WiFi,我们复用了 ISO 环境的 iwd 配置。为了方便后续操作,将本地公钥上传到 Live 环境。检测到 CPU 为 AMD,需安装微码。配置了快捷键、输入设备和自启动项。配置国内镜像源以加速下载。进入新系统环境进行配置。
2025-11-22 23:01:51
628
原创 GitHub Webhook 指南:原理、实现与配置
本文介绍了GitHub Webhook的工作原理及实现方法。Webhook是一种推送机制,当GitHub仓库发生特定事件时会主动向配置的URL发送POST请求。文章详细解析了使用FastAPI框架实现Webhook接收接口的核心代码,包括后台任务处理和快速响应机制。同时提供了在GitHub仓库中配置Webhook的完整步骤,包括URL设置、事件选择和验证方法。最后总结了常见问题排查方法,如404错误、405错误等。通过本文可实现代码提交等事件触发自动通知服务器的功能。
2025-11-22 02:10:19
224
原创 FastAPI `BackgroundTasks` 详解与实战指南
本文解析了FastAPI中BackgroundTasks的使用方法,通过webhook_test接口案例演示其工作原理。BackgroundTasks允许在返回HTTP响应后执行耗时操作,提升用户体验。文章对比了它与Python多线程(threading)的区别:BackgroundTasks集成度高、资源消耗低但串行执行,适合轻量级任务;而threading并发性更好但管理复杂,适合CPU密集型任务。建议Web开发优先使用BackgroundTasks,仅在需要复杂并发时考虑多线程方案。
2025-11-21 23:59:03
845
原创 如何为 GCE 上的 Envoy 代理启用 HTTPS (使用 Google Cloud Load Balancer)
本文介绍了在Google Compute Engine(GCE)上为Envoy代理配置HTTPS的最佳实践方案。通过使用Google Cloud全球外部HTTPS负载均衡器托管SSL证书,将SSL终端放在负载均衡器层面,而非Envoy代理本身。这种架构具有简化配置、自动证书管理、增强安全性以及提升性能等优势。文章详细说明了流量路径:用户通过HTTPS访问负载均衡器,负载均衡器解密后通过HTTP将请求转发给运行Envoy的GCE虚拟机,再由Envoy路由到Cloud Run服务。同时解答了关于后端服务作用、多
2025-11-21 01:46:01
1278
原创 异步流式服务中的取消处理与数据持久化一致性方案
摘要: 本文描述了在FastAPI+SSE的LLM流式对话服务中,客户端断开导致已生成响应丢失的问题。原代码仅在流式结束后保存数据,但异常中断(如CancelledError)会跳过保存环节。首次尝试捕获异常直接保存时,因请求级DB会话失效导致失败。最终解决方案采用:1)独立后台任务执行保存操作;2)创建全新DB会话避免资源冲突;3)加入重试机制处理连接异常。部署后验证显示,中断场景下部分响应内容能可靠持久化到数据库,解决了消息丢失问题。
2025-11-20 01:11:56
483
原创 Vite前端 API 调用与本地开发代理配置策略
本文介绍了前后端分离开发中的跨域和环境差异问题解决方案。通过在前端代码中使用相对路径定义API(如/chat-api-svc/api/v1/chat),配合Vite开发服务器的代理配置,实现了:1)开发时自动将请求代理到云端API(如https://gateway.jpgcp.cloud),解决CORS问题;2)生产环境自动匹配同源地址。该方案具有代码复用性强、配置集中、维护简单等优势,使同一套代码能无缝适应开发和生产环境,有效规避跨域问题。
2025-11-18 20:11:12
350
原创 如何为 GKE Gateway 启用 HTTPS (Google 托管证书)
本文介绍了为域名gateway.jpgcp.cloud和jpgcp.shop启用HTTPS访问的技术方案。采用Google托管证书方案,具有完全免费、自动管理续订、高度可信等优势。实施过程分为两步:首先通过gcloud命令创建全局SSL证书资源;随后修改gateway.yaml配置,使用"TLS终止"模式将加密层前置到网关。这种架构既保障了外部通信安全,又简化了后端应用处理,无需管理证书或处理HTTPS加解密工作。特别说明了"TLS终止"模式的实际含义是将加密终点设在
2025-11-18 01:06:08
1411
原创 Pytest 中使用 SQLAlchemy 进行异步数据库测试
本文介绍了在pytest中使用SQLAlchemy异步功能管理数据库连接的两种测试隔离策略:1)每次测试重建表结构(策略一),通过metadata.drop_all/create_all确保测试独立性,虽然可靠但性能较低;2)事务回滚(策略二),利用数据库事务特性快速恢复状态,性能更优但实现复杂。目前项目采用策略一,通过函数级fixture实现每个测试的独立环境。文章还详解了pytest的scope参数作用域以及SQLAlchemyMetaData对象的用法,为数据库测试提供了完整的解决方案。
2025-11-18 00:42:42
699
原创 Envoy 代理虚拟机滚动更新问题排查与解决方案
本文记录了Envoy代理集群自动化滚动更新的完整排查过程。初始问题表现为服务无响应,排查发现请求未到达后端就被GCP前端拒绝。深入分析发现GCE虚拟机上的Envoy配置文件版本过旧,进一步调查确认该虚拟机由代管实例组(MIG)管理,不能直接修改单机配置。最终建立了自动化更新流程:通过Cloud Build管道构建包含最新配置的镜像,并创建定时触发的管道自动更新MIG实例模板。解决方案实现了符合IaC最佳实践的自动化部署方案,包括开发修改、镜像构建和定时滚动更新三个关键步骤,有效解决了服务无响应问题并建立了可
2025-11-16 02:26:05
894
原创 Python 异步迭代深度探索
本文系统探讨了Python异步编程的核心概念,重点分析了同步迭代与异步迭代的本质区别。文章指出async for是遍历异步迭代器的唯一语法,其关键在于__anext__()方法允许在I/O等待时让出CPU。通过类比厨师烧水的例子,阐释了异步I/O的"非阻塞"价值。同时强调真正的并发需要结合asyncio.create_task的任务分发机制,而非单纯依赖await。文章澄清了常见误区,最终结论表明:异步迭代协议的本质区别决定了其在I/O密集型场景中的优势,为理解Python异步编程提供了
2025-11-15 02:36:49
999
原创 Python 迭代器设计模式:警惕“自己是自己迭代器”的不正当模式
本文探讨了实现自定义迭代器时常见的反模式:让对象同时作为可迭代对象和其自身迭代器。文章通过示例分析指出这种设计会导致状态共享问题,破坏可重用性。核心观点是正确区分两种角色:可重用的容器类(应返回新迭代器)和一次性的迭代器类(应返回self)。通过分离这两个角色到不同类中,可以避免迭代过程中的状态干扰问题,从而建立健壮的迭代机制。文章还澄清了对迭代器协议的常见误解,强调合格迭代器必须同时实现__iter__和__next__方法。
2025-11-15 00:30:43
721
原创 深入理解 Python 的 `with` 语句及其与迭代器的交互
摘要:本文探讨了Python中with语句的工作原理及其与生成器和经典迭代器的兼容性。with通过上下文管理协议(__enter__和__exit__方法)实现资源自动管理。生成器与with完美配合,因其yield特性能在暂停时保持资源打开状态。而经典迭代器因多次独立调用__next__的特性,会导致with语句反复创建/销毁资源,无法维持迭代状态。正确实现需要在__init__中打开资源,在捕获StopIteration时手动关闭资源,相比生成器方案更为繁琐。
2025-11-14 23:48:21
862
原创 Python 迭代器 (Iterator) vs. 生成器 (Generator)
Python中的迭代器(iterator)和生成器(generator)都是实现数据流遍历的工具。可迭代对象(iterable)是实现__iter__()方法的数据结构。迭代器通过类实现时需定义__iter__()和__next__()方法,而生成器则利用yield关键字更简洁地创建迭代器,自动处理状态管理和StopIteration异常。关键区别在于:生成器代码更简洁,自动保存状态,而迭代器类提供更多灵活性。生成器是创建迭代器的首选方式,但当需要丰富功能时可用自定义迭代器类。需要注意的是,类方法中的yie
2025-11-14 23:36:41
1493
原创 在 Lit 应用中实现响应式布局
本文介绍了响应式布局的核心概念及其在聊天应用中的实现方案。响应式布局能根据不同设备屏幕尺寸自动调整界面,采用"移动优先"策略,通过CSS媒体查询判断窗口宽度(以768px为断点),实现桌面端与移动端布局的自动切换。项目使用Lit框架和Shoelace组件,通过Flexbox解决移动端UI错位问题,并采用双HTML结构方案:桌面端使用分栏布局,移动端采用顶部标题栏+抽屉式菜单。核心实现包括状态管理控制抽屉交互,以及利用媒体查询动态切换布局显示状态。该方法具有结构清晰、维护方便等优势。
2025-11-10 22:11:27
890
原创 python 后端流式处理 LLM 响应数据详解
本文介绍了如何通过流式处理优化大语言模型(LLM)的响应体验。传统请求-响应模式需要用户等待完整响应生成,而流式处理将响应分割为数据块实时传输。文章详细展示了基于FastAPI的实现方案,包括后端三部分:模型初始化(deepseek_chat_model.py)、服务封装(llm_service.py)和路由处理(chat_router.py),其中利用StreamingResponse和yield关键词实现数据分块传输。前端通过EventSource API接收数据块,实现实时展示效果。这种方案避免了用户
2025-11-10 15:04:15
1192
原创 指南:为何及如何使用Envoy作为跳板机代理Cloud SQL
本文记录了通过配置GCE虚拟机作为Envoy代理,实现外部访问VPC内私有Cloud SQL实例的解决方案。在尝试直接连接和Cloud SQL Auth Proxy失败后,最终采用Envoy跳板机方案:将GCE公网IP的5432端口流量转发至Cloud SQL私有IP。文章详细描述了排查过程,包括VPC防火墙、GKE网络策略等检查,以及各种Proxy方案的失败原因分析。最终通过Envoy的TCP代理配置成功实现连接验证,为类似场景提供了可行参考方案。
2025-11-09 20:03:22
617
原创 GKE连接私有Cloud SQL疑难问题排查实录
本文详细记录了GKE Pod无法连接私有Cloud SQL实例的排查过程。通过检查VPC防火墙规则、GKE网络策略、IP伪装和VPC Peering路由传播,最终确定问题根源在于高级网络配置。采用Cloud SQL Auth Proxy作为解决方案,成功实现了安全可靠的数据库连接。经验表明,当直接IP连接出现难以诊断的网络问题时,使用官方认证的代理服务是最佳实践,既能保障安全又节省故障排查时间。
2025-11-09 19:57:17
960
原创 使用Terraform创建私有Cloud SQL实例及连接测试
本文档详细记录了使用Terraform创建一个专用于VPC内部访问的Cloud SQL for PostgreSQL实例的全过程,并演示了如何从GCE和GKE环境中测试其连通性。
2025-11-09 19:56:18
494
原创 Lit.js 入门介绍:与 React 的对比
本指南将介绍 Lit,一个用于构建快速、轻量级 Web Components 的库。我们将通过具体的代码示例,将其核心概念与 React 进行对比,以帮助您更好地理解两者的设计哲学和用法差异。
2025-11-09 10:47:21
711
原创 Vite.js 快速入门指南 (React + JavaScript 版)
Vite (法语单词,意为 "快速",发音 /vit/) 是一个现代化的前端构建工具,它极大地提升了前端的开发体验。本指南将通过一个简单的 React 项目,介绍 Vite 的核心概念,并将其与传统的 `create-react-app` (CRA) 进行对比。
2025-11-09 10:41:27
559
原创 指南:使用 Vite + Lit + Shoelace 构建静态聊天窗口
本指南介绍如何使用Vite和Lit框架构建静态聊天应用界面。首先通过Vite的Lit模板初始化项目,然后集成Shoelace UI框架美化组件。详细说明如何配置Shoelace资源路径、构建消息气泡、聊天输入框和会话列表等核心组件,并最终使用Split-Panel布局组装完整应用。文章提供了完整的代码示例和配置方法,涵盖项目初始化、UI框架集成、组件开发到最终应用组装的全流程。
2025-11-09 03:50:38
927
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅