适用范围
- JDK 版本:JDK 17 或更高版本
- Spring Boot版本:Spring Boot 3 GA或更高版本
操作步骤
1. 获取项目代码
完整的示例代码请参见Spring AI Alibaba项目示例下的bailian-rag-knowledge。请将整个examples目录下载到本地,以确保项目结构和依赖完整。
2. 环境配置
获取阿里云百炼的API Key并配置到环境变量,环境变量名使用AI_DASHSCOPE_API_KEY。使用环境变量可避免硬编码带来的安全风险。
如需操作子业务空间的知识库,还需要获取业务空间 ID,并配置到环境变量,环境变量名使用
AI_DASHSCOPE_WORKSPACE_ID。
# bailian-rag-knowledge的配置文件路径:bailian-rag-knowledge/src/main/resources/application.yml
spring:
ai:
dashscope:
api-key: ${AI_DASHSCOPE_API_KEY} # 阿里云百炼的 API Key
# workspace-id: ${AI_DASHSCOPE_WORKSPACE_ID} # 业务空间 ID(可选),检索默认业务空间的知识库时无需配置
3. 示例代码
通过DashScopeApi检索阿里云百炼知识库。
Controller示例代码
import org.springframework.web.bind.annotation.*;
import com.alibaba.cloud.ai.example.rag.knowledge.service.RagService;
import reactor.core.publisher.Flux;
@RestController
@RequestMapping("/ai")
public class CloudRagController {
/** 注入CloudRagService */
private final RagService cloudRagService;
public CloudRagController(RagService cloudRagService) {
this.cloudRagService = cloudRagService;
}
@GetMapping(value="/bailian/knowledge/generate", produces="text/event-stream")
public Flux<String> generate(@RequestParam(value = "message",
defaultValue = "你好,请问你的知识库文档主要是关于什么内容的?") String message) {
return cloudRagService.retrieve(message).map(x -> x.getResult().getOutput().getContent());
}
}
当用户提问时,DashScopeDocumentRetriever会检索与问题最相关的文本切片,并将这些上下文与原始问题一并提交给大模型(默认为qwen-max)生成回答。
Service示例代码
import com.alibaba.cloud.ai.advisor.DocumentRetrievalAdvisor;
import com.alibaba.cloud.ai.dashscope.api.DashScopeApi;
import com.alibaba.cloud.ai.dashscope.rag.*;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.SystemPromptTemplate;
import org.springframework.ai.document.Document;
import org.springframework.ai.document.DocumentReader;
import org.springframework.ai.rag.retrieval.search.DocumentRetriever;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
@Service()
public class CloudRagService implements RagService {
/** 此处INDEX_NAME的值为待检索知识库的名称,知识库需要提前创建好 */
private static final String INDEX_NAME = "测试知识库";
/** 提示词模板 */
private static final String retrievalSystemTemplate = """
以下是上下文信息。
---------------------
{question_answer_context}
---------------------
请根据上下文,而不是先验知识,回复用户评论。如果答案不在上下文中,告知用户认为你不能回答这个问题。
""";
private final ChatClient chatClient;
private final DashScopeApi dashscopeApi;
public CloudRagService(ChatClient.Builder builder, DashScopeApi dashscopeApi) {
// 创建DocumentRetriever,用于检索知识库
DocumentRetriever retriever = new DashScopeDocumentRetriever(dashscopeApi,
DashScopeDocumentRetrieverOptions.builder().withIndexName(INDEX_NAME).build());
this.dashscopeApi = dashscopeApi;
// 初始化ChatClient,此处设置待检索知识库和待调用的模型
this.chatClient = builder
.defaultAdvisors(new DocumentRetrievalAdvisor(retriever, retrievalSystemTemplate))
// 模型默认使用qwen-max,可通过如下代码设置不同的模型
//.defaultOptions(DashScopeChatOptions.builder().withModel("qwen-plus").build())
.build();
}
@Override
public Flux<ChatResponse> retrieve(String message) {
return chatClient.prompt().user(message).stream().chatResponse();
}
}
了解更多
- Spring AI Alibaba:提供文档教程、实战博客和开发者社区,帮助您快速开发 Java 生成式 AI 应用。
- 创建和使用知识库:深入了解阿里云百炼知识库的核心功能与最佳实践。
该文章对您有帮助吗?