1. 项目概述

在本地部署RAG(检索增强生成)系统是当前AI应用开发的热点方向之一。本文将基于ROG幻X2025笔记本电脑,详细演示如何利用LM Studio和LangChain框架搭建一个完整的本地RAG系统。这个系统可以用于构建企业内部知识库、产品问答系统等实际应用场景。

ROG幻X2025作为一款高性能移动工作站,搭载AMD锐龙AI Max+ 395处理器,拥有16核32线程、40个RDNA 3.5计算单元的集成显卡,以及50 TOPS算力的XDNA 2架构NPU,配合128GB LPDDR5X-8000统一内存,为本地运行大型语言模型提供了充足的硬件支持。

2. 核心组件与技术选型

2.1 硬件配置要求

要实现流畅的本地RAG部署,建议硬件配置至少满足以下要求:

  • 处理器:多核CPU(建议8核以上)
  • 内存:16GB以上(推荐32GB+)
  • 存储:SSD硬盘,预留10GB以上空间
  • GPU:支持CUDA或ROCm的独立显卡(非必须但能显著提升性能)

ROG幻X2025完全满足这些要求,其强大的硬件配置使其成为理想的移动AI开发平台。特别值得一提的是,该设备支持ROCm 7,可以充分利用AMD GPU进行模型推理加速。

2.2 软件工具选择

我们选择以下工具链构建本地RAG系统:

  1. LM Studio :用于本地运行和管理大型语言模型

    • 版本要求:1.2.3+
    • 核心功能:
      • 本地离线运行开源LLM
      • 兼容OpenAI API规范
      • 支持模型灵活切换
  2. LangChain框架 :提供标准化RAG组件

    • 主要模块:
      • langchain_core:核心抽象和接口
      • langchain_community:社区贡献的组件
      • langchain_text_splitters:文本分割工具
  3. Python环境

    • 版本:3.9-3.11
    • 关键依赖库:
      • requests:HTTP请求处理
      • scikit-learn:相似度计算
      • torch:PyTorch深度学习框架

3. 系统架构与核心流程

3.1 RAG系统工作原理

RAG(检索增强生成)技术的核心思想是将外部知识库与大语言模型相结合。其工作流程可分为离线准备和在线处理两个阶段:

离线准备阶段

  1. 文档清洗:去除无关内容,标准化格式
  2. 文本切块:将长文档分割为适当大小的文本块
  3. 嵌入向量化:使用嵌入模型将文本转换为向量表示
  4. 存储向量:将向量化结果存入向量数据库

在线处理阶段

  1. 用户提交查询
  2. 系统检索相关文本块
  3. 拼接增强提示
  4. 输入LLM生成最终回答

3.2 本方案技术特点

我们采用的轻量级方案具有以下特点:

  1. 无持久化向量存储 :向量实时生成,内存计算
  2. 全本地化运行 :数据不出本地,保障隐私安全
  3. AMD GPU加速 :通过ROCm 7利用显卡加速推理
  4. 模块化设计 :各组件可独立替换升级

4. 详细实施步骤

4.1 环境准备

4.1.1 安装LM Studio
  1. 访问LM Studio官网下载适配AMD的版本
  2. 完成基础安装配置
  3. 验证安装是否成功
4.1.2 下载所需模型

我们需要两个核心模型:

  1. 生成模型 :llama-3-8b(适配16GB内存)
  2. 嵌入模型 :text-embedding-all-minilm-l6-v2(轻量高效)

下载步骤:

  1. 打开LM Studio,进入"Developer"选项卡
  2. 点击"发现"进入Mission Control界面
  3. 搜索并下载所需模型
  4. 等待下载完成(时间取决于网络速度)
4.1.3 启动LM Studio服务
  1. 打开服务开关,将Status变为Running状态
  2. 检查端口设置(默认1234)
  3. 加载下载好的两个模型
  4. 验证API接口是否正常工作

4.2 项目代码部署

4.2.1 获取项目源码

项目仓库地址:https://github.com/hechunji/lmStudioRAG_Lite

克隆或下载项目到本地,目录结构如下:

lmStudioRAG_Lite/
├── chroma_db/
├── docs/
├── zsk.txt
4.2.2 安装依赖

有两种安装方式可选:

方式一(手动安装)

  1. 创建Python虚拟环境
  2. 逐个安装所需依赖包:
    • requests
    • scikit-learn
    • torch
    • langchain相关包

方式二(自动安装)

pip install -r requirements.txt
4.2.3 准备测试数据

我们使用一个自定义的童话故事《何季》作为测试文档,内容存储在zsk.txt中。选择这个故事是因为它不会被现有的大模型识别,可以清晰展示RAG的效果。

4.3 系统运行与测试

4.3.1 启动项目

在VS Code或其他IDE中运行主程序lmStudioRAG_Lite.py。系统启动后会提供两种模式选择:

  1. 纯问答模式 :直接调用LM Studio中的模型回答
  2. RAG模式 :基于本地文档语义检索后回答
4.3.2 测试结果对比

我们以问题"《何季》写于什么时候?"为例:

纯问答模式结果 : 模型由于不知道这个故事,给出了错误答案"1936年"。

RAG模式结果 : 系统正确返回了"2026年12月25日",因为这是从我们提供的文档中检索到的准确信息。

这个对比清晰展示了RAG技术的价值:它让大模型能够基于特定文档提供准确回答,而不是依赖其训练数据中的知识。

5. 核心代码解析

5.1 自定义嵌入模型实现

我们创建了LMStudioEmbeddings类来封装LM Studio的嵌入API:

class LMStudioEmbeddings(Embeddings):
    def __init__(self, port=1234):
        self.port = port
        
    def embed_documents(self, texts: List[str]) -> List[List[float]]:
        # 批量生成文档嵌入向量
        url = f"http://localhost:{self.port}/embeddings"
        payload = {"input": texts}
        response = requests.post(url, json=payload)
        return [item["embedding"] for item in response.json()["data"]]
    
    def embed_query(self, text: str) -> List[float]:
        # 生成查询嵌入向量
        url = f"http://localhost:{self.port}/embeddings"
        payload = {"input": text}
        response = requests.post(url, json=payload)
        return response.json()["data"][0]["embedding"]

5.2 语义检索器实现

SemanticVectorRetriever类负责核心的检索逻辑:

class SemanticVectorRetriever(BaseRetriever):
    def __init__(self, docs: List[Document], embeddings: Embeddings, 
                 similarity_threshold: float = 0.3, top_k: int = 5):
        self.docs = docs
        self.embeddings = embeddings
        self.similarity_threshold = similarity_threshold
        self.top_k = top_k
        
    def _get_relevant_documents(self, query: str, *, run_manager: CallbackManagerForRetrieverRun) -> List[Document]:
        # 生成查询向量
        query_embedding = self.embeddings.embed_query(query)
        
        # 生成所有文档向量
        doc_embeddings = self.embeddings.embed_documents([doc.page_content for doc in self.docs])
        
        # 计算余弦相似度
        similarities = cosine_similarity([query_embedding], doc_embeddings)[0]
        
        # 过滤和排序
        scored_docs = sorted(
            [(doc, sim) for doc, sim in zip(self.docs, similarities) if sim >= self.similarity_threshold],
            key=lambda x: x[1], 
            reverse=True
        )
        
        return [doc for doc, sim in scored_docs[:self.top_k]]

5.3 RAG链构建

我们使用LangChain的Runnable接口构建完整的RAG流程:

# 文档加载和分割
loader = TextLoader("docs/zsk.txt")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
docs = text_splitter.split_documents(documents)

# 创建检索器
embeddings = LMStudioEmbeddings()
retriever = SemanticVectorRetriever(docs, embeddings)

# 构建Prompt模板
template = """严格遵守以下规则回答问题:
1. 你的回答必须100%来自下方的「参考文档」;
2. 如果参考文档中没有相关内容,回答:"无法从参考文档中找到答案";
3. 回答要结合所有相关文档的信息;
4. 只回答问题本身,不要解释、不要补充、不要反问。

参考文档:
{context}

用户问题:
{question}"""
prompt = ChatPromptTemplate.from_template(template)

# 定义LLM调用函数
def invoke_llm(messages: List[dict]) -> str:
    url = f"http://localhost:1234/v1/chat/completions"
    payload = {
        "model": "llama-3-8b",
        "messages": messages,
        "temperature": 0.2
    }
    response = requests.post(url, json=payload)
    return response.json()["choices"][0]["message"]["content"]

# 构建完整RAG链
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | RunnableLambda(lambda x: invoke_llm(x.to_messages()))
)

6. 性能优化与扩展

6.1 针对ROG幻X2025的优化建议

  1. 模型轻量化

    • 如果内存占用过高,可以考虑使用更小的模型:
      • 生成模型:llama-3-7b-instruct
      • 嵌入模型:bge-small-zh-v1.5
  2. 文本分割优化

    • 根据文档类型调整chunk_size参数:
      • 技术文档:100-200
      • 小说类内容:40-80
    • 适当增加chunk_overlap(10-20)避免语义断裂
  3. 并行处理

    • 利用AMD多核优势,实现批量文档的并行向量化

6.2 系统扩展方向

当前轻量级方案的局限性:

  1. 每次检索都需重新生成文档向量,文档量大时性能下降
  2. 不支持海量文档(建议单文档≤100KB)
  3. 程序重启后需重新处理文档

进阶优化方案:

  1. 本地文件持久化向量

    • 将生成的向量保存到本地文件
    • 下次启动时直接加载,避免重复计算
  2. 集成轻量级向量数据库

    • Chroma:简单易用,适合中小规模数据
    • FAISS:Facebook开源的高效相似度搜索库
  3. 增量更新机制

    • 监控文档变更,只处理新增或修改的内容
    • 实现向量库的动态更新

7. 实际应用建议

7.1 企业内部知识库建设

实施步骤:

  1. 收集整理企业各类文档(产品手册、技术文档、FAQ等)
  2. 设计合理的文档预处理流程
  3. 根据查询需求优化检索策略
  4. 部署RAG系统并集成到企业IM或客服平台

7.2 产品智能问答系统

关键考虑:

  1. 领域专有名词处理
  2. 多轮对话支持
  3. 回答风格定制
  4. 反馈机制设计

7.3 学术文献检索助手

特殊需求:

  1. 支持参考文献格式
  2. 处理专业术语和公式
  3. 实现引文追踪功能
  4. 多语言支持

8. 常见问题排查

8.1 模型加载失败

可能原因:

  1. 内存不足

    • 解决方案:换用更小的模型或增加虚拟内存
  2. 端口冲突

    • 解决方案:修改LM Studio服务端口

8.2 检索结果不准确

优化方向:

  1. 调整文本分割参数(chunk_size和chunk_overlap)
  2. 优化相似度阈值(SIMILARITY_THRESHOLD)
  3. 改进嵌入模型

8.3 响应速度慢

性能提升方法:

  1. 启用GPU加速
  2. 实现批量处理
  3. 优化检索算法

9. 安全与隐私考虑

  1. 数据本地化 :所有处理都在本地完成,敏感数据不会外传
  2. 访问控制 :可以集成企业认证系统,限制知识库访问权限
  3. 审计日志 :记录所有查询和回答,便于后续审查
  4. 内容过滤 :在结果返回前进行合规性检查

10. 后续学习资源

要深入掌握RAG技术,建议从以下几个方向继续学习:

  1. 高级RAG技术

    • 查询重写(Query Rewriting)
    • 检索结果重排序(Re-ranking)
    • 多跳检索(Multi-hop Retrieval)
  2. 相关框架

    • LlamaIndex:专为RAG优化的数据框架
    • Haystack:端到端的问答系统框架
  3. 性能优化

    • 量化技术(Quantization)
    • 模型剪枝(Pruning)
    • 知识蒸馏(Knowledge Distillation)
  4. 扩展应用

    • 多模态RAG(结合图像、视频等)
    • 时序数据RAG(处理实时信息)
    • 个性化RAG(基于用户画像优化结果)
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐