当前位置: 首页 > article >正文

别再空谈RAG了!手把手教你用LangChain + Chroma + 本地SearXng,从零搭建一个能联网搜索的智能问答助手

从零构建智能问答系统LangChain Chroma SearXng实战指南引言在信息爆炸的时代如何快速获取准确答案成为技术团队面临的共同挑战。传统搜索引擎返回的是海量网页链接而大语言模型虽然能生成流畅回答却存在信息滞后和幻觉问题。检索增强生成RAG技术结合了两者优势让AI既能实时获取最新信息又能生成结构化的专业回答。本文将带你从零搭建一个能联网搜索的智能问答系统核心技术栈包括LangChain大语言模型应用开发框架Chroma轻量级向量数据库SearXng隐私友好的开源元搜索引擎不同于理论讲解我们聚焦于可落地的工程实践涵盖环境配置、代码实现、调试技巧全流程。即使没有AI项目经验按照本文步骤也能在2小时内构建出可用的问答系统。1. 环境准备与工具链配置1.1 基础环境搭建推荐使用Python 3.10环境通过conda管理依赖conda create -n rag python3.10 conda activate rag安装核心依赖库pip install langchain chromadb sentence-transformers searxng常见问题排查如遇到grpc安装失败尝试先安装pip install grpcio1.48.2在ARM架构设备如Mac M系列上需额外安装pip install chromadb --no-deps后手动安装依赖1.2 本地SearXng部署SearXng提供Docker一键部署方案docker pull searxng/searxng:latest docker run -d --name searxng -p 8080:8080 searxng/searxng验证服务是否正常curl http://localhost:8080/search?qtestformatjson配置要点修改/etc/searxng/settings.yml启用更多搜索引擎建议设置server.limiterfalse关闭速率限制通过docker logs searxng查看实时日志2. 核心模块实现2.1 文档处理流水线建立document_processor.py实现文本加载与分块from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.document_loaders import DirectoryLoader def process_documents(data_dir): loader DirectoryLoader(data_dir, glob**/*.md) documents loader.load() splitter RecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200, length_functionlen ) return splitter.split_documents(documents)关键参数说明参数推荐值作用chunk_size500-1500影响检索精度和上下文完整性chunk_overlap10-20%避免语义断裂separators[\n\n, \n, ]中文建议增加。 2.2 向量数据库初始化创建vector_db.py配置Chroma数据库from langchain.vectorstores import Chroma from langchain.embeddings import HuggingFaceEmbeddings embedding_model HuggingFaceEmbeddings( model_nameGanymedeNil/text2vec-large-chinese, model_kwargs{device: cpu} ) def init_vectorstore(docs, persist_dirchroma_db): return Chroma.from_documents( documentsdocs, embeddingembedding_model, persist_directorypersist_dir )性能优化技巧使用parquet格式存储向量chroma_client chromadb.PersistentClient(pathpersist_dir)批量插入时设置batch_size100对大规模数据启用allow_dangerous_deserializationTrue2.3 混合检索器实现在hybrid_retriever.py中组合本地与网络检索from langchain.retrievers import BaseRetriever from typing import List from langchain.schema import Document import requests class HybridRetriever(BaseRetriever): def __init__(self, vector_retriever, searxng_url): self.vector_retriever vector_retriever self.searxng_url searxng_url def _get_relevant_documents(self, query: str) - List[Document]: # 本地向量检索 local_docs self.vector_retriever.get_relevant_documents(query) # 网络搜索 search_results requests.get( f{self.searxng_url}/search, params{q: query, format: json} ).json() web_docs [ Document( page_contentresult.get(content, ), metadata{source: result[url]} ) for result in search_results.get(results, []) ] return local_docs web_docs注意实际部署时应添加请求超时和重试机制处理网络不稳定的情况3. 问答系统集成3.1 提示工程优化设计兼顾准确性和安全性的提示模板from langchain.prompts import PromptTemplate PROMPT_TEMPLATE 你是一位专业的信息助理请根据以下规则回答问题 可用资源 {context} 回答要求 1. 标注信息来源表示本地知识库表示网络结果 2. 保持客观中立不编造不存在的信息 3. 对可能引发争议的内容明确标注该观点存在争议 当前问题{question} prompt PromptTemplate( templatePROMPT_TEMPLATE, input_variables[context, question] )3.2 完整链路组装在qa_system.py中构建端到端流程from langchain.chains import RetrievalQA from langchain.llms import Ollama # 使用本地模型 def build_qa_system(retriever): llm Ollama(modelqwen:7b) return RetrievalQA.from_chain_type( llmllm, retrieverretriever, chain_typestuff, chain_type_kwargs{prompt: prompt}, return_source_documentsTrue )启动交互式问答qa build_qa_system(hybrid_retriever) while True: query input(\n请输入问题) result qa({query: query}) print(f\n答案{result[result]}) print(\n来源) for doc in result[source_documents]: print(f- {doc.metadata[source]})4. 高级功能扩展4.1 结果重排序策略添加reranker.py提升结果质量from sentence_transformers import CrossEncoder reranker CrossEncoder(cross-encoder/ms-marco-MiniLM-L-6-v2) def rerank_documents(query, documents, top_k3): pairs [(query, doc.page_content) for doc in documents] scores reranker.predict(pairs) scored_docs list(zip(scores, documents)) scored_docs.sort(reverseTrue) return [doc for _, doc in scored_docs[:top_k]]4.2 缓存机制实现使用Redis缓存高频查询import redis from hashlib import md5 r redis.Redis(hostlocalhost, port6379) def get_cache_key(query): return fqa_cache:{md5(query.encode()).hexdigest()} def cached_query(query, qa_system): cache_key get_cache_key(query) cached r.get(cache_key) if cached: return json.loads(cached) result qa_system({query: query}) r.setex(cache_key, 3600, json.dumps(result)) # 缓存1小时 return result4.3 监控与日志集成Prometheus监控指标from prometheus_client import start_http_server, Counter QUERY_COUNT Counter(qa_query_total, Total query count) LATENCY_HIST Histogram(qa_latency_seconds, Query latency) LATENCY_HIST.time() def execute_query(query): QUERY_COUNT.inc() return qa_system({query: query}) start_http_server(8000) # 暴露/metrics端点5. 生产环境部署建议5.1 性能优化配置Chroma数据库调优参数# chroma_config.yaml persist_directory: /data/chroma chroma_db_impl: duckdbparquet allow_reset: false anonymized_telemetry: false启动参数建议uvicorn qa_server:app --host 0.0.0.0 --port 8000 \ --workers 4 \ --no-access-log \ --http h11 \ --timeout-keep-alive 305.2 安全防护措施推荐的安全实践为SearXng配置HTTPS使用rate-limiter-flexible限制API调用频率对用户输入进行严格的SQL注入检测定期备份向量数据库快照Nginx示例配置location /api/ { proxy_pass http://localhost:8000; limit_req zoneapi burst10 nodelay; proxy_set_header X-Real-IP $remote_addr; }5.3 持续维护方案建议的监控指标指标名称监控方式告警阈值查询延迟PrometheusP99 3s内存使用cAdvisor80% 持续5分钟搜索失败率Logstash错误率 1%日志分析架构Filebeat - Logstash - Elasticsearch - Kafka实时告警

相关文章:

别再空谈RAG了!手把手教你用LangChain + Chroma + 本地SearXng,从零搭建一个能联网搜索的智能问答助手

从零构建智能问答系统:LangChain Chroma SearXng实战指南 引言 在信息爆炸的时代,如何快速获取准确答案成为技术团队面临的共同挑战。传统搜索引擎返回的是海量网页链接,而大语言模型虽然能生成流畅回答,却存在信息滞后和幻觉问…...

零基础搞定PyTorch 2.8+RTX 4090D:开箱即用的深度学习环境配置

零基础搞定PyTorch 2.8RTX 4090D:开箱即用的深度学习环境配置 1. 为什么选择预构建的PyTorch镜像? 想象一下这个场景:你刚拿到一台配置RTX 4090D显卡的高性能服务器,准备开始深度学习项目。按照传统方式,你需要&…...

保姆级教程:用LabelImg和YOLOv5 v6.0搞定你的第一个自定义目标检测模型(附完整代码)

从零开始构建YOLOv5自定义目标检测模型:实战指南与避坑手册 在计算机视觉领域,目标检测技术正以前所未有的速度改变着我们与数字世界的交互方式。作为当前最受欢迎的实时目标检测框架之一,YOLOv5以其卓越的速度-精度平衡和开发者友好特性&…...

深入Shader变体:解决Unity CrossSection插件‘Maximum number of shader global keywords exceeded’报错

深入解析Unity Shader变体管理:从CrossSection插件报错到全局/本地关键字优化 当你在Unity项目中整合CrossSection剖切插件时,控制台突然弹出"Maximum number of shader global keywords exceeded"的红色警告,这绝非偶然。这个看似…...

5秒极速转换:让B站缓存视频重获新生的开源神器

5秒极速转换:让B站缓存视频重获新生的开源神器 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经为那些"消失"的B…...

Tiled地图编辑器终极指南:从零开始构建专业级2D游戏场景

Tiled地图编辑器终极指南:从零开始构建专业级2D游戏场景 【免费下载链接】tiled Flexible level editor 项目地址: https://gitcode.com/gh_mirrors/ti/tiled Tiled是一款专为游戏开发者设计的开源2D地图编辑器,以其灵活的图块系统、无限地图编辑…...

代码生成率提升300%,发布回滚率却飙升210%?这才是2024最紧急的DevSecOps盲区!

第一章:智能代码生成 2026奇点智能技术大会(https://ml-summit.org) 智能代码生成正从辅助编程工具演进为开发流程的核心引擎。现代大语言模型(LLM)通过理解上下文语义、项目结构和领域约束,可直接产出符合生产规范的函数级乃至模…...

别再手动处理.mat文件了!用Python+TensorFlow 1.x搞定西储大学轴承数据预处理(附完整代码)

工业设备故障诊断实战:Python高效处理西储大学轴承数据集 轴承故障诊断是工业设备预测性维护的核心环节,而西储大学轴承数据集作为该领域的基准数据集,常被用于验证各类诊断算法。但许多工程师在初次接触这个数据集时,往往会被.m…...

别再死记MobileNet结构了!用PyTorch手撕V1/V2/V3的深度可分离卷积(附代码对比)

从零实现MobileNet系列:深度可分离卷积的PyTorch实战解析 在移动端和嵌入式设备上部署神经网络模型时,我们常常面临计算资源有限的挑战。传统卷积神经网络如VGG、ResNet虽然性能优异,但其庞大的参数量和计算量使得它们难以在资源受限的环境中…...

Z-Image-GGUF提示词入门:‘主体+风格+光照+质量’四步法详解

Z-Image-GGUF提示词入门:‘主体风格光照质量’四步法详解 你是不是也遇到过这种情况:看到别人用AI生成的图片惊艳无比,自己上手一试,出来的却总是不尽人意?要么是画面模糊,要么是风格跑偏,要么…...

掌控系统散热:FanControl智能风扇控制完全指南

掌控系统散热:FanControl智能风扇控制完全指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanCon…...

vLLM-v0.17.1惊艳效果:多LoRA动态切换支持千人千面模型服务

vLLM-v0.17.1惊艳效果:多LoRA动态切换支持千人千面模型服务 1. vLLM框架简介 vLLM是一个专注于大语言模型(LLM)推理和服务的高性能开源库。这个项目最初由加州大学伯克利分校的天空计算实验室开发,现在已经发展成为一个由学术界和工业界共同维护的社区…...

用 ABAP gCTS 给自定义代码留一条可回退的路

在很多 SAP ERP 转 SAP S/4HANA 的项目里,真正让团队迟迟下不了手的,往往不是代码扫描结果本身,而是删掉以后心里没底。生产系统里确实有一大批自定义对象长期没有被执行,SAP 也明确建议通过 usage data 做 scoping,用 Custom Code Migration app 识别无用代码,并在转换阶…...

Visual C++运行库终极解决方案:告别DLL缺失的完整指南

Visual C运行库终极解决方案:告别DLL缺失的完整指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为"应用程序无法正常启动"的弹窗而…...

ngx_set_environment

1 定义 ngx_set_environment 函数 定义在 ./nginx-1.24.0/src/core/nginx.cchar ** ngx_set_environment(ngx_cycle_t *cycle, ngx_uint_t *last) {char **p, **env;ngx_str_t *var;ngx_uint_t i, n;ngx_core_conf_t *ccf;ngx_pool_…...

抖音批量下载器:5分钟打造你的专属素材库

抖音批量下载器:5分钟打造你的专属素材库 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量…...

Xournal++ 终极指南:如何让手写笔记在高分辨率屏幕上清晰如纸 ✨

Xournal 终极指南:如何让手写笔记在高分辨率屏幕上清晰如纸 ✨ 【免费下载链接】xournalpp Xournal is a handwriting notetaking software with PDF annotation support. Written in C with GTK3, supporting Linux (e.g. Ubuntu, Debian, Arch, SUSE), macOS and …...

代码生成结果一致性验证难?深度解析LLM输出版本漂移的7类特征指纹,附开源比对工具链

第一章:智能代码生成代码版本对比 2026奇点智能技术大会(https://ml-summit.org) 随着大语言模型在软件开发流程中的深度集成,智能代码生成工具已从辅助补全演进为具备多轮上下文感知、跨文件推理与版本协同能力的工程级组件。不同版本的代码生成模型在…...

5个简单步骤:用Win10BloatRemover让你的Windows 10重获新生

5个简单步骤:用Win10BloatRemover让你的Windows 10重获新生 【免费下载链接】Win10BloatRemover Configurable CLI tool to easily and aggressively debloat and tweak Windows 10 by removing preinstalled UWP apps, services and more. Originally based on the…...

D3KeyHelper:5分钟掌握暗黑3自动化技能连点,告别手酸提升刷图效率

D3KeyHelper:5分钟掌握暗黑3自动化技能连点,告别手酸提升刷图效率 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑…...

**发散创新:过度依赖单一编程语言导致的架构风险与重构实践**在现代软件开发中,**选择一种编程语言并深度

发散创新:过度依赖单一编程语言导致的架构风险与重构实践 在现代软件开发中,选择一种编程语言并深度绑定其生态已成为许多团队的默认策略。然而,这种“技术栈锁定”现象正悄然埋下隐患——一旦该语言在特定场景下表现乏力、维护成本飙升或社区…...

**发散创新:基于Python与ROS的机器人运动控制实战解析**在现代机器人系统开发

发散创新:基于Python与ROS的机器人运动控制实战解析 在现代机器人系统开发中,运动控制是实现精准操作的核心环节。本文将以 Python ROS(Robot Operating System) 为技术栈,深入剖析如何通过编程语言完成对差速驱动机器…...

如何用imFile下载工具提升你的下载效率:开源下载工具的完整使用秘籍

如何用imFile下载工具提升你的下载效率:开源下载工具的完整使用秘籍 【免费下载链接】imfile-desktop A full-featured download manager. 项目地址: https://gitcode.com/gh_mirrors/im/imfile-desktop 还在为下载速度慢、文件管理混乱而烦恼吗?…...

手把手教你用Cadence仿真验证Charge Pump的current mismatch与deviation(以65nm PDK为例)

手把手教你用Cadence仿真验证Charge Pump的current mismatch与deviation(以65nm PDK为例) 电荷泵(Charge Pump)作为锁相环(PLL)中的关键模块,其电流匹配性能直接影响整个系统的相位噪声和杂散水…...

DS4Android:如何通过可视化学习让数据结构从抽象概念变为直观体验?

DS4Android:如何通过可视化学习让数据结构从抽象概念变为直观体验? 【免费下载链接】DS4Android 看得见的数据结构Android版---Show the Data_Structure power by Android View 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Android 你是否曾…...

告别命令行恐惧:用Stegdetect GUI版一键检测图片隐写(附敏感度调优技巧)

告别命令行恐惧:用Stegdetect GUI版一键检测图片隐写(附敏感度调优技巧) 在数字取证和信息安全领域,图片隐写分析一直是个令人头疼的问题。传统方法往往需要记忆复杂的命令行参数,对新手极不友好。今天要介绍的Stegdet…...

告别点击跳转烦恼:给Zotero+Word/WPS添加文献引用超链接的两种方法

科研写作效率革命:Zotero文献引用超链接的终极解决方案 每次修改论文时,最让人抓狂的莫过于在几十页的文档中来回翻找参考文献。明明Zotero已经帮我们自动生成了完美的引用格式,却还要手动在正文和参考文献列表之间来回切换——这种低效的操作…...

JAX自动微分超快

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 JAX自动微分:解锁AI训练的超高速引擎目录JAX自动微分:解锁AI训练的超高速引擎 引言 一、技术原理&#x…...

告别重复劳动:5分钟掌握Python剪映自动化,视频剪辑效率提升10倍!

告别重复劳动:5分钟掌握Python剪映自动化,视频剪辑效率提升10倍! 【免费下载链接】JianYingApi Third Party JianYing Api. 第三方剪映Api 项目地址: https://gitcode.com/gh_mirrors/ji/JianYingApi 你是否厌倦了每天重复同样的视频剪…...

从零构建Unity NavMesh:烘焙、代理与动态寻路实战

1. 从零开始理解Unity NavMesh 如果你玩过RPG或者策略游戏,一定对NPC自动寻路的功能不陌生。想象一下,当你在游戏中点击某个位置,角色会自动绕过障碍物走到目的地——这就是导航寻路系统的魔力。Unity内置的NavMesh系统,正是实现这…...