HeZzz

也可以是 9¾

现在做 Java 项目时,只要和大模型相关,最后基本都会碰到一个问题:到底是自己直接对接 OpenAI、Gemini、Ollama 这些模型接口,还是找一层统一封装把 prompt、对话记忆、工具调用、RAG 这些事情整理起来。

LangChain4j 就是 Java 生态里这类问题的一个常见答案。它的定位很直接,就是给 Java 应用提供一套对接 LLM 的统一方式,把模型调用、工具、记忆、RAG、结构化输出这些常见能力放到同一套开发体验里。对已经在用 Spring Boot 或其他 Java 框架的人来说,这类封装的意义通常不在“能不能调模型”,而在“能不能把这套能力接得像正常业务代码一样”。

阅读全文 »

写 Python Web 项目时,如果页面内容里既有固定结构,又有动态数据,那通常就会接触到模板引擎。比如用户列表、文章详情页、后台管理页,这些内容的 HTML 结构大体固定,但里面的数据是运行时才知道的。

Jinja2 就是这类场景里最常见的模板引擎之一。它在 Flask 生态里尤其常见,但并不只服务于 Flask。简单说,它的作用就是把模板和数据组合起来,最后渲染成真正的文本输出,最常见的是 HTML。

阅读全文 »

做微服务或者分布式系统时,最容易遇到的一类问题不是“功能有没有写出来”,而是“问题出了以后到底该去哪里看”。接口慢了、某个服务超时了、数据库抖了、链路中间断了,单靠日志一层一层翻,很多时候会很难排查。

这时候就会用到像 SkyWalking 这样的观测平台。它最常见的用途当然是链路追踪,但它实际上不只做 tracing,还把指标、日志、拓扑、性能分析这些内容放到了同一套系统里。

阅读全文 »

写 Spring 的时候,经常会看到一些看起来像小型脚本的写法,比如 #{...}@Value("#{systemProperties['user.home']}")@PreAuthorize("hasRole('ADMIN')")。这些东西看起来不像普通 Java 代码,但又确实在项目里经常出现。

这些表达式背后用到的,就是 SpEL。它的全称是 Spring Expression Language,也就是 Spring 表达式语言。简单说,它是 Spring 提供的一套表达式机制,用来在运行时读取数据、调用方法、做条件判断。

阅读全文 »