Ollama+Langchain搭建基础本地RAG模型(基于Ubuntu24.04)

news/2025/3/31 3:55:52/文章来源:https://www.cnblogs.com/Unalome-3301/p/18796464

一. 环境准备

1. 安装Ollama

Linux终端运行:

curl -fsSL https://ollama.com/install.sh | sh    # Linux/MacOS
winget install ollama    # Windows

2. 下载模型

Ollama支持多种模型:
7B基础模型:

ollama pull llama2 

轻量级高效模型:

ollama pull mistral

作者选择了后者,读者可根据本机配置自由选择。

3. 验证Ollama运行

测试文本生成:

ollama run mistral "Hello world" 

二. Python环境配置

1. 创建虚拟环境

python -m venv ollama-env
source ollama-env/bin/activate  # Linux/Mac
ollama-env\Scripts\activate     # Windows

2. 安装依赖库

在Ollama虚拟环境下安装Langchain依赖库:

pip install langchain langchain-community langchain-core langchain-ollama langchain-text-splitters python-dotenv

安装后可以通过如下指令查看已经安装的包:

pip list | grep "需要查找的包"

三. 基础代码(在线模型)

1. 文本生成脚本

from langchain_community.llms import Ollamallm = Ollama(model="mistral", temperature=0.9)response = llm.invoke("解释量子计算的基本原理")
print("模型回复:", response)

2. 对话式AI

# from langchain_community.chat_models import ChatOllama 已过时
from langchain_core.messages import HumanMessage
from langchain_ollama import ChatOllamachat = ChatOllama(model="mistral", temperature=0.9)messages = [HumanMessage(content="请写一颗线段树")]
response = chat.invoke(messages)print("AI回复:", response.content)

3. 文档问答系统

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_ollama import OllamaEmbeddings, OllamaLLM
# from langchain_community.llms import Ollama 已过时
from langchain.chains import RetrievalQA# 加载文档
loader = TextLoader("/media/ab/软件/所有课程/H3-2/07项目实训/cherry_for_sdu/RAG_TEST/report.txt")
docs = loader.load()# 分割文本
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)# 创建向量数据库
embeddings = OllamaEmbeddings(model="mistral")
vectorstore = FAISS.from_documents(splits, embeddings)# 构建问答链
qa_chain = RetrievalQA.from_chain_type(llm=OllamaLLM(model="mistral"),retriever=vectorstore.as_retriever(),return_source_documents=True
)# 提问
query = "莱特兄弟的“飞行者一号”成功升空是什么时候"
result = qa_chain.invoke({"query": query})print("答案:", result["result"])
print("来源文档:", result["source_documents"][0].page_content[:200])

四. 基础功能测试

1. 文本生成脚本

将待分析的文档保存为report.txt

2. 启动服务

ollama serve &  # 后台启动Ollama服务
python document_qa.py所在路径

3. 交互测试

根据提示输入问题进行测试

五. 基础RAG代码及测试

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_ollama import OllamaEmbeddings, OllamaLLM
from langchain.chains import RetrievalQA
import osclass SimpleRAG:def __init__(self, model_name="mistral"):self.model_name = model_nameself.embeddings = OllamaEmbeddings(model=model_name)self.llm = OllamaLLM(model=model_name)self.vectorstore = Noneself.qa_chain = Nonedef load_documents(self, file_path):"""加载并预处理文档"""if not os.path.exists(file_path):raise FileNotFoundError(f"文件 {file_path} 不存在")loader = TextLoader(file_path)docs = loader.load()text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200,separators=["\n\n", "\n", "。", "!", "?", ";"])return text_splitter.split_documents(docs)def build_vectorstore(self, splits, persist_dir=None):"""构建/加载向量存储"""if persist_dir and os.path.exists(persist_dir):print(f"加载已有向量存储: {persist_dir}")self.vectorstore = FAISS.load_local(persist_dir, self.embeddings)else:print("创建新向量存储...")self.vectorstore = FAISS.from_documents(splits, self.embeddings)if persist_dir:self.vectorstore.save_local(persist_dir)print(f"向量存储已保存到: {persist_dir}")def initialize_qa(self):"""初始化问答链"""if not self.vectorstore:raise ValueError("请先构建向量存储")self.qa_chain = RetrievalQA.from_chain_type(llm=self.llm,retriever=self.vectorstore.as_retriever(search_kwargs={"k": 3}),return_source_documents=True)def query(self, question):"""执行查询"""if not self.qa_chain:raise ValueError("请先初始化QA链")result = self.qa_chain.invoke({"query": question})print(f"\n问题: {question}")print(f"\n答案: {result['result']}")self._show_sources(result['source_documents'])def _show_sources(self, documents):"""显示来源文档"""print("\n相关文档片段:")for i, doc in enumerate(documents[:3], 1):content = doc.page_content.replace("\n", " ").strip()print(f"{i}. {content[:250]}...")print("-" * 50)if __name__ == "__main__":# 配置参数DOC_PATH = "/media/ab/软件/所有课程/H3-2/07项目实训/cherry_for_sdu/RAG_TEST/report.txt"VECTORSTORE_DIR = "./vectorstore"# 初始化系统rag = SimpleRAG()try:# 文档处理splits = rag.load_documents(DOC_PATH)# 构建向量存储(自动复用已有存储)rag.build_vectorstore(splits, persist_dir=VECTORSTORE_DIR)# 初始化QA链rag.initialize_qa()# 交互式问答print("输入问题开始查询(输入'exit'退出)")while True:question = input("\n你的问题: ")if question.lower() in ['exit', 'quit']:breakif len(question.strip()) < 3:print("问题太短,请重新输入")continuerag.query(question)except Exception as e:print(f"系统错误: {str(e)}")

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

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

相关文章

Go红队开发—CLI框架(二)

Go红队开发—CLI命令行工具编写基础学习(二)。目录CLI开发框架cobra 集成库目录规范搭建框架根命令参数添加子命令帮助信息爬虫功能(趁热打铁)Goquery处理响应编码处理收集百度热搜榜爬虫功能所有源码 CLI开发框架 师傅们久等了,为了加快进度,这章节添加了一个爬虫功能,也是…

APP性能测试工具-GT

GT(随身调)是腾讯研发的一款可以用来做App性能测试的工具,可以对APP进行快速的性能测试,检测App的CPU、内存、流量、电量、帧率/流畅度等等、还能开启日志的查看、Crash日志查看、网络数据包的抓取、APP内部参数的调试、真机代码耗时统计等。 虽然现在该项目已经停止维护了…

一文速通Python并行计算:04 Python多线程编程-多线程同步(上)—基于条件变量、事件和屏障

本文介绍了Python多线程同步的三种机制:条件变量(Condition)、事件(Event)和屏障(Barrier),条件变量指的是线程等待特定条件满足后执行,适用于生产者-消费者模型;Event指的是线程通过事件标志进行同步,适用于线程间简单通信;Barrier指的是多个线程需同步到同一阶段…

docker desktop windows安装

我的机器windows 11 家庭版 下载docker desktop for windows 就直接安装了。安装后打开,遇到了界面转圈圈加载不出来问题,docker engine也是stopped. 病急乱投医,先是说要启用hyper-v,控制面板=》程序和功能里没有发现有hyper-v,一看是家庭版,网上倒是有一个脚本可以在家…

C语言打卡学习第6天(2025.3.25)(补发)

只做了一些有关循环分支函数求值的题,感觉循环函数其实差不多,只有一些细微差别,可能是做的题还不够多或者看运用场景吧

C语言打卡学习第5天(2025.3.24)(补发)

1、把char,getchar,putchar简单看了一下,求ascii值之类的 之类的简单看了一下 2、交换值那一题很奇怪,结果我输出的跟答案要求是一样的,交过去之后显示答案错误,白天的时候问一下

Vulnstack红日靶场通关(持续更新)

带你速通内网渗透相关知识点!!!Vulnstack通关 来源于《内网渗透实战攻略》实战部分 个人是写下自己的笔记 攻击链:探索发现阶段->入侵和感染阶段->攻击和利用阶段->探索感知阶段->传播阶段->持久化和恢复阶段 Windows权限级别前置知识:权限层级 账户类型 权…

Ubuntu 24.04安装MySQL,并且配置外网访问

安装启动更新软件包列表sudo apt update安装MySQL软件包sudo apt install mysql-server启动MySQL服务sudo systemctl start mysql重启命令:systemctl restart mysql配置外网访问 需要修改一个配置 vim /etc/mysql/mysql.conf.d/mysqld.cnf注释掉 这行 配置 bind-address …

2022CCPC Online Contest G - Name the Puppy

对正串和反串分别建立 Trie 树,定义 \(dp[i][j]\) 表示正串 Trie 树上编号为 \(i\) 的点匹配反串 Trie 树上编号为 \(j\) 的点所能拼出最长 anti-border 的长度。 如此,从根节点开始搜索,直到无法匹配为止都可以搜,搜到底后回到根节点继续匹配,可以证明,拼出来的 anti-bo…

互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp智能体框架开发语音交互

前言 前段时间太忙了博客一直都没来得及更新,但是不代表我已经停止开发了,刚好最近把语音部分给调整了一下,所以就来分享一下具体的内容了。我想说一下,更新晚还是有好处的,社区已经有很多的小伙伴自己实现了一些语音对话功能的案例,比如小智也有.NET客户端了,还有就是一…

【AI News | 20250327】每日AI进展

AI Repos 1、playwright-mcp 使用Playwright提供浏览器自动化功能的MCP服务,核心是让LLM通过结构化的可访问性快照与网页交互,不需要依赖截图或视觉模型。可以用来自动填写网页表单、自动收集网页信息、自动进行网页测试等。支持两种模式:快照模式(默认):使用可访问性快照…

markdown常用命令行格式

Markdown 主要命令(语法)如下:标题 使用 # 号表示标题,# 的个数决定标题的级别:一级标题 二级标题 三级标题 四级标题 五级标题 六级标题段落 & 换行 直接输入文字形成段落,使用两个以上空格或 进行换行:这是一个段落。 这是同一段的下一行。 使用 <br> 也可…