分类 AI 下的文章 - CorePlayers
首页
我的项目
708 智能控制台
Ethan认证中心
Ethan's ToDoList
Ethan's Tech Blog
好友链接
妙站分享
联系站长
搜 索
1
2026技术架构新趋势:从微服务回调到AI原生架构设计
45 阅读
2
DDD领域驱动设计:从底层原理到生产级全链路落地实战
41 阅读
3
Go + 云原生2026:从微服务到AI Infra的实战架构
35 阅读
4
事件驱动架构(EDA):从理论到项目落地的完整实践
34 阅读
5
2026 AI编程范式演进:从Vibe Coding到Spec-Driven Development再到Harness Engineering
31 阅读
ALL
(78)
AI
(20)
前端
(24)
后端
(23)
Dify/Coze
(7)
架构设计
(6)
登录
/
注册
搜 索
标签搜索
AI Agent
边缘计算
RSC
虚拟线程
Java
Spring Boot 4
Vibe Coding
AI原生
SDD
全栈开发
高并发
Project Loom
性能优化
2026趋势
协议标准
工具调用
MCP协议
多Agent协作
CrewAI
Spring AI
EthanCcc
累计撰写
78
篇文章
累计收到
1
条评论
首页
栏目
ALL
AI
前端
后端
Dify/Coze
架构设计
页面
我的项目
708 智能控制台
Ethan认证中心
Ethan's ToDoList
Ethan's Tech Blog
好友链接
妙站分享
联系站长
用户登录
登录
注册
AI
2025-11-01
Prompt 工程与 PGvector RAG 知识库:从文档 ETL 到查询增强的完整闭环
RAG 不是一个"搭起来就能用"的系统。从文档的清洗、切片、向量化,到检索时的重排序、查询增强,每一个环节都决定了最终回答的质量。本文将带你构建基于 PGvector 的生产级 RAG 知识库。为什么选择 PGvector?PGvector 是 PostgreSQL 的向量扩展,核心优势:向量和业务数据在同一张表——不需要单独维护向量数据库集群;可利用 PostgreSQL 的行级安全、事务、备份机制;支持混合检索(向量相似度 + SQL 条件过滤)。百万级以上纯向量检索场景,Milvus 和 Qdrant 更高效。文档 ETL Pipeline// Step 1: 文档加载 DocumentLoader loader = DocumentLoader.create() .registerSource(new FileSystemSource("docs/", "*.md")) .registerSource(new DatabaseSource(dataSource, "SELECT id, content FROM kb")); // Step 2: 文档清洗 DocumentCleaner cleaner = DocumentCleaner.create() .addFilter(new RemoveEmptyLinesFilter()) .addFilter(new RemoveHTMLTagsFilter()) .addFilter(new MarkdownCodeBlockPreserver()); // Step 3: 智能切片——按语义边界而非字符数 SemanticChunker chunker = SemanticChunker.builder() .embeddingModel(embeddingModel) .maxChunkSize(1000) .minChunkSize(200) .overlapSize(100) .breakpointThreshold(0.7) // 相似度低于此值才切分 .build(); // Step 4: 元数据增强 chunk.setMetadata(Map.of( "source", "docs/java-virtual-threads.md", "section", "## 性能对比", "lastUpdated", "2025-10-20" ));PGvector 表结构与索引CREATE EXTENSION vector; CREATE TABLE document_chunks ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), content TEXT NOT NULL, embedding VECTOR(1536), -- OpenAI ada-002: 1536 维 source VARCHAR(500), chunk_index INTEGER, metadata JSONB, created_at TIMESTAMP DEFAULT now() ); -- HNSW 索引(写入和查询都比 IVFFlat 快) CREATE INDEX ON document_chunks USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 200); -- 混合查询:语义 + 关键词 + 元数据过滤 SELECT content, 1 - (embedding <=> query_embedding) AS similarity, ts_rank(to_tsvector('chinese', content), plainto_tsquery('chinese', '虚拟线程 性能')) AS keyword_score FROM document_chunks WHERE metadata->>'source' LIKE '%java%' AND 1 - (embedding <=> query_embedding) > 0.75 ORDER BY similarity * 0.7 + COALESCE(keyword_score, 0) * 0.3 DESC LIMIT 5;查询增强(Query Enhancement)// 1. 查询改写(Query Rewriting) // 用户:"那个线程的东西怎么用?" // 改写:"Java 虚拟线程 VirtualThread 使用方法" // 2. 查询扩展(Query Expansion) // "Spring Cloud" → ["Spring Cloud", "微服务", "Nacos", "Gateway"] // 3. HyDE(Hypothetical Document Embedding) // 先让 LLM 生成假设的完美答案,用答案做向量检索 String hypothetical = llm.generate("请假设性回答:Java 虚拟线程的核心优势?"); List<Document> results = vectorStore.search(hypothetical);检索后处理:ReRank// 向量检索返回 Top-20,用 ReRanker 精选 Top-5 List<Document> candidates = vectorStore.search(query, 20); Reranker reranker = new BgeReranker(); List<Document> reranked = reranker.rerank(query, candidates, 5); // Cross-Encoder 比 Bi-Encoder(向量相似度)更精确Prompt 工程进阶结构化 Prompt 模板String prompt = """ # 角色定义 你是一个专业的技术文档助手,擅长回答 Java 和 Spring 相关问题。 # 安全规则 - 如果参考资料中没有相关信息,请明确说明 - 不要编造任何不存在的 API、参数或版本号 # 参考资料(按相关性排序) # 输出格式 1. 先给出简洁的答案(1-3句话) 2. 然后提供代码示例(如果有) 3. 最后列出注意事项 # 用户问题 """;CoT(Chain of Thought)String cotPrompt = """ 请逐步思考: 1. 这个问题涉及哪些技术概念? 2. 这些概念之间的关联是什么? 3. 最佳实践是什么? 4. 有没有常见的坑? 请在每个步骤后说明推理过程,然后给出最终答案。 """;Few-Shot Prompting""" 示例1: Q: Spring Boot 怎么连接 MySQL? A: [配置] application.yml 中添加 datasource... [代码] @Autowired DataSource... [注意] driver-class-name 用 com.mysql.cj.jdbc.Driver 示例2: Q: 什么是 AOP? A: [定义] AOP 面向切面编程... [原理] 动态代理... [使用] @Aspect + @Around... 现在回答: """;总结RAG 的质量由ETL Pipeline 质量 + 检索策略精度 + Prompt 设计水准共同决定。一个"能用"的 RAG 只需 100 行代码,一个"好用"的 RAG 需要对每个环节精细调优。Prompt 工程是最后一道关卡——Context 再好,Prompt 不好,回答也会跑偏。
2025年11月01日
30
0
2
2025-10-05
Spring AI + LangChain4j 企业级 AI 智能体开发实战:RAG、工具调用与多 Agent 协作
2024-2025 年,AI 应用开发框架已从实验阶段进入企业生产阶段。Spring AI 和 LangChain4j 是 Java 生态中最成熟的 AI 开发框架。本文将带你从 RAG 到工具调用,实现完整的多 Agent 协作系统。Spring AI vs LangChain4j 维度Spring AILangChain4j Spring 集成原生 Auto Configuration手动配置 模型支持OpenAI / Azure / Ollama20+ LLM 提供商 RAG 能力内置 VectorStore 抽象更丰富 Retriever 实现 社区Spring 官方维护独立社区,更新更快 选型建议:纯 Spring 技术栈优先 Spring AI;需多模型对接选 LangChain4j;两者可混合使用。RAG(检索增强生成)完整实现// 1. 文档加载与分割 @Bean public VectorStore vectorStore(EmbeddingModel embeddingModel) { return new PgVectorStore(jdbcTemplate, embeddingModel); } // 2. 文档摄入(ETL Pipeline) DocumentReader reader = new JsonReader(new FileSystemResource("docs/")); List<Document> documents = reader.get(); TextSplitter splitter = new TokenTextSplitter(true, 1000, 800, 10, true); List<Document> chunks = splitter.apply(documents); vectorStore.add(chunks); // 3. 检索增强生成 @PostMapping("/api/chat") public String chat(@RequestBody ChatRequest request) { List<Document> relevantDocs = vectorStore.similaritySearch( SearchRequest.query(request.getQuery()) .withTopK(5) .withSimilarityThreshold(0.7) ); String context = relevantDocs.stream() .map(Document::getContent) .collect(Collectors.joining("\n\n")); return chatClient.prompt() .system("根据以下参考资料回答问题。\n参考资料:\n" + context) .user(request.getQuery()) .call().content(); }Function Calling:AI 调用真实 API@Component public class OrderTools { @Autowired private OrderService orderService; @Tool(name = "queryUserOrders", description = "查询用户最近的订单列表") public List<Order> queryUserOrders( @ToolParam(description = "用户ID") Long userId, @ToolParam(description = "返回数量,默认5") @ToolDefault("5") int limit ) { return orderService.getUserRecentOrders(userId, limit); } } @Bean public ChatClient chatClient(ChatModel chatModel, OrderTools orderTools) { return ChatClient.builder(chatModel) .defaultTools(orderTools) .build(); } // 用户:"帮我查一下最近的订单" // AI 自动调用 queryUserOrders 并生成自然语言回答MCP(Model Context Protocol)集成@Configuration public class McpConfig { @Bean public McpServer mcpServer() { return McpServer.builder() .name("order-system") .version("1.0.0") .tool("searchOrders", "搜索订单", params -> { return orderService.search(params.getString("keyword")); }) .resource("order://recent", "最近订单", ctx -> orderService.getRecentOrders(ctx.getUserId()) ) .build(); } } // MCP 三种原语:Tool(函数)、Resource(数据)、Prompt Template(提示模板)多 Agent 协作// 智能客服场景:4 个 Agent 协作 // Agent 1: 意图识别 → 分类用户问题 // Agent 2: FAQ Agent → 匹配常见问题 // Agent 3: 订单 Agent → 查询订单(调用 Tools) // Agent 4: 升级 Agent → 复杂问题转人工 interface CustomerServiceAgent { @SystemMessage(""" 你是智能客服助手。遵循以下流程: 1. 首先尝试从 FAQ 知识库匹配答案 2. 涉及订单问题,查询订单系统 3. 无法解决时,生成工单并告知用户 """) String chat(@UserMessage String message); }生产环境关键实践 Token 控制:RAG 检索 TopK 控制在 3-5 条 缓存策略:相同问题缓存 LLM 响应,降低 20-40% 成本 熔断降级:LLM 调用必须有超时和重试机制 Prompt 版本管理:纳入 Git 版本控制 总结AI Agent 开发的本质是"给 AI 配备工具和知识"——RAG 提供知识,Function Calling 提供工具,MCP 标准化接口。多 Agent 协作让复杂任务被拆解为子任务,每个 Agent 负责最擅长的部分。
2025年10月05日
28
0
2
2025-09-25
Agent 设计模式大全:ReAct、Plan-Execute 与 Multi-Agent 协作
随着 AI Agent 在各行各业落地,业界沉淀出了一套成熟的设计模式。这些模式不是空洞的理论,而是来自实际生产环境的最佳实践总结。本文将系统梳理三大核心 Agent 设计模式。模式一:ReAct(Reason + Act)ReAct 是最基础也是应用最广泛的 Agent 模式,由"思考-行动-观察"循环组成。流程:Agent 收到任务 → 思考需要什么信息/操作 → 执行工具调用 → 观察结果 → 决定是否继续。这种交错的推理和行动模式使得 Agent 可以处理需要多步操作和外部信息获取的复杂任务。适用场景:需要与外部工具交互的任务(搜索、计算、数据库查询),且步骤数量通常不超过 10 步。代表实现:LangChain 的 AgentExecutor、OpenAI 的 Function Calling Agent。模式二:Plan-ExecutePlan-Execute 将任务分为"规划"和"执行"两个独立阶段,解决了 ReAct 在复杂任务中容易迷失方向的问题。流程:首先由 Planner(通常是更强的模型)制定完整的执行计划(步骤列表),然后由 Executor 逐步执行。这种方式使得每一步都有明确的目标。适用场景:任务步骤超过 10 步的复杂流程、需要精确执行顺序的任务。代表实现:LangGraph 的 Plan-and-Execute Agent、AutoGPT 风格的自主 Agent。模式三:Multi-Agent 协作当任务过于复杂,单个 Agent 难以胜任时,需要多个专业 Agent 协同工作。常见拓扑结构:1. 层级式(Supervisor+Workers):一个主管 Agent 分配任务给多个专业 Agent;2. 顺序式:Agent 的输出是下一个 Agent 的输入;3. 辩论式:多个 Agent 对同一问题独立给出答案,然后综合讨论。适用场景:跨领域任务(如既需要写代码又需要做市场分析)、需要多重验证的关键决策场景。
2025年09月25日
22
0
2
2025-08-18
大模型微调实战:LoRA 与 QLoRA 从原理到全流程落地
对于大多数企业和开发者来说,从头训练一个大模型是不现实的。参数高效微调(PEFT)技术,尤其是 LoRA 和 QLoRA,使得在消费级硬件上微调大模型成为可能。本文将从原理出发,提供一个完整的微调实战指南。LoRA 原理精讲LoRA(Low-Rank Adaptation)的核心思想是:模型在微调时的权重更新矩阵是"低秩"的。这意味着我们可以用两个小矩阵 A 和 B 的乘积来近似全量的权重更新 ΔW = B × A。具体来说,如果原始权重矩阵 W 是 d × k 维的,LoRA 将 ΔW 分解为 B(d × r)和 A(r × k),其中 r 远小于 d 和 k(通常 r = 4 到 64)。这使得可训练参数数量从 d×k 降低到 r×(d+k),通常减少了 99% 以上。推理时,W' = W + α/r × BA,其中 α 是缩放因子。由于 BA 很小,可以直接合并到原始权重中,不引入额外延迟。QLoRA:在消费级 GPU 上微调 70B 模型QLoRA 在 LoRA 的基础上增加了三项关键创新:1. 4-bit NormalFloat 量化:一种信息论最优的量化方法,保证量化后的数据分布与原始分布最接近。2. 双重量化:对量化常量本身也进行量化,进一步节省内存。3. 分页优化器:利用统一内存来处理梯度检查点中的内存峰值。使用 QLoRA,可以在单张 RTX 4090(24GB VRAM)上微调 Llama 3 70B 模型,而全量微调至少需要 8 张 A100(80GB)。实战流程1. 数据准备:使用高质量的指令微调数据(500-5000 条即可),格式为 。2. 配置 QLoRA:设置 r=16, alpha=32, target_modules=["q_proj", "v_proj"]。3. 训练:使用 PEFT + transformers 库,在单个 A100 上训练 3-5 个 epoch,约 2-4 小时。4. 推理合并:将 LoRA 权重合并到基础模型,导出为标准的 Hugging Face 格式。
2025年08月18日
17
0
1
2025-07-02
LangChain vs LlamaIndex:2025 大模型应用框架全景对比
在构建 LLM 应用时,框架的选择直接影响开发效率和系统性能。LangChain 和 LlamaIndex 作为最主流的两大框架,在 2025 年各自发展出了鲜明的特色。本文将从架构设计、核心能力和适用场景三个维度进行深度对比。框架定位差异LangChain:定位为"LLM 应用开发的通用框架",核心抽象是 Chain(链)和 Agent(智能体)。它的哲学是"一切皆可链式调用",通过组合不同的组件来构建复杂的 LLM 应用。LangChain 的优势在于灵活性和生态系统——它有最丰富的第三方集成(工具、向量数据库、模型提供商),是构建复杂 Agent 系统的首选。LlamaIndex:定位为"数据与 LLM 之间的桥梁",核心抽象是 Index(索引)和 Query Engine(查询引擎)。它的哲学是"一切围绕数据",专注于让 LLM 高效地理解和检索你的数据。LlamaIndex 在 RAG 场景中有天然的优势——更精细的数据摄取管道、更智能的检索策略。核心能力对比能力LangChainLlamaIndex文档处理基础支持非常强大(100+ 解析器)检索策略基础向量检索高级检索(递归、树形、混合)Agent 系统非常强大(LangGraph)基础 Agent 支持多模态支持深度支持(图像索引)生产部署LangServe + LangSmithLlamaCloud选型建议如果你的应用以复杂 Agent 系统为核心(多工具协作、多步骤推理、人机交互循环),选择 LangChain + LangGraph。如果你的应用以 RAG 为核心(知识库问答、文档分析、数据检索),选择 LlamaIndex。二者也可以组合使用:使用 LlamaIndex 构建索引和检索层,使用 LangChain 构建 Agent 编排层。
2025年07月02日
23
0
1
1
2
3
4