给出全部代码,用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实现,用于解决任意数量的盘子的汉诺塔问题,并打印出每一步的操作。

Mofan莫烦python全部教程代码

Mofan莫烦python全部教程代码

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

PAT乙级全部题目python代码

PAT乙级全部题目python代码

【描述】"PAT乙级全部题目python代码除1075存在超时外其他全部AC"意味着作者已经为PAT乙级的所有题目编写了Python代码,并且大部分都已经通过了自动评测系统(Accepted,简称AC)

educoder Python 实训 实验六 多重循环全部关卡通关代码(答案).txt

educoder Python 实训 实验六 多重循环全部关卡通关代码(答案).txt

"该资源包含了Python编程实训平台educoder中实验六关于多重循环的全部关卡的通关代码,包括了五个关卡的解答。"在Python编程中,多重循环是控制流程的重要工具,允许程序员在同一时间内

python 显示数组全部元素的方法

python 显示数组全部元素的方法

在文章《python 显示数组全部元素的方法》中,提到了一种使用`np.set_printoptions`方法来显示数组全部元素的技巧。

Python & Turtle练习:绘制各种图形(全部源代码)

Python & Turtle练习:绘制各种图形(全部源代码)

这是关于Python & Turtle练习:绘制各种图形(全部源代码)部分的练习,该文件中所有代码均已通过调试,且博客中均已经记录,欢迎各位朋友下载,这对于Python学习以及使用Matplotlib

基于Python Scrapy实现的网易云音乐music163数据爬取爬虫系统 含全部源代码

基于Python Scrapy实现的网易云音乐music163数据爬取爬虫系统 含全部源代码

本项目基于Python Scrapy框架实现网易云音乐数据的爬取,包含完整的爬虫源代码。项目通过IDE配置文件管理开发环境,支持高效的数据采集与处理,适用于音乐平台公开信息的抓取与分析。

CNN实现图片分类,python代码

CNN实现图片分类,python代码

模型训练可以通过`model.fit()`方法实现,而模型预测则用`model.predict()`。在提供的压缩包文件"CNN分类"中,应包含了实现这个CNN图片分类项目的全部代码和可能的数据集。

python学生管理系统代码实现

python学生管理系统代码实现

同样,它没有给出具体实现,但可能需要用户提供要删除的学生ID,并在确认后从数据文件中移除该条记录。

python基于TensorFlow的花卉识别系统代码实现和全部项目资料

python基于TensorFlow的花卉识别系统代码实现和全部项目资料

python基于TensorFlow的花卉识别系统代码实现和全部项目资料,含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单

最新推荐最新推荐

recommend-type

基于打开pycharm有带图片md文件卡死问题的解决

背景 最近在做项目的时候,向前端传输带图片的md文件,然后编辑完成想试着发送的时候发现Pycharm忽然卡死了,打开也是闪退。 解决方法 先将md文件移出项目文件,打开Pycharm,然后再进行下列操作。 打开File->Settings->Plugins->installed 把我们的Markdowm Support前面的勾取消掉。 在我们的Plugins还有个比较好的MD插件,就是那个Markdowm Navigator这个插件,我们可以把它安装再重启,这样就可以看到我们的图片了。 补充知识:解决pycharm中md文件中文乱码的问题 在file–setting–file enco
recommend-type

PyCharm集成Jupyter启动卡死解决[代码]

本文主要解决PyCharm集成Jupyter Notebook时一直处于启动状态无法正常加载的问题。作者使用的PyCharm版本为2022.2,配置好Jupyter后,发现Notebook在PyCharm中始终显示启动中,连基本的print语句都无法执行。经过调试,确认直接启动Notebook在Chrome中可用,PyCharm解释器设置无误,.py文件也能正常运行。最终发现原因是PyCharm版本与Jupyter Notebook版本不兼容:conda默认安装的是7.x最新版,而PyCharm版本过低。解决方法是在Anaconda中安装6.x版本的Jupyter Notebook(作者选择了6.5.5),使用pip install notebook=6.5.5命令安装。此外,还解决了快捷方式点击后闪退的问题,需要修改快捷方式的“目标”指向正确的jupyter notebook.exe文件。
recommend-type

解决终端运行Py闪退

cmd打开文件步骤 打开相应程序步骤 cocos-2d学习常见问题之一
recommend-type

解决PyCharm闪退问题[项目代码]

本文详细介绍了如何通过修改PyCharm的两个关键注册表参数来解决因系统超频导致的IDE崩溃问题。首先,文章分析了问题的根本原因,指出PyCharm默认会最大化利用CPU资源,导致在高性能模式下可能超出超频CPU的稳定阈值,从而引发闪退。接着,提供了具体的解决方案,包括打开PyCharm注册表设置、修改批量检查线程数和缓存扫描线程数两个参数,并重启IDE。最后,文章还提醒用户检查日志文件以定位其他潜在问题。这一方法能有效降低CPU负载峰值,避免触发超频保护机制,从而稳定运行PyCharm。
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
recommend-type

Java线程池运行时状态怎么实时掌握?有哪些靠谱的监控手段?

<think>我们之前已经讨论过Java线程池监控的多种方法,包括使用第三方工具和自定义监控。现在用户再次询问Java线程池监控方法,我们需要根据引用内容以及之前讨论的内容进行总结和扩展。 引用[1]提到使用JDK自带的监控工具,引用[2]提到了三种常用的线程池创建方式,引用[3]给出了通过ThreadPoolExecutor获取线程池状态的方法。 结合之前回答的内容,我们可以将监控方法分为以下几类: 1. 使用JDK自带工具(如jconsole, jvisualvm)进行监控。 2. 通过编程方式获取线程池状态(如引用[3]所示)。 3. 扩展ThreadPoolExecutor,