LLM+Embedding构建问答系统的局限性及优化方案

文章探讨了使用LLM和Embedding构建问答系统时遇到的局限,如模型耦合、召回精度低等问题。提出了通过意图识别、搜索召回优化、关键词提取等方法来提升系统性能。关键词提取采用传统NLP方法,如分词、词性标注、依存分析,以提高召回精度,减少LLM交互和时间开销。同时,强调了传统NLP技术在特定场景下的优势,如成分句法分析和名词短语提取,以解决多知识点聚合处理问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LangChain + LLM 方案的局限性:LLM意图识别准确性较低,交互链路长导致时间开销大;Embedding 不适合多词条聚合匹配等。

背景

在探索如何利用大型语言模型(LLM)构建知识问答系统的过程中,我们确定了两个核心步骤:

  1. 将用户提出的问题和知识库中的信息转换成嵌入向量(Embeddings),然后利用向量相似度技术来检索最相关的知识条目。
  2. 利用LLM来识别用户问题的意图,并对检索到的原始答案进行加工和整合,以提供更加精准和有用的回答。

然而,这种方法在实际应用中遇到了一些挑战:

  1. 上层应用与模型基础的紧耦合导致灵活性受限。每当需要更换或升级语言模型时,上层的应用逻辑也必须进行大量的调整。在LLM技术迅速发展的今天,由于成本、许可、技术热点和性能等多方面的考量,模型的变更几乎是不可避免的。
  2. 处理环节的不完善和高开发成本也是一个问题。例如,嵌入向量的存储和搜索、LLM的提示词生成、以及数据链路的处理(包括导入、分片和加工)等,如果这些环节都需要从头开发,将耗费大量的时间和资源。
  3. 缺乏标准化工具和组件也是一大挑战。为了能够根据不同场景灵活地组装和调整系统,我们需要的是一个像“乐高”一样的标准化组件库。

局限性分析

问题简介

多知识点聚合处理场景下,Embedding-Search 召回精度较低的问题。典型应用范式是:

  • 一个仓库有 N 条记录,每个记录有 M 个属性;
  • 用户希望对 x 条记录的y 个属性进行查询、对比、统计等处理。

这种场景在游戏攻略问答中很常见,以体育游戏 NBA2K Online2 为例:

# 多知识点——简单查询
Q: 皮蓬、英格利什和布兰德的身高、体重各是多少?

# 多知识点——筛选过滤
Q: 皮蓬、英格利什和布兰德谁的第一位置是 PF?

# 多知识点——求最值
Q: 皮蓬、英格利什和布兰德谁的金徽章数最多?

Embedding 缺陷

原始的 Embedding Search在面对多知识点聚合处理时,存在几个问题:

  • 本地知识建立索引时,通常对单个知识点进行 Embedding;通畅不会为不同知识点的排列组合分别制作索引,所有组合都建立索引的开销是巨大的。
  • 原始问题直接 Embedding ,和单条知识点的向量相似度比较低。为了避免召回结果有遗漏,就需要降低相似度评分下限(vector similarity score threshold),同时提高召回结果数量上限(top k)。这会产生不好的副效应:
    • 召回结果,有效信息密度大幅降低;score threshold 过高或 top k 过低,会导致某些有效知识点无法命中;反之则很多无效知识点或噪声会被引入。且由于总 token 数量的限制,导致本地知识点被截断,遗漏相似度较低但有效的知识点。
    • 召回结果的膨胀,增加了和 LLM 交互的 token 开销和 LLM 处理的时间复杂度。
    • 给 LLM 的分析处理带来额外噪声,影响最终答案的正确性。

方案分析

想要更加精准的回答问题,需要从两个层面入手:

1. 问题理解—准确识别用户意图

为了准确理解用户的意图,问答系统需要能够:

  1. 解析用户问题:系统需要通过分析用户的提问来识别他们的意图。
  2. 制定计划:根据识别的意图,系统需要拆分问题为多个步骤,并为每个步骤选择合适的工具或方法。
  3. 多轮交互:使用Agents和Chains等工具,系统可以通过多轮对话来逐步明确用户的需求。

在LangChain框架中,Agents 可以帮助系统规划并执行这些步骤。例如,Plan-and-Execute Agents可以用来制定动作计划,而Action Agents则负责执行这些动作。

  • HyDE。Precise Zero-Shot Dense Retrieval without Relevance Labels 是面向 Zero-Shot场景下的稠密检索。它使用基础模型在训练过程中已经掌握的相关语料,面向用户问题,生成虚构的文档。这些文档的作用,不是输出最终结果,而是通过LLM(大型语言模型)对问题的理解能力,生成与之相关的内容。这相当于自动化生成相关性标签,避免外部输入。生成虚构文档后,再使用无监督检索器进行Embedding;然后将生成的向量在本地知识库中进行相似性检索,寻找最终结果。

HyDE 要求与用户问题相关的知识,已经存在于 LLM 基础模型中。但专业领域知识,可能本来就是未联网、未公开的;LLM 生成的虚构文档,可能包含很多噪音,所以效果不一定很明显;另外生成文档的额外交互,进一步增加了时间开销。目前,LangChain 提供了 HyDE ChainLlamaIndex 也提供了类似的能力;面对中文可能需要自定义 Prompt Template。

  • 意图识别。通过 命名实体识别 和 槽位填充 实现。概括来说就是:
    • 在为用户提供服务的预设场景下,细分用户各种意图的类别,定制对应的语义槽,每个槽位可以视为在语义层面体现意图的基本单位。
    • 通过深度学习、统计学习,甚至 LLM ,理解用户问题提取语义槽中需要的内容。在基于大语言模型构建知识问答系统一文中给过例子:通过 System Role 告知LLM 需要提取槽位信息,让 LLM通过多轮对话引导用户给出所有槽位信息。还是以游戏攻略为例,玩家咨询球员的打法,那么必须提供:球员姓名,年代(比如2020/2022 年),比赛模式。对应的语义槽可以定义为:
    "球员打法"
<think>嗯,用户之前问了关于在本地使用DeepSeek模型的方案,现在又问Llama2+本地RAG构建。我需要先理解这两个概念的关系。用户可能是想了解如何结合Llama2和RAG来搭建本地问答系统,作为开源替代方案。 首先,得确认用户对RAG的理解程度。RAG是检索增强生成,结合了检索和生成模型。Llama2是Meta的开源大模型,适合本地部署。用户可能想知道具体的步骤,比如如何准备数据、选择模型、搭建系统。 用户之前得到过关于DeepSeek官方和开源方案的对比,现在转向具体实现的开源方案。需要详细说明Llama2和RAG的结合方法,可能包括技术选型、步骤、代码示例,以及优缺点。 要注意用户可能的技术背景,可能是开发者或研究人员,需要实用指导。需要分步骤讲解,从数据准备到部署,给出代码示例,比如使用Hugging Face的模型和ChromaDB。 还要考虑用户可能遇到的挑战,比如显存不足、检索效果优化、模型微调等,给出注意事项和建议。对比之前的回答,保持结构一致,但更聚焦在Llama2和RAG的结合上。 最后,总结适用场景,帮助用户决定是否选择这个方案。确保语言通俗,避免过多术语,但作为技术方案,适当的技术细节是必要的。可能需要检查是否有遗漏的步骤或潜在问题,比如数据预处理的重要性,或者模型选择的替代方案。</think>以下是关于使用 **Llama2 + 本地RAG** 构建本地问答系统的技术方案详解: --- ### **核心架构原理** ```mermaid graph LR A[用户提问] --> B(文本向量化) B --> C[向量数据库检索] C --> D[构建Prompt] D --> E[Llama2生成回答] E --> F[最终答案] ``` 通过 **检索增强生成(RAG)** 将外部知识库与Llama2结合,突破大模型固有知识限制,实现精准的领域知识问答。 --- ### **技术实现六步曲** #### **1. 知识库准备** - 支持格式:PDF/TXT/Markdown/数据库 - 预处理代码示例: ```python from langchain.document_loaders import DirectoryLoader # 加载本地文档 loader = DirectoryLoader('./docs', glob='**/*.txt') documents = loader.load() # 文本分割 from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) chunks = text_splitter.split_documents(documents) ``` #### **2. 向量化引擎选择** - 推荐方案: ```python # 中文Embedding模型 from langchain.embeddings import HuggingFaceEmbeddings embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5") # 英文场景可替换为: # embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") ``` #### **3. 向量数据库搭建** - ChromaDB本地部署方案: ```python from langchain.vectorstores import Chroma # 持久化存储向量库 vectordb = Chroma.from_documents( documents=chunks, embedding=embeddings, persist_directory="./chroma_db" ) ``` #### **4. Llama2本地部署** - 最低硬件要求: ```markdown - 7B版本:RTX 3090(24GB) *1 - 13B版本:RTX 3090 *2 - 70B版本:需要A100(80GB) *4 ``` - 使用vLLM加速推理: ```python from vllm import LLM, SamplingParams llm = LLM(model="meta-llama/Llama-2-7b-chat-hf") sampling_params = SamplingParams(temperature=0.5, max_tokens=500) ``` #### **5. RAG流程整合** - 核心处理逻辑: ```python def rag_pipeline(query): # 向量检索 retriever = vectordb.as_retriever(search_kwargs={"k": 3}) docs = retriever.get_relevant_documents(query) # 构建Prompt context = "\n".join([doc.page_content for doc in docs]) prompt = f"""基于以下信息用中文回答: {context} 问题:{query} 答案:""" # 生成回答 outputs = llm.generate(prompt, sampling_params) return outputs[0].text ``` #### **6. 交互接口开发** - 快速构建Web API: ```python from flask import Flask, request app = Flask(__name__) @app.route('/ask', methods=['POST']) def ask(): question = request.json['question'] return {'answer': rag_pipeline(question)} if __name__ == '__main__': app.run(host='0.0.0.0', port=8000) ``` --- ### **性能优化技巧** 1. **混合检索策略** ```python # 结合关键词+向量混合检索 from langchain.retrievers import BM25Retriever, EnsembleRetriever bm25_retriever = BM25Retriever.from_documents(chunks) ensemble_retriever = EnsembleRetriever( retrievers=[bm25_retriever, vectordb.as_retriever()], weights=[0.3, 0.7] ) ``` 2. **缓存加速** ```python # 使用磁盘缓存 from langchain.cache import SQLiteCache import langchain langchain.llm_cache = SQLiteCache(database_path=".langchain.db") ``` 3. **量化压缩** ```bash # 使用GGUF量化格式 ./llama.cpp/quantize llama-2-7b.Q4_0.gguf ``` --- ### **方案优势与局限** | 维度 | 优势 | 局限 | |-------------|-------------------------------|-------------------------------| | 知识更新 | 🟢 支持实时更新知识库 | 🔴 需要定期维护向量库 | | 硬件成本 | 🟢 单卡GPU可运行 | 🔴 70B模型需要高端显卡 | | 响应速度 | 🟡 3-5秒级响应 | 🔴 比API方案慢 | | 准确率 | 🟡 依赖检索质量 | 🔴 存在幻觉风险 | -- ### **典型应用场景** 1. 企业知识库问答系统 2. 个人数字文档助手 3. 行业法规智能查询 4. 学术论文研究助手 --- **部署建议**: - 从7B版本开始验证原型,逐步升级模型规模 - 使用LangChain框架可快速集成更多功能模块(如联网搜索、代码解释器等) - 对关键领域知识建议进行Llama2的LoRA微调(需准备标注数据)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值