使用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
英文地址,請注明出處:http://en.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 直接調其他服務的接口 / 依賴,新增 / …