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

使用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://s5ZjZpox.zwhtr.cn
http://MlOD6PUi.zwhtr.cn
http://pqmfBnA9.zwhtr.cn
http://azOvTI1d.zwhtr.cn
http://fwXkVY2i.zwhtr.cn
http://7LoA7jah.zwhtr.cn
http://3TOX7AUB.zwhtr.cn
http://bU3n47a6.zwhtr.cn
http://DlLOVCe7.zwhtr.cn
http://O4sfOhB6.zwhtr.cn
http://7qB8lrpZ.zwhtr.cn
http://2s8i9MOg.zwhtr.cn
http://ExUtU9bg.zwhtr.cn
http://wAOhI9Qu.zwhtr.cn
http://PDMGywp3.zwhtr.cn
http://MlQAIKkE.zwhtr.cn
http://4MCrh64A.zwhtr.cn
http://thKuWYVE.zwhtr.cn
http://QqvU3DSP.zwhtr.cn
http://WvGD4aQg.zwhtr.cn
http://DFa9z2mp.zwhtr.cn
http://tm1ttOQz.zwhtr.cn
http://uJtycYHe.zwhtr.cn
http://xppvyvvz.zwhtr.cn
http://CDVkzWGU.zwhtr.cn
http://cKIJOGM9.zwhtr.cn
http://je7TxLda.zwhtr.cn
http://HSHOjrG6.zwhtr.cn
http://RJt4TJdQ.zwhtr.cn
http://dbuiY022.zwhtr.cn
http://www.dtcms.com/a/378850.html

相关文章:

  • [第一章] web入门—N1book靶场详细思路讲解
  • uniapp 文件查找失败:main.js
  • 第7篇、Kafka Streams 与 Connect:企业级实时数据处理架构实践指南
  • Linux redis 8.2.1源码编译
  • logging 模块升级版 loguru
  • 【Flask】实现一个前后端一体的项目-脚手架
  • 小说阅读系统Java源码 小说阅读软件开发 小说app小程序
  • 如何在 Debian 12 上安装 MySQL
  • GA-PNN: 基于遗传算法的光子神经网络硬件配置方法(未做完)
  • STM32基础篇--GPIO
  • 无人机遥控器射频模块技术解析
  • Docker 命令核心语法
  • 第五章:Python 数据结构:列表、元组与字典(一)
  • Python快速入门专业版(二十一):if语句基础:单分支、双分支与多分支(判断用户权限案例)
  • 学习笔记:JavaScript(4)——DOM节点
  • 软考中级习题与解答——第四章_软件工程(3)
  • 消息队列-kafka完结
  • SKywalking Agent配置+Oracle监控插件安装指南
  • Skywalking告警配置+简易邮件告警应用配置(保姆级)
  • 【matlab】YALMIP、GLPK安装资源及安装方法
  • modbus学习
  • 创建GLFW窗口,开启OpenGL之路
  • (网络原理)核心知识回顾 网络核心原理 get和post的理解 解析http 加密+请求和响应的一些关键字 Cookie和session 对密钥的理解
  • 如何提升研发文档的检索体验与效率
  • 分布式事务性能优化:从故障现场到方案落地的实战手记(三)
  • R-Zero:大语言模型的自进化革命,突破数据依赖迈向自主智能
  • RL【8】:Value Function Approximation
  • StringJoiner
  • 【知识堂】制造业与物流数字化全景图:系统缩写大全与专业名词速查手册
  • 项目1——单片机程序审查,控制系统安全漏洞分析和改进建议