SpringAI 五步提示词大法:构建高效 AI 提示词
2026/6/7 23:22:19 网站建设 项目流程

1. 引言

使用 AI 大模型,提示词的重要性毋庸置疑。不管是向 AI 大模型问问题,还是围绕 AI 大模型构建应用,设计高效的提示词都是其中最重要的一个环节。尤其当你想要在一些具体的业务场景下使用 AI 大模型时,你不可能真的像聊天一样,慢慢跟大模型软磨硬泡,这时一个高效的提示词就显得尤为重要了。即便像 LangChain4j、SpringAI 这些纯面向程序员的 AI 大模型框架,其各种工具的背后,也是通过定制各种各样的提示词,从而让 AI 大模型帮助实现某种功能。

如何构建好的提示词呢?最好的方式,当然是具体情况具体分析。比如这个网站:https://www.promptingguide.ai/zh 上面分享了非常多针对不同场景的提示词设计思想和样例。还有阿里云百炼,提供了专门优化 Prompt 的应用插件:https://bailian.console.aliyun.com/#/prompt-manage。这么多场景,这么多模板,给你组个 899 的提示词工程课,不过分吧?但是,如此复杂的提示词工程,只怕还没开始问 AI,自己已经先头晕了。

那么有没有一套简单有效的提示词设计模板,能够应付大部分的应用场景,提升与 AI 交互的质量呢?这次,楼兰就以 SQL 智能助手场景为例,给你分享一套简单有效的提示词设计模板。

2. 五步提示词大法

其实以 AI 的超强理解力,我们完全可以把他当成一个身边的专家来使用。而当你想要向一个专家进行咨询时,最类似的生活场景就是你去医院看病,要医生给你专业的治疗。

去医院看病之前,首先要找准科室和医生。这样才能保证医生有足够的专业知识能够看准你的病因。要是你肚子疼,结果跑去了口腔科,那结果只能是闹个笑话。

与此类似,当你有问题要咨询 AI 时,就要先想清楚你是想要跟谁咨询。这时候,给 AI 一个明确且特色鲜明的角色定位,可以让 AI 更好的理解你的需求,从而提供更专业的帮助。

下面,我们就用「看病」这个生活场景来类比,拆解一套简单有效的五步提示词大法。

2.1 第一步:指定 AI 角色

就像去医院要先挂对科室一样,向 AI 提问的第一步,就是给它一个明确的角色定位。

例如,你可以这样指定:“你是一位经验丰富的数据库管理员,擅长编写高效、准确的 SQL 查询语句。”

这样 AI 就知道自己应该以什么身份、什么专业背景来回答你的问题,输出的内容也会更加专业和聚焦。

2.2 第二步:说明问题症状

见了医生后,你不能一上来就要医生开药,当然需要先跟医生描述清楚你面临的问题。比如"我最近感觉胸闷,偶尔感觉喘不上气"。但是这一步也是很多人难以把握的,因为你当然是知道很多你自己相关的信息,但是这时的根本目的是需要考虑医生需要知道哪些信息,才能有助于确定你的症状。这时你就还需要提供一些必要的上下文信息,比如持续时间、严重程度等,这样医生才能有足够的信息帮你确定症状。

与 AI 交互时也同样。你需要明确告诉 AI,你有些什么信息,需要解决什么样的问题。例如,你需要告诉 AI:“我现在有三张表,Authors 作者表,表结构 xxxx,Publishers 出版社表,表结构 xxx,Books 书籍表,表结构 xxx。我要根据这三张表查询在某一出版社,出版书籍最多的作者。”

这一步,可以说是整个提示词中最为关键的部分。你给出的上下文信息越精准,就越有助于 AI 理解背景信息,为后续的解决方案打下基础。对于简单的问题,可以依靠你的经验来尽量优化信息。但是,如果你有一些后端编程的能力,那么这一步就是你大展身手的时候了。例如,如果你希望统计到昨天为止的结果,这时 AI 大模型并不知道昨天是哪一天,你就可以给 AI 大模型提供一个可以计算日期的本地接口,这样 AI 大模型可以通过调用本地接口获得昨天的日期。另外,如果问题相关的知识太多,太复杂了。你还可以使用大模型提供的文本向量化模型,去寻找跟用户的问题匹配得更精确的上下文信息。

2.3 第三步:详细描述目标

跟医生说明了病症,接下来就需要医生给你治病了。去看医生,那当然目标明确,是要治好病。大家心知肚明。但是跟 AI 交互,问题就往往没有那么明确了。在这一步,你就需要明确你的最终目标是什么,让 AI 清楚的知道你期望的结果。在提目标时,不用担心 AI 大模型的理解能力,把目标提得越明确,越能减少不必要的歧义。

例如,如果你的后端数据库是 MySQL,那么你可以明确告诉 AI:“帮我写一个能够在 MySQL 中顺利执行的 SQL 语句。”

2.4 第四步:指定期望的结果

跟医生说明了目标,那么医生已经可以基本帮你治疗。不过,更加细致的情况是你想怎么治。比如你自己估计可能没什么大问题,但是医生上来就跟你说,我们打个针,或者动个手术吧,你估计是不容易接受的。你可以明确的跟医生说,不,我只接受口服,而且我只接受西药,中药太苦了,我吃不下。

这一步就是你告诉 AI,你所希望的结果格式是什么。当然,如果只是要写一个 SQL 语句,或许没有太多格式上的要求。但是如果是答案比较多的问题,比如**“帮我写几个不同的 SQL 语句,并比较他们的执行性能”**,那么对格式上就可以做更多的补充了。比如,整理成一个表格。

2.5 第五步:解决边界问题

最后,如果医生动手给你开药了,你会想到一些预防性的要求,比如,你钱包紧张,就需要跟医生说,让医生开便宜一点的药,这样当医生在给你开药方时,自然就会谨慎一点。

对于 AI,你也可以尽量规避一些明显不合理的特殊情况。比如最典型的,如果你给了 AI 大模型足够精确的信息,那么可以明确告诉 AI 大模型,就用你提供的信息回答问题,而不要用其他莫名其妙的信息。或者,在写 SQL 这个场景,你可以明确要求 AI 大模型就写一个 Select 查询语句,而不要生成 update、delete、insert 这一类 SQL 语句。这样,你就可以尽量放心的把 AI 大模型提供的 SQL 语句扔到 MySQL 执行,而不用担心数据被改得乱七八糟了。或者,可以要求他不要使用多层嵌套等等要求。

或者,如果你想不出这些边界问题,那么另外有个最好的办法,就是给出一些案例,让他直接参考你的案例。

3. 环境准备与项目初始化

3.1 创建 Spring Boot 项目

使用 Spring Initializr(https://start.spring.io/)创建一个新项目,选择以下依赖:

  • Spring Web
  • Spring AI(需要添加 Spring Milestone 或 Snapshot 仓库)

pom.xml中添加 SpringAI 的 BOM 和相关依赖:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- Spring AI OpenAI 支持 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency><!-- PDF 文档读取 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-pdf-document-reader</artifactId></dependency><!-- 向量存储(SimpleVectorStore 内置) --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-core</artifactId></dependency></dependencies>

3.2 配置 API Key

application.yml中配置你的 OpenAI API Key(或阿里云百炼的 API Key):

spring:ai:openai:api-key:${OPENAI_API_KEY}# 从环境变量读取,不要硬编码chat:options:model:gpt-4o-miniembedding:options:model:text-embedding-ada-002

4. 核心代码实现

4.1 构建 RAG 服务

我们将创建一个RagService,它负责整个 RAG 流程。

importorg.springframework.ai.document.Document;importorg.springframework.ai.reader.pdf.PagePdfDocumentReader;importorg.springframework.ai.transformer.splitter.TokenTextSplitter;importorg.springframework.ai.vectorstore.SimpleVectorStore;importorg.springframework.ai.vectorstore.VectorStore;importorg.springframework.ai.vectorstore.SearchRequest;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.chat.prompt.PromptTemplate;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.core.io.Resource;importorg.springframework.stereotype.Service;importjava.util.List;importjava.util.Map;@ServicepublicclassRagService{privatefinalChatClientchatClient;privatefinalVectorStorevectorStore;publicRagService(ChatClient.BuilderchatClientBuilder){this.chatClient=chatClientBuilder.build();// 使用内存向量存储,生产环境建议替换为 pgvector 或 Redisthis.vectorStore=newSimpleVectorStore();}/** * 加载并索引 PDF 文档 * @param pdfResource PDF 文件资源 */publicvoidindexPdf(ResourcepdfResource){// 1. 加载文档PagePdfDocumentReaderpdfReader=newPagePdfDocumentReader(pdfResource);List<Document>documents=pdfReader.get();// 2. 切分文档TokenTextSplittertextSplitter=newTokenTextSplitter();List<Document>splitDocuments=textSplitter.apply(documents);// 3. 向量化并存储(SimpleVectorStore 会自动调用配置的 EmbeddingModel)vectorStore.add(splitDocuments);System.out.println("PDF 文档索引完成,共 "+splitDocuments.size()+" 个文本块。");}/** * 基于用户问题,从知识库检索并生成答案 * @param query 用户问题 * @return AI 生成的答案 */publicStringaskQuestion(Stringquery){// 1. 检索相关文档SearchRequestsearchRequest=SearchRequest.query(query).withTopK(5);// 返回最相似的 5 个块List<Document>similarDocuments=vectorStore.similaritySearch(searchRequest);// 2. 构建上下文StringBuildercontext=newStringBuilder();for(Documentdoc:similarDocuments){context.append(doc.getContent()).append("\n\n");}// 3. 构建提示词模板StringpromptTemplate=""" 你是一个智能问答助手。请根据以下提供的上下文信息,回答用户的问题。 如果上下文中没有足够的信息,请直接说“我无法从提供的知识库中找到答案”。 不要编造信息。 上下文: {context} 用户问题: {question} 请给出详细且准确的回答: """;PromptTemplateprompt=newPromptTemplate(promptTemplate);Map<String,Object>promptParameters=Map.of("context",context.toString(),"question",query);// 4. 调用 LLM 生成回答returnchatClient.prompt(prompt.create(promptParameters)).call().content();}}

4.2 创建 REST API 控制器

创建一个控制器来暴露两个接口:一个用于上传并索引 PDF,另一个用于提问。

importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.MultipartFile;importjava.io.IOException;@RestController@RequestMapping("/api/rag")publicclassRagController{privatefinalRagServiceragService;publicRagController(RagServiceragService){this.ragService=ragService;}/** * 上传 PDF 文档并构建索引 */@PostMapping("/upload")publicResponseEntity<String>uploadPdf(@RequestParam("file")MultipartFilefile){if(file.isEmpty()){returnResponseEntity.badRequest().body("请上传一个 PDF 文件。");}try{ragService.indexPdf(file.getResource());returnResponseEntity.ok("PDF 文档已成功索引。");}catch(Exceptione){returnResponseEntity.internalServerError().body("索引失败:"+e.getMessage());}}/** * 向知识库提问 */@GetMapping("/ask")publicResponseEntity<String>askQuestion(@RequestParam("question")Stringquestion){if(question==null||question.isBlank()){returnResponseEntity.badRequest().body("问题不能为空。");}Stringanswer=ragService.askQuestion(question);returnResponseEntity.ok(answer);}}

5. 实战测试

  1. 启动应用:运行你的 Spring Boot 应用。
  2. 上传 PDF:使用curl或 Postman 发送 POST 请求上传一个 PDF 文档。
    curl-XPOST-F"file=@/path/to/your/document.pdf"http://localhost:8080/api/rag/upload
  3. 提问:发送 GET 请求进行提问。
    curl"http://localhost:8080/api/rag/ask?question=这篇文档主要讲了什么内容?"

你会看到 AI 基于你上传的 PDF 文档内容,给出精准的回答。

6. 总结与进阶

本文我们成功实现了一个基于 SpringAI 的 RAG 智能问答系统,它能够读取 PDF 文档,并将其转化为可供自然语言查询的知识库。这只是一个开始,在实际生产环境中,你还可以考虑以下优化:

  • 替换向量数据库:SimpleVectorStore替换为PgvectorRedisMilvus等生产级向量数据库,以支持大规模数据存储和持久化。
  • 优化文档切分策略:根据文档类型(如代码、表格、长文本)选择不同的切分器(如SentenceSplitterRecursiveCharacterTextSplitter),以保留更好的语义完整性。
  • 引入多轮对话:将历史对话信息也作为上下文的一部分,实现多轮对话的 RAG。
  • 混合检索:结合关键词检索(如 Elasticsearch)和向量检索,提高检索的准确率和召回率。
  • 文档预处理:在索引前对 PDF 进行 OCR 识别、表格提取等预处理,提升数据质量。

通过 SpringAI,我们可以用非常简洁的代码,快速搭建出强大的 RAG 应用。希望这篇实战能为你打开一扇新的大门,让你能更好地利用 AI 技术解决实际问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询