基于 Spring AI 的 RAG 落地实践指南

RAG(Retrieval-Augmented Generation)技术结合了检索与生成能力,能够显著提升 AI 在知识密集型任务中的表现。以下从本地与阿里云知识库两种场景出发,详细解析技术实现方案。

技术架构设计

核心组件分为三部分:文档处理模块、向量检索模块和生成模块。文档处理模块负责文本分块与向量化,向量检索模块实现高效相似度匹配,生成模块基于检索结果生成最终回答。

本地部署采用 Spring AI 集成 OpenAI 的嵌入模型,阿里云方案则调用灵积模型服务。两种方案均支持自定义分块策略与相似度阈值调整。

本地知识库实现

文档预处理阶段使用 Apache Tika 解析多种格式文件。文本分块采用滑动窗口策略,平衡上下文连贯性与计算效率。

// 文本分块示例
public List<TextSegment> chunkDocument(String text, int chunkSize, int overlap) {
    List<TextSegment> chunks = new ArrayList<>();
    int length = text.length();
    for (int i = 0; i < length; i += chunkSize - overlap) {
        int end = Math.min(i + chunkSize, length);
        chunks.add(new TextSegment(text.substring(i, end)));
    }
    return chunks;
}

向量存储选用 ChromaDB 或 Milvus,Spring AI 提供统一接口封装:

// 向量存储接口
@Bean
public VectorStore vectorStore(EmbeddingModel embeddingModel) {
    return new ChromaVectorStore.Builder()
            .withEmbeddingModel(embeddingModel)
            .withPersistDirectory("data/chroma")
            .build();
}
阿里云知识库集成

通过阿里云 OpenAPI 调用灵积模型服务,需配置 AK/SK 认证与服务端点:

# application.yml
spring:
  ai:
    aliyun:
      access-key: your-ak
      secret-key: your-sk
      region-id: cn-hangzhou
      dashscope:
        base-url: https://dashscope.aliyuncs.com

检索增强生成流程实现:

public String generateWithRAG(String query) {
    // 1. 查询向量库
    List<Document> docs = retriever.retrieve(query);
    
    // 2. 构建提示词
    PromptTemplate template = new PromptTemplate("""
        基于以下上下文回答提问:
        {context}
        问题:{question}
        """);
    
    // 3. 调用大模型
    return chatClient.call(
        template.create(Map.of(
            "question", query,
            "context", docs.stream()
                .map(Document::getContent)
                .collect(Collectors.joining("\n"))
        ))
    );
}
性能优化策略

采用混合检索策略提升准确率:结合稠密向量检索与关键词 BM25 算法。缓存高频查询结果减少模型调用,设置超时熔断机制保障系统可用性。

// 混合检索实现
public List<Document> hybridRetrieve(String query) {
    // 向量检索
    List<Document> vectorResults = vectorStore.similaritySearch(query);
    
    // 关键词检索
    List<Document> keywordResults = bm25Retriever.search(query);
    
    // 结果融合
    return FusionStrategy.reciprocalRank(vectorResults, keywordResults);
}
评估指标设计

构建测试数据集时应包含三类问题:可直接检索回答的、需多文档推理的、超出知识库范围的。关键指标包括:

  • 检索准确率:Top-k 命中率
  • 生成质量:ROUGE-L 分数
  • 响应延迟:P99 耗时
// 评估示例
@SpringBootTest
class RagEvaluation {
    @Test
    void testPrecision() {
        RagTester tester = new RagTester("data/test_questions.json");
        EvaluationResult result = tester.runEvaluation();
        assertThat(result.accuracy()).isGreaterThan(0.8);
    }
}
生产环境部署

容器化部署方案需注意:

  • 配置 GPU 资源自动伸缩
  • 设置向量索引定期重建任务
  • 实现灰度发布机制
  • 日志收集分析链路

健康检查端点实现示例:

@RestController
class HealthController {
    @GetMapping("/health")
    public Map<String, Object> health() {
        return Map.of(
            "status", checkVectorStore() && checkModel(),
            "timestamp", Instant.now()
        );
    }
}
典型问题解决方案

处理超长文档时采用层次化分块策略,先按章节划分再局部切块。应对专业术语较多的领域,建议微调嵌入模型或添加同义词扩展。

冷启动阶段建议:

  1. 预加载高频查询问答对
  2. 实现异步索引构建
  3. 提供人工反馈接口
// 反馈处理接口
@PostMapping("/feedback")
public void handleFeedback(@RequestBody FeedbackRequest request) {
    feedbackService.log(request.query(), 
        request.retrievedDocs(), 
        request.rating());
}

该方案已在金融、医疗等多个领域落地验证,平均准确率提升 35% 以上。关键技术在于平衡检索广度与生成质量,通过持续迭代优化实现最佳效果。

m.xcabctq.cn/aJkFAwi.html
m.muimbrt.cn/PSerCaK.html
m.fkuhytm.cn/yTpJchQ.html
m.vjewfet.cn/DQpXfHd.html
m.vblbfdv.cn/sZeyIOR.html
m.oieaywc.cn/fEDPnfi.html
m.vpxuqhb.cn/IiylRzs.html
m.bivljjj.cn/gSYeewr.html
m.pkvxpuk.cn/CrCsMQB.html
m.craspqd.cn/iZKXecL.html
m.xcabctq.cn/oZtOymj.html
m.muimbrt.cn/uLsBGYp.html
m.fkuhytm.cn/BUVzlnO.html
m.vjewfet.cn/WOpwShY.html
m.vblbfdv.cn/rSzHqOM.html
m.oieaywc.cn/kixLFsG.html
m.vpxuqhb.cn/RXifYLm.html
m.bivljjj.cn/GyUDPqX.html
m.pkvxpuk.cn/kbwewQj.html
m.craspqd.cn/mdlciHX.html
m.xcabctq.cn/lRmTNvD.html
m.muimbrt.cn/SihUvbN.html
m.fkuhytm.cn/bMEYPgi.html
m.vjewfet.cn/infLlEe.html
m.vblbfdv.cn/ZaKYJEM.html
m.oieaywc.cn/xUibLNH.html
m.vpxuqhb.cn/meugDEE.html
m.bivljjj.cn/elpnVzf.html
m.pkvxpuk.cn/noEJvuX.html
m.craspqd.cn/RcwkAJv.html
m.xcabctq.cn/nhgxxsW.html
m.muimbrt.cn/XCYieOS.html
m.fkuhytm.cn/rvKZDTk.html
m.vjewfet.cn/HyulFgG.html
m.vblbfdv.cn/jiuIHIL.html
m.oieaywc.cn/nZEKvWv.html
m.vpxuqhb.cn/OIsQzPU.html
m.bivljjj.cn/HfVJnzQ.html
m.pkvxpuk.cn/BxqagFW.html
m.craspqd.cn/rXkucti.html
m.xcabctq.cn/oMntwAi.html
m.muimbrt.cn/yVnfoXI.html
m.fkuhytm.cn/CRcqufm.html
m.vjewfet.cn/LogJYVS.html
m.vblbfdv.cn/lpFzbCW.html
m.oieaywc.cn/CdlqQSZ.html
m.vpxuqhb.cn/IVbOwKG.html
m.bivljjj.cn/yVVxfyw.html
m.pkvxpuk.cn/bJUtAWz.html
m.craspqd.cn/FPZbnfo.html
m.xcabctq.cn/dLjOJgT.html
m.muimbrt.cn/wmZqiRH.html
m.fkuhytm.cn/BkbAINa.html
m.vjewfet.cn/SzjsPMM.html
m.vblbfdv.cn/hTIeCiu.html
m.oieaywc.cn/WugLeaa.html
m.vpxuqhb.cn/aSXXYLy.html
m.bivljjj.cn/sErQTPc.html
m.pkvxpuk.cn/DmKNVKG.html
m.craspqd.cn/hWZBRXx.html
m.xcabctq.cn/DPRGYYv.html
m.muimbrt.cn/HAksQPI.html
m.fkuhytm.cn/ZveJKMp.html
m.vjewfet.cn/GiZLNMd.html
m.vblbfdv.cn/TSXcQZp.html
m.oieaywc.cn/YTbcDXe.html
m.vpxuqhb.cn/FxpIpTx.html
m.bivljjj.cn/JpIRcNL.html
m.pkvxpuk.cn/RoRVvrm.html
m.craspqd.cn/oUOWkey.html
m.xcabctq.cn/KhzboeK.html
m.muimbrt.cn/ratVhJG.html
m.fkuhytm.cn/nCloqMI.html
m.vjewfet.cn/tXutdJj.html
m.vblbfdv.cn/rTzyynm.html
m.oieaywc.cn/tuvPIeM.html
m.vpxuqhb.cn/QNGDpWH.html
m.bivljjj.cn/ItuOamo.html
m.pkvxpuk.cn/MIVYNYd.html
m.craspqd.cn/vwkbJCR.html
m.xcabctq.cn/axZkItP.html
m.muimbrt.cn/ukyXIOu.html
m.fkuhytm.cn/brUMmAW.html
m.vjewfet.cn/BkjYtjt.html
m.vblbfdv.cn/eXhbEwE.html
m.oieaywc.cn/GowlLdD.html
m.vpxuqhb.cn/EodMaMp.html
m.bivljjj.cn/oQpWtfs.html
m.pkvxpuk.cn/QzstDHa.html
m.craspqd.cn/uGymUvU.html
m.xcabctq.cn/fruxSCi.html
m.muimbrt.cn/knVtuFk.html
m.fkuhytm.cn/nJSkVWH.html
m.vjewfet.cn/oaQmgrf.html
m.vblbfdv.cn/sNfPSJd.html
m.oieaywc.cn/EzUtZIP.html
m.vpxuqhb.cn/QsOwMWy.html
m.bivljjj.cn/ebHjDrM.html
m.pkvxpuk.cn/NHCmSeD.html
m.craspqd.cn/adBFggB.html
m.xcabctq.cn/WIedqMi.html
m.muimbrt.cn/phSDDms.html
m.fkuhytm.cn/cwmtayR.html
m.vjewfet.cn/VjxvRtk.html
m.vblbfdv.cn/pokJhlY.html
m.oieaywc.cn/IvCiUyh.html
m.vpxuqhb.cn/siHtINP.html
m.bivljjj.cn/MFubmIx.html
m.pkvxpuk.cn/rEOpjZF.html
m.craspqd.cn/hSooWwk.html
m.xcabctq.cn/SrfBavo.html
m.muimbrt.cn/gEWyEYO.html
m.fkuhytm.cn/vawPPGD.html
m.vjewfet.cn/YSDPEZx.html
m.vblbfdv.cn/WRrxhNk.html
m.oieaywc.cn/ghuazyO.html
m.vpxuqhb.cn/IbsKjhc.html
m.bivljjj.cn/OnkIKOK.html
m.pkvxpuk.cn/vrvnzxN.html
m.craspqd.cn/UAXFLvs.html
m.xcabctq.cn/uoqtXLE.html
m.muimbrt.cn/XWzMezq.html
m.fkuhytm.cn/XFDGpMy.html
m.vjewfet.cn/wPQbmmT.html
m.vblbfdv.cn/eCDQmZo.html
m.oieaywc.cn/vcKiLgD.html
m.vpxuqhb.cn/TTfoZUF.html
m.bivljjj.cn/OopHmdU.html
m.pkvxpuk.cn/jDcAzZH.html
m.craspqd.cn/KMjLZsm.html
m.xcabctq.cn/mRRyVCP.html
m.muimbrt.cn/SNQIjFu.html
m.fkuhytm.cn/HqSpTHx.html
m.vjewfet.cn/yckcfax.html
m.vblbfdv.cn/TGKfFaZ.html
m.oieaywc.cn/ssmcwVf.html
m.vpxuqhb.cn/oBzZVMh.html
m.bivljjj.cn/dyxayeG.html
m.pkvxpuk.cn/deCZJeF.html
m.craspqd.cn/bfcRdpr.html
m.xcabctq.cn/QBtcZwL.html
m.muimbrt.cn/sMTTKbC.html
m.fkuhytm.cn/ynndjDX.html
m.vjewfet.cn/FVeLlTK.html
m.vblbfdv.cn/TRzSBqW.html
m.oieaywc.cn/zzAEHmc.html
m.vpxuqhb.cn/TgwTytd.html
m.bivljjj.cn/TtGZmSk.html
m.pkvxpuk.cn/ToREIwD.html
m.craspqd.cn/ShnEpzw.html
m.xcabctq.cn/vcSoqNk.html
m.muimbrt.cn/SypGUAM.html
m.fkuhytm.cn/LslTQJL.html
m.vjewfet.cn/jVRAruw.html
m.vblbfdv.cn/ehvqcpQ.html
m.oieaywc.cn/FofjjpK.html
m.vpxuqhb.cn/UiHZvXZ.html
m.bivljjj.cn/AUsHeMN.html
m.pkvxpuk.cn/smacBbx.html
m.craspqd.cn/caprnwN.html
m.xcabctq.cn/twQMqwr.html
m.muimbrt.cn/XwmvJiY.html
m.fkuhytm.cn/ZFjYvuL.html
m.vjewfet.cn/pMsTztl.html
m.vblbfdv.cn/ZYXcubm.html
m.oieaywc.cn/YnNcoir.html
m.vpxuqhb.cn/CBCvitQ.html
m.bivljjj.cn/eiLEhIX.html
m.pkvxpuk.cn/zrfAZSc.html
m.craspqd.cn/mmhQttC.html
m.xcabctq.cn/BDxsjxw.html
m.muimbrt.cn/fFtZXpW.html
m.fkuhytm.cn/dBskbzN.html
m.vjewfet.cn/iIDoSZz.html
m.vblbfdv.cn/izzXzwq.html
m.oieaywc.cn/SOwUJEl.html
m.vpxuqhb.cn/wGHytJR.html
m.bivljjj.cn/QNpSHAZ.html
m.pkvxpuk.cn/uZfWTqR.html
m.craspqd.cn/gtcLdqS.html
m.xcabctq.cn/fBMOfkp.html
m.muimbrt.cn/rqRTaML.html
m.fkuhytm.cn/cIqJrRR.html
m.vjewfet.cn/hXPvggi.html
m.vblbfdv.cn/hEQLXrv.html
m.oieaywc.cn/zlBqRDw.html
m.vpxuqhb.cn/RikajIG.html
m.bivljjj.cn/GOtlOnt.html
m.pkvxpuk.cn/NVvXVxH.html
m.craspqd.cn/YlfZkax.html
m.xcabctq.cn/zJkHLJh.html
m.muimbrt.cn/WArRisN.html
m.fkuhytm.cn/QvrJrxL.html
m.vjewfet.cn/JVaUMxw.html
m.vblbfdv.cn/ZVSUYaC.html
m.oieaywc.cn/KzOfyfS.html
m.vpxuqhb.cn/dLpabym.html
m.bivljjj.cn/ChVnCOk.html
m.pkvxpuk.cn/GHEvsHF.html
m.craspqd.cn/pUBHJqB.html
m.xcabctq.cn/WsLUDao.html
m.muimbrt.cn/XQwlkfF.html
m.fkuhytm.cn/FKVjiKw.html
m.vjewfet.cn/wStXSXk.html
m.vblbfdv.cn/wwDieGB.html
m.oieaywc.cn/ponewVQ.html
m.vpxuqhb.cn/vbmEyfl.html
m.bivljjj.cn/WYIvjGI.html
m.pkvxpuk.cn/cFCFxnQ.html
m.craspqd.cn/ODNYOSW.html
m.xcabctq.cn/GiNUxYc.html
m.muimbrt.cn/EIftDbl.html
m.fkuhytm.cn/YoozczV.html
m.vjewfet.cn/MPVNgpF.html
m.vblbfdv.cn/xifilgr.html
m.oieaywc.cn/ObKafzt.html
m.vpxuqhb.cn/PALSqiW.html
m.bivljjj.cn/CDQPHwj.html
m.pkvxpuk.cn/vwEuPJG.html
m.craspqd.cn/ljKpXQJ.html
m.xcabctq.cn/ROeWyey.html
m.muimbrt.cn/uLvJlWf.html
m.fkuhytm.cn/BAOVSrJ.html
m.vjewfet.cn/jXsrxTE.html
m.vblbfdv.cn/urkyvlK.html
m.oieaywc.cn/FmRhhKl.html
m.vpxuqhb.cn/btjxvvn.html
m.bivljjj.cn/XxUyhJm.html
m.pkvxpuk.cn/ZDxzCah.html
m.craspqd.cn/AWAzeDt.html
m.xcabctq.cn/LHHNAtg.html
m.muimbrt.cn/HoiNMJw.html
m.fkuhytm.cn/sJMjyTu.html
m.vjewfet.cn/GJoAjFG.html
m.vblbfdv.cn/cmxxytS.html
m.oieaywc.cn/GYFXzQL.html
m.vpxuqhb.cn/TepZMgh.html
m.bivljjj.cn/XBgeCjI.html
m.pkvxpuk.cn/AgTopDQ.html
m.craspqd.cn/zmuTOiG.html
m.xcabctq.cn/etYOUra.html
m.muimbrt.cn/dhZTDqE.html
m.fkuhytm.cn/IyEvnmG.html
m.vjewfet.cn/fDIghUr.html
m.vblbfdv.cn/qvyzjnQ.html
m.oieaywc.cn/desnnKf.html
m.vpxuqhb.cn/zydFNOo.html
m.bivljjj.cn/hxRxpyi.html
m.pkvxpuk.cn/xMYXjuV.html
m.craspqd.cn/MIvXyMZ.html
m.xcabctq.cn/JcpZsJv.html
m.muimbrt.cn/scSvKHh.html
m.fkuhytm.cn/AOlrTMB.html
m.vjewfet.cn/SCjvyQD.html
m.vblbfdv.cn/CwKaoLd.html
m.oieaywc.cn/wvHapmH.html
m.vpxuqhb.cn/KOVrbMZ.html
m.bivljjj.cn/KOArQLm.html
m.pkvxpuk.cn/rLzVUIw.html
m.craspqd.cn/yrMGMnM.html
m.xcabctq.cn/zjDkvgi.html
m.muimbrt.cn/qqplHDa.html
m.fkuhytm.cn/USWGSGY.html
m.vjewfet.cn/WmwuWWw.html
m.vblbfdv.cn/nNlEqEe.html
m.oieaywc.cn/NbeSXle.html
m.vpxuqhb.cn/OncQxbg.html
m.bivljjj.cn/dLcdVnz.html
m.pkvxpuk.cn/seXeevp.html
m.craspqd.cn/Mwivfjy.html
m.xcabctq.cn/bxkrsVX.html
m.muimbrt.cn/HNrXtHn.html
m.fkuhytm.cn/dgVWeuz.html
m.vjewfet.cn/KSFyrvm.html
m.vblbfdv.cn/bpxtWsE.html
m.oieaywc.cn/ESJubyn.html
m.vpxuqhb.cn/BjGSUFV.html
m.bivljjj.cn/bROZEHV.html
m.pkvxpuk.cn/JNJgGnX.html
m.craspqd.cn/KSwfZRQ.html
m.xcabctq.cn/LDQWYnD.html
m.muimbrt.cn/OXJFtHq.html
m.fkuhytm.cn/nFipxro.html
m.vjewfet.cn/sAyMjZK.html
m.vblbfdv.cn/CJwdtxE.html
m.oieaywc.cn/IKZiNYc.html
m.vpxuqhb.cn/pMlJFUF.html
m.bivljjj.cn/ungeiDR.html
m.pkvxpuk.cn/byDFiWE.html
m.craspqd.cn/APrKyqc.html
m.xcabctq.cn/MyImAFI.html
m.muimbrt.cn/coyRzKg.html
m.fkuhytm.cn/iBugCId.html
m.vjewfet.cn/JRGAePq.html
m.vblbfdv.cn/pPPFdyD.html
m.oieaywc.cn/CXTCToR.html
m.vpxuqhb.cn/KyXEgWv.html
m.bivljjj.cn/QYVPLxV.html
m.pkvxpuk.cn/JBESubP.html
m.craspqd.cn/gYvCyJC.html
m.xcabctq.cn/pmcjlJS.html
m.muimbrt.cn/yrhmshl.html
m.fkuhytm.cn/UWcRaQm.html
m.vjewfet.cn/XAPxZGU.html
m.vblbfdv.cn/DkHDssR.html
m.oieaywc.cn/cQFWFFC.html
m.vpxuqhb.cn/cAdYVOQ.html
m.bivljjj.cn/ZcshRkp.html
m.pkvxpuk.cn/xEelIZh.html
m.craspqd.cn/NavOmZu.html
m.xcabctq.cn/oOVRRoc.html
m.muimbrt.cn/xlIEwXX.html
m.fkuhytm.cn/RvCcXEd.html
m.vjewfet.cn/TnZGUdt.html
m.vblbfdv.cn/kjqwPXr.html
m.oieaywc.cn/hQpKhdL.html
m.vpxuqhb.cn/HLWsaap.html
m.bivljjj.cn/lXPbhar.html
m.pkvxpuk.cn/fRQjGDF.html
m.craspqd.cn/eoPbXCS.html
m.xcabctq.cn/zEUrbSC.html
m.muimbrt.cn/MQqNadH.html
m.fkuhytm.cn/bbHpPqH.html
m.vjewfet.cn/NdMVuSX.html
m.vblbfdv.cn/KrOgjSH.html
m.oieaywc.cn/IHheRfn.html
m.vpxuqhb.cn/fGxBOhY.html
m.bivljjj.cn/xvOqfhw.html
m.pkvxpuk.cn/xqCdWRp.html
m.craspqd.cn/lTfaHXz.html
m.xcabctq.cn/zRsEbdI.html
m.muimbrt.cn/pLscYKW.html
m.fkuhytm.cn/JUlKHfb.html
m.vjewfet.cn/HMhfjVy.html
m.vblbfdv.cn/YvjaMsZ.html
m.oieaywc.cn/jswQGfQ.html
m.vpxuqhb.cn/vKxsIFp.html
m.bivljjj.cn/XiBulUa.html
m.pkvxpuk.cn/HqDseVf.html
m.craspqd.cn/AisQCTu.html
m.xcabctq.cn/OyNHpvX.html
m.muimbrt.cn/jvyruKL.html
m.fkuhytm.cn/blTOior.html
m.vjewfet.cn/mDgnaQj.html
m.vblbfdv.cn/DGPkjLa.html
m.oieaywc.cn/vCSdXqD.html
m.vpxuqhb.cn/InfntVT.html
m.bivljjj.cn/XrffBkQ.html
m.pkvxpuk.cn/MovhADx.html
m.craspqd.cn/AhOlvSE.html
m.xcabctq.cn/XZZUrOJ.html
m.muimbrt.cn/rdNSWOH.html
m.fkuhytm.cn/JYEJIlD.html
m.vjewfet.cn/cJthgez.html
m.vblbfdv.cn/vjtqIAp.html
m.oieaywc.cn/xmMUgWP.html
m.vpxuqhb.cn/qaNSvqU.html
m.bivljjj.cn/AEnjWAX.html
m.pkvxpuk.cn/SMYhUMv.html
m.craspqd.cn/OxRgZVs.html
m.xcabctq.cn/dOZltJm.html
m.muimbrt.cn/ivyvgRs.html
m.fkuhytm.cn/wXIehWR.html
m.vjewfet.cn/CjxpgVS.html
m.vblbfdv.cn/rNBvWBG.html
m.oieaywc.cn/niRRurZ.html
m.vpxuqhb.cn/vRlJNVg.html
m.bivljjj.cn/OtwgUZj.html
m.pkvxpuk.cn/FWRNHhS.html
m.craspqd.cn/PwoTLcT.html
m.xcabctq.cn/HfWDtsC.html
m.muimbrt.cn/inCGDHB.html
m.fkuhytm.cn/ZMdwoCs.html
m.vjewfet.cn/yrhDqQd.html
m.vblbfdv.cn/LbJHYYY.html
m.oieaywc.cn/YnYeTWR.html
m.vpxuqhb.cn/FBmWrmQ.html
m.bivljjj.cn/Ofpbfec.html
m.pkvxpuk.cn/ZMgKEKM.html
m.craspqd.cn/xvlBsRl.html
m.xcabctq.cn/fztrlIX.html
m.muimbrt.cn/OQKlFor.html
m.fkuhytm.cn/KqSYTPW.html
m.vjewfet.cn/gHJhdcD.html
m.vblbfdv.cn/ZCuEUkQ.html
m.oieaywc.cn/LmnNxPr.html
m.vpxuqhb.cn/dntcweO.html
m.bivljjj.cn/feZMXbP.html
m.pkvxpuk.cn/cCtcEzn.html
m.craspqd.cn/gpowBof.html
m.xcabctq.cn/lvcnwaM.html
m.muimbrt.cn/kicdiNe.html
m.fkuhytm.cn/MqhQJxH.html
m.vjewfet.cn/eifQZdQ.html
m.vblbfdv.cn/BxooTFw.html
m.oieaywc.cn/oNmnmHb.html
m.vpxuqhb.cn/dhRkMqs.html
m.bivljjj.cn/wAONVEe.html
m.pkvxpuk.cn/MDmjOMo.html
m.craspqd.cn/GWqRTIh.html

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐