张高兴的 Hailo-10 开发指南:(二)使用 LangChain 搭建本地大模型 RAG 问答应用
张高兴的 Hailo-10 开发指南二使用 LangChain 搭建本地大模型 RAG 问答应用大家好我是张高兴。上期我们成功在 Hailo-10 上部署了本地大模型今天我们来玩点更酷的——用 LangChain 搭建一个 RAG检索增强生成应用。想象一下你有一个私人知识库比如技术文档、论文、甚至小说然后你可以像跟 ChatGPT 聊天一样直接问它“这篇论文里关于 Transformer 的注意力机制怎么实现的”——它不仅能回答还能引用原文。这就是 RAG 的魅力。## 什么是 RAG为什么需要它RAGRetrieval-Augmented Generation是一种结合检索和生成的技术。核心思想是当用户提问时系统先从一个本地知识库比如向量数据库里检索出最相关的文档片段再把这些片段作为上下文喂给大模型让模型基于这些信息生成答案。传统大模型的问题模型训练数据有截止日期无法回答私有或实时更新的内容。比如你问它“Hailo-10 最新驱动版本号”模型可能不知道。RAG 的解决方案把知识库存在本地每次问答时动态检索既保证答案新鲜又保护隐私数据不出本地。Hailo-10 的 NPU神经网络处理单元做推理很快非常适合这种本地化场景。## 环境准备Hailo-10 LangChain 向量数据库我们先安装必要组件。Hailo-10 上我们已经部署了 Qwen 1.5 7B 模型量化版现在需要- Python 3.10± LangChain框架- Chroma轻量级向量数据库支持本地运行- sentence-transformers生成文本嵌入向量bash# 在 Hailo-10 的终端执行pip install langchain langchain-community chromadb sentence-transformers注意如果 Hailo-10 是 ARM 架构需要预编译的 wheels 文件建议用pip install --only-binary:all:跳过编译。## 第一步将本地文档转换为向量RAG 的第一步是“建库”——把文档拆成小块每块生成一个向量embedding存入向量数据库。这样后续检索时系统能快速找到语义相似的片段。假设我们有一个knowledge_base.txt文件里面是 Hailo-10 的技术手册片段Hailo-10 支持 Int8 量化推理峰值算力可达 26 TOPS。NPU 核心采用数据流架构无需外部 DRAM 缓存。驱动版本 4.18.0 修复了 PCIe 通信延迟问题。下面代码演示如何加载文档、分块、生成向量并存入 Chromapythonfrom langchain_community.document_loaders import TextLoaderfrom langchain.text_splitter import CharacterTextSplitterfrom langchain_community.embeddings import HuggingFaceEmbeddingsfrom langchain_community.vectorstores import Chroma# 1. 加载文档loader TextLoader(knowledge_base.txt, encodingutf-8)documents loader.load()# 2. 将文档切割成小块每个块 200 字符重叠 50 字符避免切断语义text_splitter CharacterTextSplitter( chunk_size200, chunk_overlap50, separator\n # 按换行符分割保留段落完整性)chunks text_splitter.split_documents(documents)print(f文档被拆分为 {len(chunks)} 个块)# 3. 使用轻量级句子嵌入模型Hailo-10 上跑很快# 模型会自动下载到 ~/.cache/huggingface/hubembedding_model HuggingFaceEmbeddings( model_namesentence-transformers/all-MiniLM-L6-v2, model_kwargs{device: cpu} # Hailo-10 的 NPU 暂不支持此模型用 CPU 即可)# 4. 存入 Chroma 向量数据库自动持久化到本地磁盘vector_store Chroma.from_documents( documentschunks, embeddingembedding_model, persist_directory./chroma_db # 数据库存储路径)vector_store.persist() # 确保写入磁盘print(知识库构建完成)运行后./chroma_db目录下会出现向量数据文件。下次启动时可以直接用Chroma.load()加载无需重复处理。## 第二步搭建 RAG 问答链路有了知识库接下来就是核心的“检索生成”流程用户提问 → 检索相关文档片段 → 拼接提示词 → 调用大模型 → 输出答案。这里的关键是 LangChain 的RetrievalQA链它自动封装了上述流程。我们只需配置- 检索器从 Chroma 中找最相似的 3 个片段- 大模型Hailo-10 上运行的本地模型- 提示词模板告诉模型如何引用上下文pythonfrom langchain.chains import RetrievalQAfrom langchain.prompts import PromptTemplatefrom langchain_community.llms import Ollama # 假设 Hailo-10 上通过 Ollama 运行模型# 1. 初始化大模型以 Ollama 的 Qwen 为例# 确保先启动 Ollama 服务ollama servellm Ollama( modelqwen:7b-chat-v1.5-q4_K_M, # 量化版适配 Hailo-10 内存 base_urlhttp://localhost:11434, # Ollama 默认端口 temperature0.7, # 控制回答随机性 num_predict512 # 最大输出 token 数)# 2. 创建检索器返回最相关的 3 个文档块retriever vector_store.as_retriever( search_typesimilarity, # 基于余弦相似度检索 search_kwargs{k: 3} # 返回 top-3)# 3. 自定义提示词模板强调基于上下文回答prompt_template 你是一个基于本地知识库的问答助手。请根据以下上下文内容回答问题。如果上下文没有相关信息请直接说“不知道”不要编造。上下文{context}问题{question}回答prompt PromptTemplate( templateprompt_template, input_variables[context, question])# 4. 构建检索增强生成链qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 将所有检索结果合并为一个上下文 retrieverretriever, chain_type_kwargs{prompt: prompt}, return_source_documentsTrue # 返回来源文档方便验证)# 5. 测试问答question Hailo-10 的驱动版本 4.18.0 有什么改进result qa_chain.invoke({query: question})# 输出答案print(答案, result[result])print(\n参考来源)for doc in result[source_documents]: print(f - {doc.page_content[:80]}...) # 截取前 80 字符运行效果示例假设知识库中有相关文档答案根据上下文Hailo-10 的驱动版本 4.18.0 修复了 PCIe 通信延迟问题。参考来源 - 驱动版本 4.18.0 修复了 PCIe 通信延迟问题...如果问题不在知识库中比如问“如何烹饪披萨”模型会回答“不知道”避免幻觉。## 进阶优化让 RAG 更智能### 1. 分块策略优化上面的CharacterTextSplitter很基础。对于技术文档推荐用RecursiveCharacterTextSplitter它会根据换行符、句号、空格等逐级递归切分保留更多语义pythonfrom langchain.text_splitter import RecursiveCharacterTextSplittertext_splitter RecursiveCharacterTextSplitter( chunk_size300, chunk_overlap50, separators[\n\n, \n, 。, , , , , ])### 2. 混合检索如果文档包含很多代码或表格纯向量检索可能不够精准。可以结合 BM25关键词检索做混合搜索python# 安装pip install rank_bm25from langchain.retrievers import EnsembleRetrieverfrom langchain.retrievers.bm25 import BM25Retriever# 创建 BM25 检索器基于关键词bm25_retriever BM25Retriever.from_documents(chunks)bm25_retriever.k 2# 混合检索向量 0.7 权重关键词 0.3 权重ensemble_retriever EnsembleRetriever( retrievers[retriever, bm25_retriever], weights[0.7, 0.3])### 3. 对话历史如果想支持多轮对话可以用ConversationalRetrievalChain它会自动维护聊天历史避免重复检索。## 性能调优让 Hailo-10 跑得更快Hailo-10 的 NPU 擅长固定形状的推理但 LangChain 的向量检索和文本生成涉及动态形状计算。实测建议-嵌入模型用all-MiniLM-L6-v2约 80MB在 CPU 上处理 1000 个文档块仅需 1.2 秒够用。-大模型量化版 Qwen 7B 在 NPU 上推理速度约 15 token/s加上检索时间一次问答总耗时约 3-5 秒。如果嫌慢可以换成 3B 级别的模型如 Phi-3-mini。-向量数据库Chroma 默认使用 SQLite 存储数据量大时建议升级到 FAISSFacebook 的相似度搜索库速度提升 5 倍。bash# 安装 FAISSCPU 版pip install faiss-cpu# 将 Chroma 替换为 FAISS 只需改一行代码vector_store FAISS.from_documents(chunks, embedding_model)## 总结今天我们用 LangChain 在 Hailo-10 上搭建了一个完整的 RAG 问答应用。核心三步走文档切块 → 向量化存储 → 检索增强生成。关键收获1. RAG 让本地大模型“活”了起来能回答私有知识库的问题且数据不出设备。2. LangChain 的RetrievalQA链封装了检索和生成的流程代码不到 30 行。3. 针对 Hailo-10 的硬件特性我们选择了量化模型和轻量嵌入平衡了性能和准确性。下一步你可以尝试- 将知识库替换为 PDF 或网页用UnstructuredPDFLoader或WebBaseLoader- 添加前端界面比如下期我会讲用 Gradio 做一个聊天窗口- 用 Hailo-10 的 NPU 加速嵌入生成需要自定义算子比较硬核如果你在搭建过程中遇到问题欢迎在评论区留言。下期见张高兴继续带你玩转 Hailo-10

相关新闻

跨越天际:从智能汽车到 eVTOL 的适航与系统级开发53——商业化运营(运营人审定、持续适航维修管理规章)的最后一公里落地指南

跨越天际:从智能汽车到 eVTOL 的适航与系统级开发53——商业化运营(运营人审定、持续适航维修管理规章)的最后一公里落地指南

本文探讨了智能汽车系统向eVTOL航空器转型过程中面临的商业化运营合规挑战。重点分析了民航法规框架下持续适航管理的核心要求:一是运营主体需通过CCAR-135部运行合格审定,承担绝对适航责任;二是建立基于MSG-3的航空级维修体系,包…

2026/9/30 18:25:16 阅读更多 →
防爆布控球在皮带运输系统中的智能预警技术

防爆布控球在皮带运输系统中的智能预警技术

1. 防爆布控球在皮带运输系统中的核心价值在煤矿、化工、水泥等工业场景中,皮带输送机是最常见的物料运输设备之一。但皮带跑偏问题长期困扰着安全生产——轻则造成物料洒落影响生产效率,重则引发设备损坏甚至火灾爆炸事故。传统的人工巡检方式存在响应滞…

2026/10/9 1:16:13 阅读更多 →
SWE-Bench基准测试缺陷分析:数据污染与测试设计问题对AI编程评估的影响

SWE-Bench基准测试缺陷分析:数据污染与测试设计问题对AI编程评估的影响

在AI编程能力评估领域,基准测试的质量直接影响着我们对模型真实能力的判断。近期OpenAI对SWE-Bench Pro的审计结果揭示了令人担忧的问题:约30%的评测任务存在不同程度的设计缺陷。这一发现不仅对当前的模型评估体系提出了挑战,也为整个AI研究…

2026/10/9 14:00:01 阅读更多 →

最新新闻

在 Java 的 IntelliJ IDEA 中使用 Claude Code:把 settings 改到 TaoToken 的完整配置大纲

在 Java 的 IntelliJ IDEA 中使用 Claude Code:把 settings 改到 TaoToken 的完整配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 21:40:55 阅读更多 →
余弦相似度与欧氏距离:相似度度量的核心差异与工程选择

余弦相似度与欧氏距离:相似度度量的核心差异与工程选择

很多人在刚接触机器学习或者做推荐系统、文本匹配的时候,都会遇到两个绕不开的名字:余弦相似度和欧氏距离。这俩确实是衡量"东西像不像"最常用的两个指标,但也是被误解得最深的一对。我见过太多人拿到数据就无脑算一个,…

2026/10/15 21:40:55 阅读更多 →
0成本做小游戏:原型_设计_出图_抠图全白嫖(附链接)——用TaoToken统一Key打通AI出图与抠图工作流

0成本做小游戏:原型_设计_出图_抠图全白嫖(附链接)——用TaoToken统一Key打通AI出图与抠图工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 21:40:55 阅读更多 →
CE傻瓜教程:从内存扫描到指针链与自动汇编的逆向入门

CE傻瓜教程:从内存扫描到指针链与自动汇编的逆向入门

简介:这是一份面向游戏修改入门者的 Cheat Engine 中文实操教程,以「傻瓜式」讲解降低学习门槛,适合零基础玩家、逆向初学者以及想了解内存修改原理的技术爱好者。资源包内共 1 个 doc 文档,约 3.86MB,内容按关卡递进组…

2026/10/15 21:40:55 阅读更多 →
西门子仿真开发与体系建设:从四层框架到自动化落地

西门子仿真开发与体系建设:从四层框架到自动化落地

简介:西门子仿真开发与体系建设是一份聚焦自动驾驶与高级驾驶辅助系统(ADAS)研发的PDF技术资料,面向汽车行业仿真工程师、项目经理及多学科协同团队,针对当前仿真数据分散、流程无序、知识复用难等痛点,给出…

2026/10/15 21:40:55 阅读更多 →
2026前端AI编程工具实测:从Figma2Code到Agent闭环,TaoToken统一Key怎么配

2026前端AI编程工具实测:从Figma2Code到Agent闭环,TaoToken统一Key怎么配

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 21:39:55 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →