高级RAG特性之一 - 查询压缩

一、背景

不管是在RAG还是AI对话的场景,为了能让AI更好的理解当前问题,往往会把历史对话跟当前问题一并发送。

携带历史记录的好处很明显,就是可以让AI充分理解上下文,回答更准确。

缺点也很明显:

  • 请求内容大,消耗token多;
  • 可能有很多跟当次请求无关的内容,影响AI对问题的理解速度;

二、例子

USER:详细描述孙悟空的生平及主要事迹
AI:孙悟空是。。。。(很长的内容)
USER:他是哪一年出生的?

AI回复的内容很长,如果在用户提问“他是哪一年出生的?”这个问题时,把历史记录跟问题一并发送给AI,除了可能会超出AI接口的最大请求token数,还会影响AI的回复速度。但是如果把历史记录去掉,不跟随用户问题一起发送,则AI会无法理解用户问题中的“他”指的是什么。

三、解决方法

将历史记录与用户问题提炼压缩,将长文本内容压缩成直指问题核心的AI可以理解的短文本。

整个过程其实就是将历史记录与用户提问交给AI,让AI来提炼压缩。此时执行压缩工作的AI可以选用支持长文本的AI,不一定是真正回答问题的AI。

最终发送给AI的问题可能是:

USER:孙悟空是哪一年出生的?

整体流程如下:

四、代码实现

langchain4j的示例:

ChatLanguageModel chatLanguageModel = OpenAiChatModel.builder()
        .apiKey(OPENAI_API_KEY)
        .build();

// We will create a CompressingQueryTransformer, which is responsible for compressing
// the user's query and the preceding conversation into a single, stand-alone query.
// This should significantly improve the quality of the retrieval process.
QueryTransformer queryTransformer = new CompressingQueryTransformer(chatLanguageModel);

ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
        .embeddingStore(embeddingStore)
        .embeddingModel(embeddingModel)
        .maxResults(2)
        .minScore(0.6)
        .build();

// The RetrievalAugmentor serves as the entry point into the RAG flow in LangChain4j.
// It can be configured to customize the RAG behavior according to your requirements.
// In subsequent examples, we will explore more customizations.
RetrievalAugmentor retrievalAugmentor = DefaultRetrievalAugmentor.builder()
        .queryTransformer(queryTransformer)
        .contentRetriever(contentRetriever)
        .build();

AiServices.builder(Assistant.class)
        .chatLanguageModel(chatLanguageModel)
        .retrievalAugmentor(retrievalAugmentor)
        .chatMemory(MessageWindowChatMemory.withMaxMessages(10))
        .build();

更多实践代码可以到GitHub - langchain4j-aideepin上查看

### 配置 GLM4-9B 模型用于 RAG 实现 为了使 GLM4-9B 模型能够支持检索增强生成 (Retrieval-Augmented Generation, RAG),需要完成几个关键步骤来集成检索模块并调整模型输入输出流程。 #### 1. 准备环境与依赖项安装 确保已经成功部署了 GLM4-9B Chat 模型,并且可以正常工作。这通常涉及设置 Python 环境以及必要的库文件,如 `transformers` 和其他辅助工具[^1]。 ```bash pip install transformers datasets faiss-cpu torch ``` #### 2. 下载预训练模型 如果尚未下载模型,则可以通过执行特定命令来进行: ```bash python /root/autodl-tmp/download-model.py ``` 此过程可能耗时较长,因为模型体积较大(约 18GB),预计下载时间为 10 至 20 分钟不等[^2]。 #### 3. 构建索引数据库 对于 RAG 来说,构建一个高效的文档或片段存储系统至关重要。这里推荐使用 FAISS 或类似的向量相似度搜索引擎创建索引结构。该索引将保存大量文本数据供后续查询使用。 ```python from sentence_transformers import SentenceTransformer, util import faiss import numpy as np # 加载编码器模型 encoder_model = SentenceTransformer('all-MiniLM-L6-v2') # 假设已有待索引的数据列表 corpus_texts corpus_embeddings = encoder_model.encode(corpus_texts) # 初始化FAISS索引 dimension = len(corpus_embeddings[0]) index = faiss.IndexFlatIP(dimension) faiss.normalize_L2(corpus_embeddings) index.add(corpus_embeddings) ``` #### 4. 修改推理逻辑以包含检索功能 为了让 GLM4-9B 能够利用外部知识源,在原有基础上扩展其输入机制,使其能够在每次预测前先进行一次快速的信息检索操作。具体来说就是在调用模型之前加入一段代码用来获取最相关的几条记录作为上下文补充给定提示词。 ```python def retrieve_relevant_documents(query_text, top_k=5): query_embedding = encoder_model.encode([query_text], convert_to_tensor=True) hits = util.semantic_search(query_embedding, corpus_embeddings, top_k=top_k)[0] retrieved_docs = [corpus_texts(hit['corpus_id']) for hit in hits] return "\n".join(retrieved_docs) def generate_with_rag(prompt, model, tokenizer): context = retrieve_relevant_documents(prompt) full_input = f"{context}\n{prompt}" inputs = tokenizer(full_input, return_tensors="pt").to(model.device) outputs = model.generate(**inputs) generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) return generated_text ``` 通过上述方法,GLM4-9B 就可以在保持原有对话能力的同时获得来自外部资源的支持,从而更好地理解和回应复杂问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值