Qwen集成clickhouse实现RAG

一、RAG概要   

      RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合了信息检索技术与语言生成模型的人工智能技术。旨在通过检索相关文档来增强大模型的生成能力,从而提高预测的质量和准确性。RAG模型在生成文本或回答问题时,会先从一个庞大的文档集合中检索相关信息,然后利用这些信息来指导文本的生成。

 1、RAG的作用

       通用大模型存在知识局限性、幻觉问题、数据安全等问题,解决这些问题目前主流的有两种方式,大模型微调和RAG,大模型微调实时性较差,训练成本较高,准确率高,而RAG恰恰相反,虽然准确率不如微调,但是对于小企业来说,经济实惠。

(1) 知识的局限性

      模型自身的知识完全源于它的训练数据,而现有的主流大模型的训练集基本都是构建于网络公开的数据,对于一些实时性的、非公开的或离线的数据是无法获取到的。

(2)幻觉问题

       所有的AI模型的底层原理都是基于数学概率,其模型输出实质上是一系列数值运算,大模型也不例外,所以它经常会一本正经地胡说八道,尤其是在大模型自身不具备某一方面的知识或不擅长的场景。

(3)数据安全性

      对于企业来说,数据安全至关重要,没有企业愿意承担数据泄露的风险,将自身的私域数据上传第三方平台进行训练。这也导致完全依赖通用大模型自身能力的应用方案不得不在数据安全和效果方面进行取舍。

2、RAG工作原理

        RAG工作总体来说,分索引和检索两个阶段

(1)索引阶段

       索引阶段主要是准备数据:数据提取——>文本分割——>向量化(embedding)——>数据入库

     Indexing

 (2)检索阶段

        检索阶段主要是应用阶段:用户提问——>数据检索(召回)——>注入Prompt——>LLM返回

      Retrieval

 二、实现案例

  1、集成RAG相关框架

      jar包依赖

    implementation group: 'dev.langchain4j', name: 'langchain4j-spring-boot-starter', version: '1.0.0-beta4'
    // **** langchain4j整合千问dashscope
    implementation group: 'dev.langchain4j', name: 'langchain4j-community-dashscope-spring-boot-starter', version: '1.0.0-beta4'
    /// **** langchain4j整合RAG
    implementation group: 'dev.langchain4j', name: 'langchain4j-easy-rag', version: '1.0.0-beta4'
    /// **** langchain4j整合clickhouse
    implementation group: 'dev.langchain4j', name: 'langchain4j-community-clickhouse', version: '1.0.0-beta4'

     yaml配置

langchain4j:
  ## https://docs.langchain4j.dev/integrations/language-models/dashscope
  community:
    dashscope:
      chat-model:
        api-key: 百炼平台申请
        model-name: qwen-plus
      embedding-model:
        api-key: 百炼平台申请
        model-name: text-embedding-v3

2、向量数据库存储配置

@Configuration
public class ChatRagConf {

    @Bean
    public   ClickHouseEmbeddingStore  clickHouseEmbeddingStore(QwenEmbeddingModel embeddingModel){
        Map<String, ClickHouseDataType> metadataTypeMap = new HashMap<>();
        ClickHouseSettings settings = ClickHouseSettings.builder()
                .url("http://192.168.109.200:8123")
                .table("rag_table")
                .username("rag")
                .password("123456")
                .dimension(embeddingModel.dimension())
                .metadataTypeMap(metadataTypeMap)
                .build();
        return ClickHouseEmbeddingStore.builder()
                .settings(settings)
                .build();
    }

    @Bean
    public ContentRetriever  contentRetriever(QwenEmbeddingModel embeddingModel){
       return EmbeddingStoreContentRetriever.builder()
                        .embeddingStore(clickHouseEmbeddingStore(embeddingModel))
                .embeddingModel(embeddingModel)
                .maxResults(1)  //  相似度匹配
                .minScore(0.5)
                .build();
    }

}
@AiService
public interface DashScopeAssistant {

    @SystemMessage("Answer using slang")
    String chat(@MemoryId String  chatId, @UserMessage  String userMessage);

}
    private final ClickHouseEmbeddingStore  clickHouseEmbeddingStore;

    private final QwenEmbeddingModel embeddingModel;

    private final DashScopeAssistant  assistant;

    private final Logger LOGGER = LoggerFactory.getLogger(DashScopeRagService.class);


    @Autowired
    public DashScopeRagService(QwenChatModel qwenChatModel,QwenEmbeddingModel embeddingModel, ClickHouseEmbeddingStore  clickHouseEmbeddingStore,ContentRetriever  contentRetriever) {
       this.clickHouseEmbeddingStore = clickHouseEmbeddingStore;
       this.embeddingModel = embeddingModel;
        assistant = AiServices.builder(DashScopeAssistant.class).
                chatModel(qwenChatModel).
                contentRetriever(contentRetriever).
                chatMemoryProvider(memoryId ->
                        MessageWindowChatMemory.builder().
                                id(memoryId).
                                maxMessages(10).
                                chatMemoryStore(new InMemoryChatMemoryStore()).

                                build()).
                build();
    }

 3、私域数据向量化


    /**
     * 将大模型外部的知识库文本生成向量存入向量数据库
     */
    public  void  textSegmentEmbeddingStore(){
        ///
        TextSegment textSegment1 = TextSegment.from("金庸、古龙、梁羽生、温瑞安被称为武侠四大家");
        TextSegment textSegment2 = TextSegment.from("古龙小说三大元素:江湖、美酒、美人。");
        TextSegment textSegment3 = TextSegment.from("金庸侠之大者为国为民");
        clickHouseEmbeddingStore.add(embeddingModel.embed(textSegment1).content(),textSegment1);
        clickHouseEmbeddingStore.add(embeddingModel.embed(textSegment2).content(),textSegment2);
        clickHouseEmbeddingStore.add(embeddingModel.embed(textSegment3).content(),textSegment3);
    }

        查询clickhouse向量化后的数据

 4、向量检索

    public   void  chatRAG(String memoryId,String  prompt){
        LOGGER.info("chatRAG   start  ======");
        String answer = assistant.chat(memoryId,prompt);
        LOGGER.info("chatRAG   answer  ======{}",answer);
    }
chatRAG("103","请介绍武侠三大家");

       大模型返回结果

### Qwen-VL与RAG技术详解 #### 多模态检索增强生成(Retrieval-Augmented Generation, RAG) 多模态检索增强生成是一种结合了外部知识库的检索能力和神经网络的强大生成能力的技术。对于像Qwen-VL这样的大规模视觉语言模型来说,通过集成RAG可以显著提升理解复杂场景的能力并提供更精准的回答。 #### 技术详情 Qwen-VL采用了一种基于Transformer架构的设计,在此基础上加入了专门针对视觉数据优化的功能模块。当涉及到RAG时,该过程通常分为两步: 1. **检索阶段**:给定一个查询(可能是文本描述或图片),系统会先利用预训练好的编码器来提取特征向量表示;随后这些特征被用来索引预先构建的知识图谱或其他形式的数据集,从中找出最相关的条目。 2. **生成阶段**:接着上述找到的相关信息会被送入解码端作为上下文线索之一参与最终输出序列预测的任务中去。此过程中不仅考虑到了原始输入本身还融合进了额外获取来的背景资料从而使得回复更加全面准确[^2]。 #### 实现方式 为了实现这一目标,开发者们往往会选择如下路径来进行开发工作: - 构建高效的索引结构以便快速定位相似项; - 设计合理的评分函数用于衡量候选对象之间的匹配度高低; - 对于跨媒体类型的情况,则需特别注意如何统一不同源之间存在的差异性题比如尺度变换、语义鸿沟等挑战[^4]。 此外,考虑到实际应用场景中的性能需求,还需要对整个流程做进一步优化以确保实时响应特性不受影响。这可能涉及GPU加速计算资源分配策略调整等方面的工作。 #### 使用教程 以下是简化版的操作指南供初学者参考学习: ```bash # 安装必要的依赖包 pip install qwen-vl rag-toolkit torch transformers # 加载预训练模型 from qwen_vl import QwenVLModel model = QwenVLModel.from_pretrained('path_to_model') # 准备好要处理的数据样本 (这里假设是一个图像文件) image_path = "example.jpg" # 执行推理操作获得结果 result = model(image=image_path).generate() print(result) ``` 这段代码展示了怎样加载指定版本的Qwen-VL模型并对单张照片执行分析任务的过程。当然真实项目里可能会遇到更多复杂的状况因此建议深入研究官方文档及相关案例加深理解掌握技巧[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值