Skip to content

结构化输出OutputParser和Tool

大模型默认输出自然语言,但经常需要结构化 JSON。两种方式:Output Parser(在 prompt 加格式说明 + 解析响应)和 Tool Call(绑定工具 schema,模型返回结构化 args)。推荐用 withStructuredOutput(schema),它底层自动选最可靠的方案(大多用 tool call)。两个不适合的场景:流式打印(需要 Output Parser 的 stream + parse)和非 JSON 格式(XML/YAML 用 XMLOutputParser)。Tool Call 的流式可以通过 toolcallchunks 实现逐字打印。

阅读

Memory管理三大策略

大模型是无状态的,每次调用独立,不记得之前聊过什么。Memory 管理就是让它"记住"。三种策略:截断(按条数或 token 数去掉旧消息)、总结(用 LLM 生成摘要替代旧消息)、检索(存入 Milvus 向量数据库,用 RAG 检索相关历史对话)。存储层有 InMemoryChatMessageHistory(短时记忆)和 FileSystemChatMessageHistory(长时记忆/持久化)。Cursor 和 Claude Code 就是用总结策略——达到 token 限制自动触发总结。之前的 memory API 已废弃,现在直接自己实现。

阅读

Milvus加RAG实战电子书语义检索

综合实战:用 EPubLoader 加载 .epub 电子书(按章节拆分),RecursiveCharacterTextSplitter 再把每章分成 500 字符的 chunk,嵌入模型向量化后存入 Milvus。查询时 query 向量化做余弦相似度匹配,拿到相关片段当上下文,调用大模型生成回答。关键词搜索做不到的事,语义检索可以。这就是 RAG 的完整流程:Loader → Splitter → Embedding → Milvus → 检索 → LLM 生成。后面还可以和 MySQL 联动,通过 bookid 关联查出更多元数据。

阅读

Milvus向量数据库

之前 RAG 用的是内存向量数据库,实际 AI Agent 产品都用 Milvus 这种专业向量数据库。就像 Web 应用用 MySQL 存数据,AI Agent 应用用 Milvus 存知识和记忆。Milvus 支持向量字段,用余弦相似度做语义检索,这是 MySQL 做不到的。核心流程:Docker 部署 Milvus → 创建 Collection(定义 Schema + 向量索引)→ 插入数据时用嵌入模型向量化 → 检索时 query 向量化做相似度匹配 → 结合 RAG 给大模型当上下文。增删改查都走 SDK,删除不需要向量化。

阅读

LangChain全部Splitter

LangChain 的 Splitter 有三大类:CharacterTextSplitter(单分隔符基础分割)、RecursiveCharacterTextSplitter(多分隔符递归分割,最常用)、TokenTextSplitter(按 token 数严格分割)。绝大多数场景直接用 RecursiveCharacterTextSplitter 就够了,它支持多分隔符递归尝试、代码分割(fromLanguage)、自定义长度函数(可按 token 计数),功能最全面且能保证语义完整。overlap 只在文本被打断时才加,不是每个 chunk 都有。

阅读

RAG的Loader和Splitter

上节 RAG 我们是手动创建 Document 对象来存入向量数据库的,但实际知识来源多种多样:Word、PDF、网页、YouTube、X 推文等。所以需要 Loader 从各种来源加载文档,加载后的文档可能很大,还需要 Splitter 分割成小块再向量化。Loader 在 @langchain/community 包下,有 180+ 种;Splitter 在 @langchain/textsplitters 包下。我们用 CheerioWebBaseLoader 加载网页文章,用 RecursiveCharacterTextSplitter 分割,然后走完 RAG 检索生成流程。

阅读

RAG-把文档向量化实现语义搜索

大模型训练完后,知识就不再更新了,它没法知道最新的一些信息,以及一些非互联网上公开的信息。所以对于它不知道的东西,会胡乱回答,也就是幻觉问题。解决这个问题的方式就是 RAG。RAG 是检索、增强、生成,会基于用户的 query 去检索知识库,拿到相关文档后放到 Prompt 里增强它,之后给大大模型来生成回答。检索肯定是要语义检索,但是关键词检索做不到这点,我们需要用向量来做,通过嵌入模型把知识向量化,这样就可以通过向量的余弦相似度(也就是夹角大小)来计算出两个知识的相关性,从而根据用户的 query 查询出相关的文档。我们基于 LangChain 写了 RAG 的代码:fromDocuments api 基于 embeddings 模型把文档向量化存入数据库。asRetriever 指定查询相似度最大的几个文档。similaritySearchWithScore 相似度评分retriever.invoke 来查询文档。只要你理解了 RAG 的流程,这些 api 自然也就会用了。

阅读