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(indexName).build());
this.dashscopeApi = dashscopeApi;
// 初始化ChatClient,此处设置待检索知识库和待调用的模型
this.chatClient = builder
.defaultAdvisors(new DocumentRetrievalAdvisor(retriever, new SystemPromptTemplate(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();
}
}