给出全部代码,用Python实现

以下是一个完整的、可运行的 Python 实现的 RAG(Retrieval-Augmented Generation)程序,具备以下功能: --- ### ✅ 功能说明: - 从本地 Ollama 获取模型列表 - 使用本地 SentenceTransformer 模型进行文档嵌入 - 使用 FAISS 构建向量数据库进行语义检索 - 支持参数控制(Top-K、Temperature、Max Tokens) - 使用 PyQt5 构建图形界面 - 支持文档加载与处理(使用 `langchain` 和 `unstructured`) --- ### 📁 项目结构(简化) ``` rag_app/ ├── main.py ├── documents/ │ └── sample.txt └── requirements.txt ``` --- ### 📦 安装依赖(`requirements.txt`) ```txt requests sentence-transformers faiss-cpu langchain unstructured PyQt5 ``` --- ### 🧠 `main.py`(完整代码) ```python import sys import os import requests import numpy as np from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QLineEdit, QPushButton, QTextEdit, QComboBox from sentence_transformers import SentenceTransformer from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter import faiss # ========== Ollama 模型获取 ========== def get_ollama_models(): try: response = requests.get("http://localhost:11434/api/tags") if response.status_code == 200: return [model["name"] for model in response.json()["models"]] else: return ["连接失败"] except Exception as e: print("Ollama连接失败:", e) return ["连接失败"] # ========== 文档加载与处理 ========== def load_documents(folder_path="documents"): documents = [] for filename in os.listdir(folder_path): if filename.endswith(".txt"): loader = TextLoader(os.path.join(folder_path, filename)) documents.extend(loader.load()) text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100) return text_splitter.split_documents(documents) # ========== 嵌入模型加载 ========== embedding_model = SentenceTransformer("all-MiniLM-L6-v2") # ========== 构建 FAISS 索引 ========== texts = [doc.page_content for doc in load_documents()] embeddings = embedding_model.encode(texts) dimension = embeddings.shape[1] index = faiss.IndexFlatL2(dimension) index.add(np.array(embeddings)) # ========== 检索函数 ========== def retrieve_documents(query, top_k=5): query_embedding = embedding_model.encode([query]) distances, indices = index.search(np.array(query_embedding), top_k) return [texts[i] for i in indices[0]] # ========== 生成回答函数 ========== def generate_answer(prompt, model_name, temperature=0.7, max_tokens=200): url = "http://localhost:11434/api/generate" payload = { "model": model_name, "prompt": prompt, "stream": False, "temperature": temperature, "max_tokens": max_tokens, } response = requests.post(url, json=payload) if response.status_code == 200: return response.json()["response"] else: return "生成失败:" + response.text # ========== RAG 主流程 ========== def rag_query(query, model_name, top_k=5, temperature=0.7, max_tokens=200): retrieved_docs = retrieve_documents(query, top_k) context = "\n".join(retrieved_docs) full_prompt = f"Context: {context}\n\nQuestion: {query}\n\nAnswer:" answer = generate_answer(full_prompt, model_name, temperature, max_tokens) return answer # ========== PyQt5 GUI ========== class RAGApp(QWidget): def __init__(self): super().__init__() self.setWindowTitle("RAG 程序 - 本地部署") self.layout = QVBoxLayout() self.model_label = QLabel("选择模型:") self.layout.addWidget(self.model_label) self.model_combo = QComboBox() self.model_combo.addItems(get_ollama_models()) self.layout.addWidget(self.model_combo) self.query_input = QLineEdit() self.query_input.setPlaceholderText("输入你的问题...") self.layout.addWidget(self.query_input) self.top_k_input = QLineEdit() self.top_k_input.setPlaceholderText("Top-K 检索数量 (默认5)") self.layout.addWidget(self.top_k_input) self.temperature_input = QLineEdit() self.temperature_input.setPlaceholderText("Temperature (默认0.7)") self.layout.addWidget(self.temperature_input) self.max_tokens_input = QLineEdit() self.max_tokens_input.setPlaceholderText("Max Tokens (默认200)") self.layout.addWidget(self.max_tokens_input) self.submit_button = QPushButton("提交") self.submit_button.clicked.connect(self.on_submit) self.layout.addWidget(self.submit_button) self.result_output = QTextEdit() self.result_output.setReadOnly(True) self.layout.addWidget(self.result_output) self.setLayout(self.layout) def on_submit(self): query = self.query_input.text() model_name = self.model_combo.currentText() top_k = int(self.top_k_input.text()) if self.top_k_input.text() else 5 temperature = float(self.temperature_input.text()) if self.temperature_input.text() else 0.7 max_tokens = int(self.max_tokens_input.text()) if self.max_tokens_input.text() else 200 answer = rag_query(query, model_name, top_k=top_k, temperature=temperature, max_tokens=max_tokens) self.result_output.setText(answer) # ========== 启动应用 ========== if __name__ == "__main__": app = QApplication(sys.argv) window = RAGApp() window.resize(600, 500) window.show() sys.exit(app.exec_()) ``` --- ### 📌 注意事项: 1. **Ollama 必须运行在本地**,启动命令:`ollama serve` 2. 需要提前下载模型,如:`ollama pull llama3` 或 `ollama pull qwen` 3. 放入 `documents/` 文件夹中的 `.txt` 文件将被自动加载 4. 如果使用其他格式(如 PDF),可扩展 `langchain` 支持的加载器 --- ### ✅ 示例运行流程: 1. 安装依赖:`pip install -r requirements.txt` 2. 启动 Ollama:`ollama serve` 3. 下载模型:`ollama pull llama3` 4. 放入文档到 `documents/` 文件夹 5. 运行程序:`python main.py` 6. 在界面中选择模型、输入问题、调节参数、查看结果 --- ###

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

为你推荐:

Python内容推荐

leetcode题库-leetcode-python:Myownsolutiontoleetcodeproblemsinpython(使用Py

leetcode题库-leetcode-python:Myownsolutiontoleetcodeproblemsinpython(使用Py

leetcode题库使用Python解决LeetCode算法题本仓库主要记录自己在上AC的代码,全部使用Python实现。其中一些代码参考了评论区中的高票回答,在代码中给出了参考链接,在此感谢各位网友

Python基于列表list实现的CRUD操作功能示例

Python基于列表list实现的CRUD操作功能示例

查询用户时,检查ID是否存在,如果存在,打印出对应用户的全部信息;如果不存在,给出提示。8. 当用户选择非法操作或退出时,给出相应提示。

Python实现12306自动抢票[项目源码]

Python实现12306自动抢票[项目源码]

本文主要介绍了如何利用Python编程语言以及Selenium库来实现自动抢购12306火车票的过程。文章内容详尽,涵盖了从初步的模块导入开始,直至整个自动购票流程的全部环节。

Python实现12306自动抢票[项目代码]

Python实现12306自动抢票[项目代码]

本文介绍了一个使用Python语言实现的12306自动抢票小程序的开发过程。首先,为了开发这样的程序,需要对Python语言有一定的了解,并熟悉网络编程的基础知识。

Python实现CNN操作[项目代码]

Python实现CNN操作[项目代码]

文章最后给出了完整的项目代码包,这些代码包不仅包括了网络模型的构建,还涉及数据的预处理、模型的训练和评估等整个流程。

基于Python实现一个简单的银行转账操作

基于Python实现一个简单的银行转账操作

在给出的代码示例中,`TransferMoney`类实现了这些核心功能,并展示了如何在Python中进行数据库操作和事务处理。

Python 实现简单的电话本功能

Python 实现简单的电话本功能

在 Python 代码中,`AddContact` 方法实现了这一功能。它首先提示用户输入联系人的姓名和电话号码,并对输入进行一定的验证。例如,确保姓名不是空字符串,并且电话号码只包含数字。

python文件读写代码实例

python文件读写代码实例

对于数据读取后的处理,例如对于实验室导师给出的任务,从.dat文件中读取波形数据并进行异常检测,需要理解数据的存储结构,合理地使用Python读取、处理这些数据,最终实现异常检测的算法。

Python实现Linux的find命令实例分享

Python实现Linux的find命令实例分享

然而,如果你想要在Python程序中实现类似的功能,本文提供了一个简单的实例,教你如何用Python模拟Linux的`find`命令。首先,让我们分析给出的Python代码:1.

用Python实现割圆术算法.pdf

用Python实现割圆术算法.pdf

文章“用Python实现割圆术算法”中,作者刁乾坤提供了使用Python语言在Jupyter Notebook中实现割圆术算法的示例代码。

python上的汉诺塔实现

python上的汉诺塔实现

#### Python实现汉诺塔问题下面给出一个简单的Python实现,用于解决任意数量的盘子的汉诺塔问题,并打印出每一步的操作。

详解python实现可视化的MD5、sha256哈希加密小工具

详解python实现可视化的MD5、sha256哈希加密小工具

在给出的代码中,`judge`函数是核心,它处理用户的输入并计算MD5和SHA256哈希值。当用户点击“哈希加密”按钮时,`judge`函数会被调用。

python综合练习(附代码)-.docx

python综合练习(附代码)-.docx

这份作业是一个很好的实践机会,让学生们通过编写Python代码来理解和掌握程序设计的相关概念,如循环控制、条件判断、文件操作和函数调用等。

python语言zyxs爬虫程序代码QZQ.zip

python语言zyxs爬虫程序代码QZQ.zip

本压缩包中的文件名为"python语言zyxs爬虫程序代码QZQ.txt",这暗示了程序代码可能是一个名为“zyxs”的爬虫项目,该文件可能包含了实现该爬虫所需的全部或部分源代码。

对python 树状嵌套结构的实现思路详解

对python 树状嵌套结构的实现思路详解

这篇文章主要介绍如何使用Python实现树状嵌套结构,并且提供了详细的代码实现过程,这对于初学者和希望加强这方面技能的开发者来说,具有很好的参考价值。首先,我们来看树状嵌套结构的基本概念。

python语言音乐控制电机软件代码QZQ.txt

python语言音乐控制电机软件代码QZQ.txt

值得注意的是,虽然文档中未提供完整代码,从给出的代码片段中我们可以了解到音乐控制电机软件的编码逻辑和操作方式,以及通过编程实现控制电机与音乐节奏同步的潜在功能。

python新年烟花代码.docx

python新年烟花代码.docx

特别需要注意的是,代码片段没有完整给出,因此无法提供完整程序的运行结果和全部细节。不过,上述内容已经足够涵盖该程序的核心概念和关键部分的实现方法。

Python学习之函数式编程实现学生管理系统的基本功能

Python学习之函数式编程实现学生管理系统的基本功能

这个简单的学生管理系统展示了如何利用Python的函数式编程来组织代码,每个功能都封装成独立的函数,提高了代码的可读性和可维护性。同时,通过使用列表和字典等数据结构,实现了对数据的动态管理。

使用Python编写的手写数字识别系统代码及完整数据

使用Python编写的手写数字识别系统代码及完整数据

该系统的内容包括完整的源代码和全部相关数据,确保学生在下载后可以立即运行和使用,节省了从零开始编写代码的时间和精力。

Mofan莫烦python全部教程代码

Mofan莫烦python全部教程代码

Mofan莫烦python全部教程代码"是一个集合了Mofan(莫烦)Python教育平台上的所有视频教程的源代码资源。

最新推荐最新推荐

recommend-type

答题辅助python代码实现

本题主要涉及的是使用Python编程语言来实现一个答题辅助工具,该工具能够自动识别屏幕上的问题和答案选项。以下是对实现这个功能的关键技术点的详细解释: 1. **屏幕截图**:首先,代码中使用了`screenshot`模块来...
recommend-type

不到40行代码用Python实现一个简单的推荐系统

4. 计算电影间相似性:使用皮尔逊相关系数或其他相似性度量方法,找出所有电影与用户A已观看电影的相似度。 5. 过滤低评分电影:由于评分次数过少的电影可能存在误差,因此需要删除评分样本不足的电影,以提高推荐...
recommend-type

详解python实现交叉验证法与留出法

Python中,我们可以使用`sklearn.model_selection.KFold`实现交叉验证,例如: ```python from sklearn.model_selection import KFold data = pd.read_excel('') # 导入数据 kf = KFold(n_splits=4, shuffle=False,...
recommend-type

Python实现结构体代码实例

下面将详细介绍如何使用Python实现结构体,并通过具体的代码实例进行讲解。 在Python中,类是一种自定义的数据类型,可以包含数据成员(属性)和成员函数(方法)。我们可以创建一个基类(base class),然后定义...
recommend-type

Python实现代码块儿折叠

一种常见的实现代码块折叠的方法是使用`#描述">`和`#</editor-fold>`这对注释。这里的`desc`参数用于提供折叠后的描述文本,例如"折叠后要显示的内容"。下面是一个简单的例子: ```python #折叠后要显示的内容"> ...
recommend-type

学生成绩管理系统C++课程设计与实践

资源摘要信息:"学生成绩信息管理系统-C++(1).doc" 1. 系统需求分析与设计 在进行学生成绩信息管理系统开发前,首先需要进行系统需求分析,这是确定系统开发目标与范围的过程。需求分析应包括数据需求和功能需求两个方面。 - 数据需求分析: - 学生成绩信息:需要收集学生的姓名、学号、课程成绩等数据。 - 数据类型和长度:明确每个数据项的数据类型(如字符串、整型等)和长度,例如学号可能是字符串类型且长度为一定值。 - 描述:详细描述每个数据项的意义,以确保系统能够准确处理。 - 功能需求分析: - 列出功能列表:用户界面应提供清晰的操作指引,列出所有可用功能。 - 查询学生成绩:系统应能通过学号或姓名查询学生的成绩信息。 - 增加学生成绩信息:允许用户添加未保存的学生成绩信息。 - 删除学生成绩信息:能够通过学号或姓名删除已经保存的成绩信息。 - 修改学生成绩信息:通过学号或姓名修改已有的成绩记录。 - 退出程序:提供安全退出程序的选项,并确保所有修改都已保存。 2. 系统设计 系统设计阶段主要完成内存数据结构设计、数据文件设计、代码设计、输入输出设计、用户界面设计和处理过程设计。 - 内存数据结构设计: - 使用链表结构组织内存中的数据,便于动态增删查改操作。 - 数据文件设计: - 选择文本文件存储数据,便于查看和编辑。 - 代码设计: - 根据功能需求,编写相应的函数和模块。 - 输入输出设计: - 设计简洁明了的输入输出提示信息和操作流程。 - 用户界面设计: - 用户界面应为字符界面,方便在命令行环境下使用。 - 处理过程设计: - 设计数据处理流程,确保每个操作都有明确的处理逻辑。 3. 系统实现与测试 实现阶段需要根据设计阶段的成果编写程序代码,并进行系统测试。 - 程序编写: - 完成系统设计中所有功能的程序代码编写。 - 系统测试: - 设计测试用例,通过测试用例上机测试系统。 - 记录测试方法和测试结果,确保系统稳定可靠。 4. 设计报告撰写 最后,根据系统开发的各个阶段,撰写详细的设计报告。 - 系统描述:包括问题说明、数据需求和功能需求。 - 系统设计:详细记录内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。 - 系统测试:包括测试用例描述、测试方法和测试结果。 - 设计特点、不足、收获和体会:反思整个开发过程,总结经验和教训。 时间安排: - 第19周(7月12日至7月16日)完成项目。 - 7月9日8:00到计算机学院实验中心(三楼)提交程序和课程设计报告。 指导教师和系主任(或责任教师)需要在文档上签名确认。 系统需求分析: - 使用表格记录系统需求分析的结果,包括数据项、数据类型、数据长度和描述。 - 分析数据项如学生成绩信息、状态器、链表节点等,确定其属性和行为。 以上就是文档中提到的学生成绩信息管理系统开发的关键知识点。开发此类系统需要熟练掌握C++编程基础,了解面向对象的程序设计思想,以及熟悉文件操作和链表等数据结构的应用。此外,良好的软件开发流程意识、测试意识和文档撰写能力也是必不可少的。
recommend-type

别再手动拖拽了!用Lumerical脚本批量创建FDTD仿真结构(附完整代码)

# 告别低效建模:Lumerical脚本自动化实战指南 在光子学仿真领域,时间就是科研生命线。当同行还在GUI界面里反复点击菜单时,你已经用脚本批量生成了20组参数化结构——这不是未来场景,而是每位FDTD用户都应该掌握的基础生产力革命。本文将彻底改变你与Lumerical的交互方式,从手动拖拽的农耕时代,跃迁到自动化建模的工业文明。 ## 1. 为何脚本建模是必然选择 2019年Nature Photonics的一项研究显示,科研工作者在仿真工具上平均浪费37%的时间在重复性操作上。对于需要参数扫描的纳米光学结构设计,这个数字可能更高。手动创建10个不同尺寸的纳米柱阵列意味着: -
recommend-type

Java邮件解析任务中,如何安全高效地提取HTML邮件内容并避免硬编码、资源泄漏和类型转换异常?

<think>我们被要求优化一段Java代码,该代码用于处理邮件(特别是来自特定发件人的构建通知邮件)。代码的主要问题包括: 1. 重复获取邮件内容:在检查MIME类型后,多次调用`msg[i].getContent()`,这可能导致性能问题或流关闭异常。 2. 类型转换问题:直接将邮件内容转换为`Multipart`而不进行类型检查,可能引发`ClassCastException`。 3. 代码结构问题:逻辑嵌套过深,可读性差,且存在重复代码(如插入邮件详情的操作在两个地方都有)。 4. 硬编码和魔法值:例如在解析HTML表格时使用了硬编码的索引(如list3.get(10)),这容易因邮件
recommend-type

RH公司应收账款管理优化策略研究

资源摘要信息:"本文针对RH公司的应收账款管理问题进行了深入研究,并提出了改进策略。文章首先分析了应收账款在企业管理中的重要性,指出其对于提高企业竞争力、扩大销售和充分利用生产能力的作用。然后,以RH公司为例,探讨了公司应收账款管理的现状,并识别出合同管理、客户信用调查等方面的不足。在此基础上,文章提出了一系列改善措施,包括完善信用政策、改进业务流程、加强信用调查和提高账款回收力度。特别强调了建立专门的应收账款回收部门和流程的重要性,并建议在实际应用过程中进行持续优化。同时,文章也意识到企业面临复杂多变的内外部环境,因此提出的策略需要根据具体情况调整和优化。 针对财务管理领域的专业学生和从业者,本文提供了一个关于应收账款管理问题的案例研究,具有实际指导意义。文章还探讨了信用管理和征信体系在应收账款管理中的作用,强调了它们对于提升企业信用风险控制和市场竞争能力的重要性。通过对比国内外企业在应收账款管理上的差异,文章总结了适合中国企业实际环境的应收账款管理方法和策略。" 根据提供的文件内容,以下是详细的知识点: 1. 应收账款管理的重要性:应收账款作为企业的一项重要资产,其有效管理关系到企业的现金流、财务健康以及市场竞争力。不良的应收账款管理会导致资金链断裂、坏账损失增加等问题,严重影响企业的正常运营和长远发展。 2. 应收账款的信用风险:在信用交易日益频繁的商业环境中,企业必须对客户信用进行评估,以便采取合理的信用政策,降低信用风险。 3. 合同管理的薄弱环节:合同是应收账款管理的法律基础,严格的合同管理能够保障企业权益,减少因合同问题导致的应收账款风险。 4. 客户信用调查:了解客户的信用状况对于预测和控制应收账款风险至关重要。企业需要建立有效的客户信用调查机制,识别和筛选信用良好的客户。 5. 应收账款回收策略:企业应建立有效的账款回收机制,包括定期的账款跟进、逾期账款的催收等。同时,建立专门的应收账款回收部门可以提升回收效率。 6. 应收账款管理流程优化:通过改进企业内部管理流程,如简化审批流程、提高工作效率等措施,能够提升应收账款的管理效率。 7. 应收账款管理策略的调整和优化:由于企业的内外部环境复杂多变,因此制定的管理策略需要根据实际情况进行动态调整和持续优化。 8. 信用管理和征信体系的作用:建立和完善企业内部信用管理体系和征信体系,有助于企业更好地控制信用风险,并在市场竞争中占据有利地位。 9. 对比国内外应收账款管理实践:通过研究国内外企业在应收账款管理上的不同做法和经验,可以借鉴先进的管理理念和方法,提升国内企业的应收账款管理水平。 综上所述,本文深入探讨了应收账款管理的多个方面,为RH公司乃至其他同类型企业提供了应收账款管理的改进方向和策略,对于财务管理专业的教育和实践都具有重要的参考价值。
recommend-type

新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构

# 新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构 第一次拿到BingPi-M2开发板时,面对Tina Linux SDK里密密麻麻的文件夹,我完全不知道从哪下手。就像走进一个陌生的大仓库,每个货架上都堆满了工具和零件,却找不到操作手册。这种困惑持续了整整两天,直到我意识到——理解目录结构比死记硬背每个文件更重要。 ## 1. 为什么SDK目录结构如此重要 想象你正在组装一台复杂的模型飞机。如果所有零件都混在一个箱子里,你需要花大量时间寻找每个螺丝和面板。但如果有分门别类的隔层,标注着"机身部件"、"电子设备"、"紧固件",组装效率会成倍提升。Ti