使用Langchain生成本地rag知识库并搭载大模型

准备设备: 手机+aidlux2.0个人版

一、下载依赖

pip install langchain langchain-community faiss-cpu pypdf

二、安装ollama并下载模型

curl -fsSL https://ollama.com/install.sh | sh #需要科学上网
ollama serve & #让ollama服务在后台运行

安装完毕可以查看ollama版本进行验证,出现版本号之后就可以使用ollama

ollama -v

请添加图片描述

考虑性能因素,选择下载较小的模型

ollama pull phi3:mini 
ollama pull all-minilm

三、构建rag知识库

  1. 打开手机上的aidlux应用,打开Cloud_ip查看网络ip,输入ip到浏览器+端口号:8000访问
    输入以下命令:
cd ~
touch build_knowledge_base.py
  1. 在文件浏览器中/home/aidlux 下找到对应py文件并打开
    请添加图片描述
  2. 自行准备一个知识库文本(txt或pdf),将文本的路径填入脚本中
    请添加图片描述
  3. 写入以下脚本内容
from langchain_community.document_loaders import PyPDFLoader, TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
import os# 1. 设置环境变量优化 Ollama 性能
os.environ["OLLAMA_NUM_THREADS"] = "8"  # 设置线程数
os.environ["OLLAMA_NUM_CTX"] = "2048"   # 设置上下文长度# 2. 配置嵌入模型 - 移除无效参数
embeddings = OllamaEmbeddings(model="all-minilm"  # 仅保留必要参数
)# 3. 加载文档
def load_documents(file_path):if file_path.endswith(".pdf"):loader = PyPDFLoader(file_path)print(f"加载 PDF 文档: {file_path}")elif file_path.endswith(".txt"):loader = TextLoader(file_path)print(f"加载文本文档: {file_path}")else:raise ValueError(f"不支持的文档格式: {file_path}")return loader.load()# 4. 文本分割
def split_documents(docs):text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=80,separators=["\n\n", "\n", "。", "!", "?", ";"])return text_splitter.split_documents(docs)# 5. 主函数
def main():# 示例文档 - 修改为您的文件路径document_path = "knowledge.txt"# 加载和分割文档print("开始处理文档...")documents = load_documents(document_path)chunks = split_documents(documents)print(f"文档分割完成: 共 {len(chunks)} 个文本块")# 创建向量存储print("开始生成嵌入向量...")vector_store = FAISS.from_documents(documents=chunks,embedding=embeddings)# 保存知识库索引save_path = "my_knowledge_base"vector_store.save_local(save_path)print(f"知识库构建完成! 保存到: {save_path}")print(f"向量库大小: {len(vector_store.index_to_docstore_id)} 个向量")if __name__ == "__main__":main()
  1. 运行脚本

python3 build_knowledge_base.py

请添加图片描述

四、创建 RAG 问答系统

  1. 创建一个脚本

touch rag_query.py

  1. 用文件浏览器的方式写入以下内容
from langchain_community.llms import Ollama
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
import os
import time
import sys
import select# 1. 通过环境变量设置优化参数
os.environ["OLLAMA_NUM_THREADS"] = "8"  # 设置线程数
os.environ["OLLAMA_NUM_CTX"] = "2048"   # 设置上下文长度# 2. 初始化模型
llm = Ollama(model="phi3:mini",        # 轻量级语言模型temperature=0.3,           # 平衡创造性和准确性timeout=120.0              # 设置超时时间)embeddings = OllamaEmbeddings(model="all-minilm")# 3. 加载知识库
try:vector_store = FAISS.load_local("my_knowledge_base", embeddings, allow_dangerous_deserialization=True)retriever = vector_store.as_retriever(search_kwargs={"k": 3})print("知识库加载成功")
except Exception as e:print(f"加载知识库失败: {str(e)}")print("请确保已运行 build_knowledge_base.py 构建知识库")exit(1)# 4. 定义提示模板
template = """你是一个专业的知识库助手,请基于以下上下文回答问题。
如果不知道答案,请说"我不知道",不要编造答案。上下文:
{context}问题:{question}请用中文给出详细回答:"""
prompt = ChatPromptTemplate.from_template(template)# 5. 构建 RAG 链
rag_chain = ({"context": retriever, "question": RunnablePassthrough()}| prompt| llm| StrOutputParser()
)# 6. 格式化文档显示
def format_docs(docs):return "\n\n".join(doc.page_content for doc in docs)# 7. 改进的输入函数(解决输入卡住问题)
def get_user_input(prompt, timeout=60):print(prompt, end='', flush=True)# 使用 select 检测输入可用性if select.select([sys.stdin], [], [], timeout)[0]:return sys.stdin.readline().strip()return None# 8. 交互式问答
print("知识库问答系统已启动(输入 'exit' 退出)")
while True:try:# 使用改进的输入函数query = get_user_input("\n你的问题:")if query is None:print("\n输入超时,请重新输入...")continueif query.lower() == "exit":breakstart_time = time.time()# 显示检索到的参考内容relevant_docs = retriever.invoke(query)print("\n[检索到的参考内容]")for i, doc in enumerate(relevant_docs[:2]):  # 显示前2个相关片段print(f"\n片段 {i+1}:\n{doc.page_content[:200]}...")# 生成答案response = rag_chain.invoke(query)end_time = time.time()print(f"\n[答案] (耗时:{end_time - start_time:.2f}秒)")print(response)# 确保输出缓冲区刷新sys.stdout.flush()except KeyboardInterrupt:print("\n退出系统...")breakexcept Exception as e:print(f"处理问题时出错: {str(e)}")print("请尝试简化问题或稍后重试")# 清除可能的输入缓冲区残留sys.stdin.readline()

五、测试验证

python3 rag_query.py

请添加图片描述
根据提示词输入
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/922083.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

L2-【英音】地道语音语调--语调

文章目录语调英式语调四步法语调含义降调升调降升调升降语调如何正确表情达意1. 用降调的句型语调 英语里没有任何一句话具有固定节奏模式 英式语调四步法 意群划分重音核心语调(重中之重)语调的选择 A French burglar broke-into-a flat while the o…

计算机视觉进阶教学之图像投影(透视)变换

目录 简介 一、了解图像投影(透视)变换 一、定义与原理 二、应用场景 三、实现方法 二、案例分析 1. 辅助函数定义 1.1.cv_show 函数 1.2.order_points 函数 1.3.four_point_transform 函数 1.4.resize 函数 2. 主程序执行流程 2.1.图像缩放处理 2.2.轮廓检测 2.…

Java面试问题记录(二)

三、系统设计与问题排查1、假设你要设计一个 “秒杀系统”,需要考虑高并发、高可用、防超卖等问题,你的整体技术方案是什么?从前端、接口层、服务层、存储层分别说说核心设计点。秒杀系统设计设计核心:瞬时高并发,库存…

k8s部署kafka三节点集群

本来认为部署kafka很简单,没想到也折腾了2-3天,这水平没治了~ kafka从3.4.0版本之后,可以不依赖zookeeper直接使用KRaft模式部署,也就是说部署kafka可以不安装zookeeper直接部署。 在官网上没有找到如何使用yaml文件…

在公用同一公网IP和端口的K8S环境中,不同域名实现不同访问需求的解决方案

目录 1. 访问需求 2. 解决方案 3. 具体配置 3.1 允许互联网访问的域名(a.lmzf.com) 3.2 需IP白名单访问的域名(b.lmzf.com) 3.3 关键参数说明 3.4 测试验证 1. 访问需求 在腾讯云TKE环境中,多个域名解析到同一…

FlinkCDC 达梦数据库实时同步

一、Flink部署 1.1、JAVA环境 vi /etc/profile export JAVA_HOME/data/flinkcdc/jdk1.8.0_181 export CLASSPATH$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar export PATH$JAVA_HOME/bin:$PATHsource /etc/profilevi ~/.bash_profileexport FLINK_HOME/data/flinkcdc/fli…

Eip开源主站EIPScanner在Linux上的调试记录(二 多生产者连接)

目录 一、背景 二、可行性验证 三、开发调试 一、背景 在一般场景下,只需一路IO连接,但稍微复杂的场景,就需要不同通讯周期的连接,这就需要有多组IO连接。 而大于一组的连接调试方法是一样的,因此主要解决2组连接的…

Oracle APEX 利用卡片实现翻转(方法二)

目录 0. 以 Oracle 的标准示例表 EMP 为例,实现卡片翻转 1. 创建卡片区域 (Cards Region) 2. 定义卡片的 HTML 结构 3. 添加 CSS 实现样式和翻转动画 4. 创建动态操作触发翻转 5. 运行效果 0. 以 Oracle 的标准示例表 EMP 为例,实现卡片翻转 目标如…

低代码拖拽实现与bpmn-js详解

低代码平台中的可视化拖拽功能是其核心魅力所在,它让构建应用变得像搭积木一样直观。下面我将为你梳理其实现原理,并详细介绍 vue-draggable 这个常用工具。 🧱 一、核心架构:三大区域与数据驱动 低代码编辑器界面通常分为三个核心…

【科研绘图系列】R语言绘制模型预测与数据可视化

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍 加载R包 数据下载 函数 导入数据 数据预处理 画图 总结 系统信息 介绍 本文介绍了一种利用R语言进行海洋微生物群落动态分析的方法,该方法通过构建多个统计模型来预测不同环境…

TODO的面试(dw三面、sqb二面、ks二面)

得物的前端三面(通常是技术终面)会深入考察你的技术深度、项目经验、解决问题的思路以及职业素养。下面我结合搜索结果,为你梳理一份得物前端三面的常问问题及详解,希望能助你一臂之力。 🧠 得物前端三面常问问题及详解…

开发 PHP 扩展新途径 通过 FrankenPHP 用 Go 语言编写 PHP 扩展

通过 FrankenPHP 用 Go 语言编写 PHP 扩展 在 PHPVerse 2025 大会上(JetBrains 为纪念 PHP 语言 30 周年而组织的会议),FrankenPHP 开发者 Kvin Dunglas 做了一个开创性的宣布:通过 FrankenPHP,可以使用 Go 语言创建 …

完美解决:应用版本更新,增加字段导致 Redis 旧数据反序列化报错

完美解决:应用版本更新,增加字段导致 Redis 旧数据反序列化报错 前言 在敏捷开发和快速迭代的今天,我们经常需要为现有的业务模型增加新的字段。但一个看似简单的操作,却可能给正在稳定运行的系统埋下“地雷”。 一个典型的场景是…

66-python中的文件操作

1. 文件的编码 UTF-8 GBK GB2312 Big5 GB18030 2. 文件读取 文件操作步骤: 打开文件 读\写文件 关闭文件 open(name,mode,encoding) name:文件名字符串 “D:/haha.txt” mode: 只读、写入、追加 r:以只读方式打开 w: 只用于写 a :用于追加 encoding:编码方式 # -*- coding: utf…

FPGA实例源代码集锦:27个实战项目

本文还有配套的精品资源,点击获取 简介:FPGA是一种可编程逻辑器件,允许用户根据需求配置硬件功能。本压缩包提供27个不同的FPGA应用实例源代码,旨在帮助初学者深入学习FPGA设计,并为专业工程师提供灵感。内容涵盖了…

基于 Vue+Mapbox 的智慧矿山可视化功能的技术拆解

01、项目背景 在全球矿业加速向 “高端化、智能化、绿色化” 转型的浪潮下,传统矿业面临的深地开采难题、效率瓶颈与安全隐患日益凸显。 在矿业转型的迫切需求与政策、技术支撑的背景下依托 GIS 技术,开展了 “中国智矿” GIS 开发项目,旨在…

进程状态(Linux)

进程状态Linux进程状态Linux进程状态进程描述R运行状态S睡眠状态D磁盘休眠状态T停止状态t被追踪状态(调试状态)X死亡状态Z僵死状态其实大致也就可以分为三种运行,阻塞,挂起。运行状态每个cpu里都有一个运行队列,进程在运行队列里,…

物联网领域中PHP框架的最佳选择有哪些?

物联网(IoT)作为近年来快速发展的技术领域,已经渗透到智能家居、工业自动化、智慧城市等方方面面。作为Web开发中广泛使用的语言,PHP凭借其易学易用、开发效率高和生态丰富的特点,也在物联网领域找到了用武之地。 本文…

java反射(详细教程)

我们平常创建类的实例并调用类中成员需要建立在一个前提下,就是已经知道类名和类中成员的信息,灵活性大大降低。甚至在一些项目中还需要修改源码来满足使用条件,大大降低了操作的灵活性。Java 反射(Reflection)是 Java…

消息队列-初识kafka

优缺点 消息队列的优点: 实现系统解耦: :::color5 系统解耦解释 有 MQ 时是 “服务 A 发消息到队列,其他服务从队列拿消息,新增服务接队列就行”;无 MQ 时是 “服务 A 直接调其他服务的接口 / 依赖,新增 / …