Langchain4j + Skills使用示例
Langchain4j Skills使用示例LangChain4j 1.12.1版本开始支持Skill。Skills是一种为大型语言模型配备可重复使用、独立的行为指令的机制。一个技能包含名称、简短描述以及指令内容其主体还可以附带可选资源例如参考文献、资产、模板等。大型语言模型按需加载技能初始上下文保持精简仅在实际需要时才引入详细指令。1、创建Maven项目。依赖pom.xml添加LangChain4j相关依赖包。?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.sfccn.tools/groupIdartifactIdaiservice/artifactIdversion1.0.0/versionpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncodinglangchain4j.version1.12.2/langchain4j.version/propertiesdependenciesdependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j/artifactIdversion${langchain4j.version}/version/dependencydependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-core/artifactIdversion${langchain4j.version}/version/dependencydependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-open-ai/artifactIdversion${langchain4j.version}/version/dependencydependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-skills/artifactIdversion1.12.2-beta22/version/dependency/dependenciesrepositoriesrepositoryidalimaven/idnamealiyun maven/nameurlhttps://maven.aliyun.com/repository/public//url/repository/repositories/project2、创建Skill。一个 Skill 包含:name:技能名称description:简短描述content:详细的执行指令(步骤、注意事项、示例等)resources:可选的参考资料(配置文件、文档等)创建文件skills\code-security-audit\SKILL.md--- name: code-security-audit description: 全面检查代码中的安全漏洞包括SQL注入、XSS攻击、命令注入、反序列化漏洞、敏感信息泄露等安全问题 --- 作为代码安全审计专家请按以下步骤进行审计 1. **漏洞识别**仔细扫描代码寻找以下类型的安全问题 - SQL注入直接拼接SQL语句 - XSS跨站脚本攻击未转义输出用户输入 - 命令注入直接拼接执行系统命令 - 反序列化漏洞不安全的反序列化操作 - 敏感信息泄露硬编码密码、密钥等 - 认证与授权问题 - 路径遍历漏洞 - 不安全的随机数使用 2. **风险评估**对每个发现的问题评定风险等级 - 严重需要立即修复 - 高风险应尽快修复 - 中等建议修复 - 低风险可选修复 3. **修复建议**为每个漏洞提供具体的修复代码示例 4. **输出格式** 代码安全审计报告 总体评估[安全/存在风险/危险] 发现的漏洞 1. [漏洞类型] - [风险等级] 位置[代码位置描述] 问题代码 [有问题的代码片段] 安全风险[详细说明] 修复建议 [修复后的代码示例] 安全改进建议总结 [列出关键改进点] 3、创建LangChain4j应用。importdev.langchain4j.model.chat.ChatModel;importdev.langchain4j.model.openai.OpenAiChatModel;importdev.langchain4j.service.AiServices;importdev.langchain4j.skills.FileSystemSkill;importdev.langchain4j.skills.FileSystemSkillLoader;importdev.langchain4j.skills.Skills;importjava.nio.file.Path;importjava.util.List;importstaticjava.time.Duration.ofSeconds;/** * 使用 LangChain4j Skill 进行代码安全校验的示例 * * 本示例展示如何创建和使用自定义 Skill 来检查代码中的安全漏洞 * 包括 SQL 注入、XSS 攻击、命令注入等常见安全问题。 * * Skill 定义位于doc/skills/code-security-audit/SKILL.md */publicclassSkillExample{staticChatModelmodelOpenAiChatModel.builder().baseUrl(ApiKeys.API_URL).apiKey(ApiKeys.OPENAI_API_KEY).modelName(ApiKeys.MODEL_NAME).timeout(ofSeconds(120)).temperature(0.2).logRequests(true).build();publicstaticvoidmain(String[]args){// 1. 从文件系统加载 SkillsListFileSystemSkillskillListFileSystemSkillLoader.loadSkills(Path.of(doc/skills/));SkillsskillsSkills.from(skillList);// 2. 创建 AI 服务CodeSecurityAuditServiceserviceAiServices.builder(CodeSecurityAuditService.class).chatModel(model).toolProvider(skills.toolProvider()).systemMessage(你是一个专业的代码安全审计专家。\n你的任务是仔细分析代码识别潜在的安全漏洞。\n可用的技能\nskills.formatAvailableSkills()\n当需要审计代码安全性时请使用 activate_skill 工具激活 code-security-audit 技能。).build();// 3. 示例审计一段有安全问题的代码StringunsafeCode public class UserService { public User getUserById(String userId) { String sql SELECT * FROM users WHERE id userId ; ResultSet rs statement.executeQuery(sql); return extractUser(rs); } public void renderComment(String userComment) { String html div classcomment userComment /div; response.getWriter().write(html); } public void executeBackup(String path) { Runtime.getRuntime().exec(tar -czf backup.tar.gz path); } } ;System.out.println( 开始代码安全审计 \n);Stringresultservice.auditCode(unsafeCode);System.out.println(result);}interfaceCodeSecurityAuditService{StringauditCode(Stringcode);}}4、运行结果运行上边的示例代码控制台将会输出以下内容开始代码安全审计现在让我对提供的代码进行全面的安全审计 代码安全审计报告 总体评估危险-存在多个严重安全漏洞 发现的漏洞1.SQL注入漏洞- 严重 位置UserService.getUserById()方法 问题代码 publicUsergetUserById(StringuserId){StringsqlSELECT * FROM users WHERE id userId;ResultSetrsstatement.executeQuery(sql);returnextractUser(rs);} 安全风险直接拼接用户输入的 userId 到SQL语句中攻击者可以注入恶意SQL代码如 OR 11 或 ;DROPTABLEusers;--导致数据泄露、数据篡改或数据库破坏。 修复建议 publicUsergetUserById(StringuserId){StringsqlSELECT * FROM users WHERE id ?;PreparedStatementpstmtconnection.prepareStatement(sql);pstmt.setString(1,userId);ResultSetrspstmt.executeQuery();returnextractUser(rs);}2.XSS跨站脚本攻击漏洞- 严重 位置UserService.renderComment()方法 问题代码 publicvoidrenderComment(StringuserComment){Stringhtmldiv classcommentuserComment/div;response.getWriter().write(html);} 安全风险直接将用户输入的评论内容输出到HTML中攻击者可以注入恶意JavaScript代码如scriptalert(XSS)/script 或 img srcx onerrorstealCookies()导致会话劫持、数据窃取或恶意重定向。 修复建议 publicvoidrenderComment(StringuserComment){// 使用HTML转义StringescapedCommentStringEscapeUtils.escapeHtml4(userComment);Stringhtmldiv classcommentescapedComment/div;response.getWriter().write(html);} 或者使用现代框架的模板引擎自动转义功能。3.命令注入漏洞- 严重 位置UserService.executeBackup()方法 问题代码 publicvoidexecuteBackup(Stringpath){Runtime.getRuntime().exec(tar -czf backup.tar.gz path);} 安全风险直接拼接用户输入的路径到系统命令中攻击者可以注入恶意命令如/home/user;rm-rf/ 或 /home/usercat/etc/passwd导致系统命令执行、文件系统破坏或敏感信息泄露。 修复建议 publicvoidexecuteBackup(Stringpath){// 验证路径是否安全if(!isValidPath(path)){thrownewSecurityException(Invalid path provided);}// 使用参数数组而不是字符串拼接String[]cmd{tar,-czf,backup.tar.gz,path};ProcessprocessRuntime.getRuntime().exec(cmd);// 或者使用ProcessBuilderProcessBuilderpbnewProcessBuilder(tar,-czf,backup.tar.gz,path);Processprocesspb.start();}4.缺少输入验证- 高风险 位置所有方法 安全风险所有方法都直接使用用户输入而没有进行任何验证可能导致空指针异常、格式错误或恶意输入。 修复建议 publicUsergetUserById(StringuserId){// 输入验证if(userIdnull||userId.trim().isEmpty()){thrownewIllegalArgumentException(User ID cannot be null or empty);}// 验证格式例如应该是数字if(!userId.matches(\\d)){thrownewIllegalArgumentException(Invalid user ID format);}// 使用参数化查询StringsqlSELECT * FROM users WHERE id ?;PreparedStatementpstmtconnection.prepareStatement(sql);pstmt.setString(1,userId);ResultSetrspstmt.executeQuery();returnextractUser(rs);}5.缺少错误处理- 中等 位置所有方法 安全风险代码中没有适当的错误处理可能导致敏感信息泄露如堆栈跟踪或系统状态不一致。 修复建议 publicUsergetUserById(StringuserId){try{// 输入验证validateUserId(userId);// 使用参数化查询StringsqlSELECT * FROM users WHERE id ?;PreparedStatementpstmtconnection.prepareStatement(sql);pstmt.setString(1,userId);ResultSetrspstmt.executeQuery();if(rs.next()){returnextractUser(rs);}else{returnnull;}}catch(SQLExceptione){// 记录错误但不暴露敏感信息logger.error(Database error while fetching user,e);thrownewServiceException(Unable to retrieve user information);}catch(IllegalArgumentExceptione){// 输入验证错误throwe;}} 安全改进建议总结1.**立即修复**SQL注入、XSS和命令注入漏洞都是严重风险需要立即修复2.**使用参数化查询**所有数据库操作都应使用PreparedStatement3.**输出编码**所有用户输入输出到HTML时都应进行适当的编码4.**命令执行安全**避免直接拼接命令使用参数数组或ProcessBuilder5.**输入验证**对所有用户输入进行严格的验证和清理6.**最小权限原则**数据库连接和系统命令执行应使用最小必要权限7.**错误处理**实现适当的错误处理避免泄露敏感信息8.**安全编码培训**开发团队需要接受安全编码培训9.**代码审查**建立安全代码审查流程10.**安全测试**实施自动化安全测试包括SAST和DAST工具 这些漏洞如果被利用可能导致数据泄露、系统破坏、权限提升等严重后果建议立即修复。