commit 416c7f0f0a1a357f6a587d166cb3043807bc236b Author: root <953994191@qq.com> Date: Sun Apr 12 01:46:51 2026 +0800 Initial commit diff --git a/.env b/.env new file mode 100644 index 0000000..58f29ef --- /dev/null +++ b/.env @@ -0,0 +1,4 @@ +LOCAL_MODEL_PATH=glm-4.7-flash +ZHIPUAI_API_KEY=4d568a4367f1442bbc226cc0daf84566.44SsKVWkVIM2Mkeg +VLLM_LOCAL_KEY=token-abc123 +EOF \ No newline at end of file diff --git a/agent.py b/agent.py new file mode 100644 index 0000000..c4b3d11 --- /dev/null +++ b/agent.py @@ -0,0 +1,187 @@ +from bs4 import BeautifulSoup +from langchain.agents import create_agent +import requests +import pypdf +import pandas as pd +from dotenv import load_dotenv +import os +import time +from pathlib import Path +from langchain_community.chat_models import ChatZhipuAI +from langchain_huggingface import HuggingFacePipeline,ChatHuggingFace +from transformers import AutoTokenizer, AutoModelForCausalLM,pipeline +from langchain_core.tools import tool +from langchain_core.messages import HumanMessage +from transformers import BitsAndBytesConfig +from langchain_openai import ChatOpenAI +from pydantic import SecretStr + +##--基础定义 +load_dotenv() + +LOCAL_MODEL_PATH = os.getenv("LOCAL_MODEL_PATH","glm-4.7-flash") +ZHIPUAI_API_KEY = os.getenv("ZHIPUAI_API_KEY") +VLLM_LOCAL_KEY = os.getenv("VLLM_LOCAL_KEY", "") +DEVICE = os.getenv("DEVICE") + +##加载模型 +local_llm = None +online_llm = None + +def get_local_llm(): + global local_llm + if local_llm is None: + local_llm = ChatOpenAI( + base_url="http://localhost:8000/v1", + api_key=SecretStr(VLLM_LOCAL_KEY), + model="gemma-4-E2B-it", + ) + return local_llm + +def get_online_llm(): + global online_llm + if online_llm is None: + online_llm = ChatZhipuAI( + model="glm-4.7-flash", + api_key=ZHIPUAI_API_KEY, + temperature=0.1, + max_tokens=4096, + ) + return online_llm + +##工具调用 + +@tool +def get_currenttemperature(location: str) -> str: + """获取指定地点的当前温度,当用户询问天气或温度时使用此工具。""" + return f'当前{location}的温度为25℃' + +# sym:file_allow_check +def file_allow_check(filename: str) -> Path: + """ + 检查用户文件名是否位于允许目录 './user_docs' 下,防止路径遍历攻击。 + 返回合法的 Path 对象,若不合法则抛出异常。 + """ + allowed_dir = Path("./user_docs").resolve() + allowed_dir.mkdir(exist_ok=True) + + file_path = (allowed_dir / filename).resolve() + if not str(file_path).startswith(str(allowed_dir)): + raise ValueError("错误:非法文件路径。") + + if not file_path.exists(): + raise FileNotFoundError(f"错误:文件 '{filename}' 不存在。") + + return file_path + + +@tool +def read_local_file(filename: str) -> str: + """ + 读取用户指定名称的本地文本文件内容并返回摘要。 + 参数 filename: 文件名,例如 'project_plan.txt' 或 'notes.md'。 + """ + try: + file_path = file_allow_check(filename) + except (ValueError, FileNotFoundError) as e: + return str(e) + + try: + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + # 2. 内容过长时,可以在此处增加一个简单的摘要逻辑,或者直接返回前N个字符 + # 为了演示,这里返回前1000个字符 + return f"文件 '{filename}' 的内容开头:\n{content[:1000]}..." + except Exception as e: + return f"读取文件时出错:{str(e)}" + + +@tool +def read_pdf_summary(filename: str) -> str: + """ + 读取PDF文件并返回内容文本。参数 filename: PDF文件名,例如 'report.pdf'。 + """ + try: + file_path = file_allow_check(filename) + except (ValueError, FileNotFoundError) as e: + return str(e) + try: + text = "" + with open(file_path, 'rb') as f: + reader = pypdf.PdfReader(f) + for page in reader.pages[:3]: + text += page.extract_text() + return f"PDF文件 '{filename}' 的前几页内容:\n{text[:2000]}..." + except Exception as e: + return f"读取PDF出错:{e}" + +@tool +def read_excel_as_markdown(filename: str) -> str: + """ + 读取Excel文件,并将其主要数据转换为Markdown表格格式。参数 filename: Excel文件名,例如 'data.xlsx'。 + """ + try: + file_path = file_allow_check(filename) + except (ValueError, FileNotFoundError) as e: + return str(e) + + try: + df = pd.read_excel(file_path) + markdown_table = df.head(10).to_markdown(index=False) + return f"Excel文件 '{filename}' 的数据预览(前10行):\n{markdown_table}" + except Exception as e: + return f"读取Excel出错:{e}" + +@tool +def fetch_webpage_content(url: str) -> str: + """ + 抓取给定URL的网页正文内容,并返回清晰的纯文本。 + 参数 url: 完整的网页地址,例如 'https://example.com/article'。 + """ + try: + response = requests.get(url, timeout=10) + response.raise_for_status() + soup = BeautifulSoup(response.text, 'html.parser') + # 简单的正文提取,去除脚本和样式 + for script in soup(["script", "style"]): + script.decompose() + text = soup.get_text() + lines = (line.strip() for line in text.splitlines()) + chunks = (phrase.strip() for line in lines for phrase in line.split(" ")) + text = '\n'.join(chunk for chunk in chunks if chunk) + return f"成功抓取网页 {url},正文内容开头:\n{text[:1500]}..." + except Exception as e: + return f"抓取网页时出错:{str(e)}" + +#使用langgraph +agent=create_agent( + model=get_local_llm(), + tools=[get_currenttemperature,read_local_file,fetch_webpage_content,read_pdf_summary,read_excel_as_markdown], + system_prompt=( + "你是一个个人生活助手和数据分析助手。请说中文。" + "当用户询问天气或温度时,使用get_currenttemperature工具获取信息。" + "当用户要求读文本文件时,请使用 read_local_file 工具,只能读取 './user_docs' 目录下的文件。" + "当用户要求读PDF文件时,请使用 read_pdf_summary 工具,只能读取 './user_docs' 目录下的文件。" + "当用户要求读Excel文件时,请使用 read_excel_as_markdown 工具,只能读取 './user_docs' 目录下的文件。" + "当用户要求抓取网页时,请使用 fetch_webpage_content 工具。" + "当用户要求分析文档时,请使用合适的工具读取内容,然后:1. 总结核心发现。2. 如果涉及数据,请以Markdown表格或列表的形式清晰地呈现。" + "重要:你的回答必须简洁、直接,不要包含任何关于思考过程的描述、标记或内部推理。直接给出最终答案或工具调用指令。" +) +) + +while True: + user_input = input("请输入: ") + if user_input.lower() == "exit": + break + # 记录开始时间 + start_time = time.time() + response=agent.invoke({"messages":[HumanMessage(content=user_input)]}) + # 计算思考时间 + thinking_time = time.time() - start_time + # 提取回答内容 + final_answer=response["messages"][-1].content + # 打印回答和统计信息 + print(f"\n{final_answer}") + print(f"思考时间: {thinking_time:.2f}秒") + print("-" * 50) + \ No newline at end of file diff --git a/requirement.txt b/requirement.txt new file mode 100644 index 0000000..83b2518 --- /dev/null +++ b/requirement.txt @@ -0,0 +1,23 @@ +# Core +torch>=2.0.0 +transformers>=4.35.0 +pypdf>=3.0.0 +pandas>=2.0.0 +requests>=2.31.0 +beautifulsoup4>=4.12.0 + +# LangChain ecosystem +langchain>=0.1.0 +langchain-community>=0.0.10 +langchain-huggingface>=0.0.3 +langchain-core>=0.1.0 +langchain-openai>=0.0.5 + +# ZhipuAI (智谱AI) +zhipuai>=1.0.0 + +# Pydantic +pydantic>=2.0.0 + +# Utilities +python-dotenv>=1.0.0 \ No newline at end of file diff --git a/test_gemma.py b/test_gemma.py new file mode 100644 index 0000000..a32ce7c --- /dev/null +++ b/test_gemma.py @@ -0,0 +1,20 @@ +from openai import OpenAI + +# 连接本地 vLLM 服务 +client = OpenAI( + base_url="http://localhost:8000/v1", # 容器映射的地址 + api_key="token-abc123", # 与你启动命令中的 --api-key 一致 +) + +# 发起对话 +response = client.chat.completions.create( + model="gemma-4-E2B-it", # --served-model-name 指定的名称 + messages=[ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "请用中文介绍一下你自己"} + ], + temperature=0.7, + max_tokens=512, +) + +print(response.choices[0].message.content) \ No newline at end of file diff --git a/user_docs/a.txt b/user_docs/a.txt new file mode 100755 index 0000000..c47e6fa --- /dev/null +++ b/user_docs/a.txt @@ -0,0 +1,183 @@ +《Unity3D核心开发》课程标准 +课程编码 12585 课程类别 专业基础课 +适用专业 虚拟现实应用技术 授课单位 人工智能学院 +学 时 72 学 分 4 +编写执笔人 黄双银 审定负责人 费文杰 +编写日期 2024.8 审定日期 + +一、课程性质 +1、课程在专业培养中的定位及作用 +课程的性质:本课程是虚拟现实应用技术专业的专业基础课程,是虚拟现实应用技术专业必修课,设置该课程的目的,不止是为了要求学生学习某种特定的语言,更重要的是要求学生学习现代实际软件设计的思想,为后续的系列课程学习奠定基础。课程定位在程序设计思想的学习,以此拓展学生的思维空间,训练学生的思维能力。在教学过程中注重培养提高学生的职业岗位技能和职业素养,力求达到岗位技能和职业标准。 +课程的作用:本课程是入门基础教学系列中的核心课程,为后面核心课程打下坚实基础,同时也能锻炼学生的逻辑思维能力。 +具体要体现:课程标准(教学大纲)要符合高技能人才培养目标和专业相关技术领域职业岗位(群)的任职要求;本课程对学生职业能力培养和职业素养养成要起主要支撑或明显的促进作用,在后续课程如、.net平台、面向对象的系统分析和设计、C++程序设计、虚拟现实开发等课程打下坚实基础,本课程采用理论加实践相结合的教学方式,让学生通过学习基础语法与编程逻辑思维,能够对软件开发有一个深刻的认识,本课程采用项目为载体,进行知识点讲解、巩固练习,让学员实现自我编程能力的提升。 +2、本课程与其它课程的关系 +阐述本课程与其他课程的关系(前导课程、后续课程)及相互支撑作用。 +表1 前导、后续课程一览表 +前导课程 本课程 后续课程 +c#程序设计与WinForm基础 Unity3D核心开发 Unity3D高级应用 + + +二、课程设计思路 +依据软件开发中的典型工作任务所涉及到的计算机程序设计类型设置课程,结合当前所需要的技术进行教学,并将所学的知识渗透到项目实施的每个环节中。从而,通过典型工作任务的实施,总结、归纳出知识,使学生掌握相应的知识,通过不断的实战和训练,培养学生的动手能力以及逻辑思维能力,实现“教、学、做”一体化。打破了传统的学科体系和知识的逻辑性,知识安排以“必须、够用、拓展、升华”为度,满足职业岗位的需要,与相应的国家职业标准接轨。进而使知识传授的过程符合学生的知识规律,能力的训练过程符合职业成长规律。 +1.该课程是依据“虚拟现实专业职业岗位与职业能力分析表”中的虚拟现实开发工程师职业岗位设置的。其总体设计思路是:着重培养学生思考能力,具备基础语法知识。以工作任务为中心选择和组织课程内容,让学生在完成具体项目的过程中学会完成相应工作任务,并构建相关理论知识,发展职业能力。课程构成部分突出职业能力训练,理论知识学习围绕完成工作任务需要进行,融合相关职业资格证书对知识、技能和态度的要求。教学形式可通过校企合作、校内实训基地实习等工学结合实践形式。教学效果评价采取过程评价与结果评价相结合的方式重点评价学生的职业能力。 +2.该门课程的总学时为196学时,其中理论90学时,实践106学时。 +三、课程目标 +(一)总体目标 +以C#编程语言为基础,理解虚拟现实应用的基本原理,理解基本算法的操作和特征。根据应用场景,能够在合适的数据结构前提下选择最合适的算法,以达到高效解决问题的目的。 +(二)分目标 +知识目标 +(1)掌握unity3d界面和基本操作 +(2)掌握各种资源的导入和格式、unity特殊文件夹 +(3)掌握刚体参数相关设定、掌握角色控制器、掌握物理材质、掌握物理布料、掌握物理关节、掌握布娃娃系统 +(4)掌握地形的创建和编辑、掌握地形纹理的使用 +(5)掌握UGUI基本框架结构、掌握UI场景加载、掌握UI自定义绘制、掌握UI图文混排 +(6)掌握脚本组件、渲染组件、网络组件等,掌握代码里通过获取组件使用各种组件。 +(7)掌握RectTransform的参数和使用,掌握尺寸设置,掌握布局组件 +(8)掌握unity中的时间循环和各种刷新机制,掌握协程使用 +(9)掌握数学库使用,掌握控制物体移动的几种方式 +(10)掌握旧版输入系统和新版输入系统,掌握代码里控制输入操作 +(11)掌握Windows发布和Andriod发布,掌握发布相关系统设置 +能力目标 +(1)具备常用数据结构理论基础 +(2)具备阅读以及分析设计模式的能力 +(3)具备一些常用算法的编程逻辑思维 +(4)具备程序代码的调试和使用能力 +素质目标 +(1)提出问题、分析问题以及解决问题的能力 +(2)独立思考问题的能力 +(3)吸收新知识、新方法的能力 +(4)通过项目的实施、培养学生发现问题、解决问题的能力 +(5)培养学生团体合作能力与集体主义精神 + +四、课程内容和要求 +“Unity3D核心开发”是计算机科学与技术、计算机通讯及相关专业的专业基础课,是我国计算机教学中近期形成的一门专业基础课程。本课程用书共分14章,包括基础的知识点,如:Unity编辑器和功能、对象和组件、UI实战技巧、地形系统、UI交互和事件、异步操作和场景管理、数学库和物理库、打包和发布等。共196学时。 +第一章 Unity3D编辑器功能概述 +参考学时 8学时 +学习目标 掌握unity3d界面和基本操作 +学习任务 学习Unity3d菜单、编辑器视图 +知识内容与要求(必备的知识) 掌握Unity3d菜单、编辑器视图 +技能内容与要求 +(应具备的技能) 熟练实现unity3d完成基本功能 +第二章 Unity3D资源导入与设置 +参考学时 8学时 +学习目标 掌握各种资源的导入和格式、unity特殊文件夹 +学习任务 掌握各种资源的导入和格式、unity特殊文件夹 +知识内容与要求(必备的知识) 掌握各种资源的导入和格式、unity特殊文件夹 +技能内容与要求 +(应具备的技能) 掌握各种资源的导入和格式、unity特殊文件夹 +第三章 Unity中的基本对象 +参考学时 4学时 +学习目标 掌握unity中的对象系统,掌握各种基础对象的类型和使用 +学习任务 掌握unity中的对象系统,掌握各种基础对象的类型和使用 +知识内容与要求(必备的知识) 掌握unity中的对象系统,掌握各种基础对象的类型和使用 +技能内容与要求 +(应具备的技能) 掌握unity中的对象系统,掌握各种基础对象的类型和使用 +第四章 地形编辑 +参考学时 4学时 +学习目标 掌握地形的创建和编辑、掌握地形纹理的使用 +学习任务 掌握地形的创建和编辑、掌握地形纹理的使用 +知识内容与要求(必备的知识) 掌握地形的创建和编辑、掌握地形纹理的使用 +技能内容与要求 +(应具备的技能) 掌握地形的创建和编辑、掌握地形纹理的使用 +第五章 Unity3D常用组件 +参考学时 4学时 +学习目标 掌握脚本组件、渲染组件、网络组件等,掌握代码里通过获取组件使用各种组件。 +学习任务 掌握脚本组件、渲染组件、网络组件等,掌握代码里通过获取组件使用各种组件。 +知识内容与要求(必备的知识) 掌握脚本组件、渲染组件、网络组件等,掌握代码里通过获取组件使用各种组件。 +技能内容与要求 +(应具备的技能) 掌握脚本组件、渲染组件、网络组件等,掌握代码里通过获取组件使用各种组件。 +第六章 UI设计 +参考学时 4学时 +学习目标 掌握UGUI的组成元素,掌握UI的层级顺序 +学习任务 掌握UGUI的组成元素,掌握UI的层级顺序 +知识内容与要求(必备的知识) 掌握UGUI的组成元素,掌握UI的层级顺序 +技能内容与要求 +(应具备的技能) 掌握UGUI的组成元素,掌握UI的层级顺序 +第七章 UGUI布局组件 +参考学时 4学时 +学习目标 掌握RectTransform的参数和使用,掌握尺寸设置,掌握布局组件 +学习任务 掌握RectTransform的参数和使用,掌握尺寸设置,掌握布局组件 +知识内容与要求(必备的知识) 掌握RectTransform的参数和使用,掌握尺寸设置,掌握布局组件 +技能内容与要求 +(应具备的技能) 掌握RectTransform的参数和使用,掌握尺寸设置,掌握布局组件 +第八章 UGUI交互组件及事件 +参考学时 4学时 +学习目标 掌握文本、图片、按钮、输入等组件,掌握UI事件系统 +学习任务 掌握文本、图片、按钮、输入等组件,掌握UI事件系统 +知识内容与要求(必备的知识) 掌握文本、图片、按钮、输入等组件,掌握UI事件系统 +技能内容与要求 +(应具备的技能) 掌握文本、图片、按钮、输入等组件,掌握UI事件系统 +第九章 Unity3D中的异步操作 +参考学时 20学时 +学习目标 掌握unity中的时间循环和各种刷新机制,掌握协程使用 +学习任务 掌握unity中的时间循环和各种刷新机制,掌握协程使用 +知识内容与要求(必备的知识) 掌握unity中的时间循环和各种刷新机制,掌握协程使用 +技能内容与要求 +(应具备的技能) 掌握unity中的时间循环和各种刷新机制,掌握协程使用 +第十章 Unity3D场景管理 +参考学时 4学时 +学习目标 掌握场景的切换和加载,掌握资源的管理方式 +学习任务 掌握场景的切换和加载,掌握资源的管理方式 +知识内容与要求(必备的知识) 掌握场景的切换和加载,掌握资源的管理方式 +技能内容与要求 +(应具备的技能) 掌握场景的切换和加载,掌握资源的管理方式 + +第十一章 数学在Unity中的应用 +参考学时 4学时 +学习目标 掌握数学库使用,掌握控制物体移动的几种方式 +学习任务 掌握数学库使用,掌握控制物体移动的几种方式 +知识内容与要求(必备的知识) 掌握数学库使用,掌握控制物体移动的几种方式 +技能内容与要求 +(应具备的技能) 掌握数学库使用,掌握控制物体移动的几种方式 + +第十二章 Unity3D中的物理库 +参考学时 4学时 +学习目标 掌握物理相关组件,掌握射线检测和碰撞检测逻辑 +学习任务 掌握物理相关组件,掌握射线检测和碰撞检测逻辑 +知识内容与要求(必备的知识) 掌握物理相关组件,掌握射线检测和碰撞检测逻辑 +技能内容与要求 +(应具备的技能) 掌握物理相关组件,掌握射线检测和碰撞检测逻辑 + +第十三章 输入设备拾取 +参考学时 4学时 +学习目标 掌握旧版输入系统和新版输入系统,掌握代码里控制输入操作 +学习任务 掌握旧版输入系统和新版输入系统,掌握代码里控制输入操作 +知识内容与要求(必备的知识) 掌握旧版输入系统和新版输入系统,掌握代码里控制输入操作 +技能内容与要求 +(应具备的技能) 掌握旧版输入系统和新版输入系统,掌握代码里控制输入操作 + +第十四章 多平台发布 +参考学时 4学时 +学习目标 掌握Windows发布和Andriod发布,掌握发布相关系统设置 +学习任务 掌握Windows发布和Andriod发布,掌握发布相关系统设置 +知识内容与要求(必备的知识) 掌握Windows发布和Andriod发布,掌握发布相关系统设置 +技能内容与要求 +(应具备的技能) 掌握Windows发布和Andriod发布,掌握发布相关系统设置 + +五、实施建议 +1.教材选用建议 +在教材的选用上,必须依据本课程标准的要求选用或自编教材。选用或自编教材要能够符合本课程的设计思想和要求,要体现先进性和实用性。如果没有合适的教材,鼓励教师编写符合要求的校本教材。 +2.教学方法建议 +在教学方法上,要根据课程特点,考虑学生实际情况,选择能充分调动学生兴趣,注重培养学生实际能力的教学方法。比如项目导向教学法、工作(工艺)流程导向教学法、示范模拟训练教学法、案例解析教学法等。 +3.师资条件要求 +任课教师需计算机专业本科及以上学历或有相关专业3年及以上的实际工作经验,要求教师口齿清晰,普通话标准。具有以下能力: +(1)对C#语言基本知识非常熟悉并且能够灵活运用 +(2)具有一定的软件项目设计和开发经验 +(3)具有较强的实际操作能力 +(4)能够解决学生操作过程中所遇到的问题 +(5)具有较强的教学设计能力以及较强的施教能力 +4.教学条件基本要求 +主要包括:校内实训(实验)条件要求(课程对校内生产性或仿真类实训(实验)条件的要求,主要配套的教学仪器设备与媒体要求);校外实训基地条件要求(课程对校外实训基地及条件要求,工学结合、社会资源等)。 +序号 名称 基本配置要求 功能说明 +1 多媒体教室 投影仪一台、教学用计算机一台等 演示,讲授教学内容 +2 公共计算机室 硬件:局域网环境,可访问广域网,多媒体计算机。 +软件:Windows7操作系统、Visual Studio2019,Unity3D 2020 进行计算机设置和相关常用工具使用设计 +5.考核评价建议 +教学效果评价采取过程性评价与结果性评价两种方式进行,突出“过程考核与结果考核相结合,教师评价与学生自评相结合”的原则。过程考核贯穿于整个教学过程,对每个课题/项目的学习过程进行考核,体现考核的公平和公正性,促进学生在课程学习全过程中保持持续性动力,针对课程实践性教学环节比重较大的特点,对学生学习《非线性编辑》课程的评价,按照形成性考核评价与终结性考核评价相结合的思路设计全程化的考核评价方案。形成性考核评价由平时考核和实践教学考核构成,终结性考核评价即组织期末考试。 +平时考核,内容包括学生课堂讨论与提问情况、作业完成情况、教学中的表现(含出勤、预习、复习、整理资料等等)等。实践教学考核,区别实训项目制定技能考核标准、考核方式、考核时间、组织方式等,随堂教学过程中每完成一个技能项目的训练,都采用技能标准测评学生掌握情况,并逐项予以记载。期末考试试卷题型通常包括单项选择题、多项选择题、判断题、综合题等。 +课程总评成绩由平时考核、期末考试构成,各占总评成绩的40%、60%。有下列情况之一者,总评成绩为不及格: +(1)缺交作业次数达1/3以上者; +(2)缺课次数达课程总授课学时的1/3以上者。 +七、说明 +1、本课程适用于三年制大数据技术与应用专业普通专科学生。 +2、根据经济社会发展、行业企业发展新趋势、教学改革深化,该课程标准(教学大纲)使用 diff --git a/user_docs/b.pdf b/user_docs/b.pdf new file mode 100755 index 0000000..fe6ed20 Binary files /dev/null and b/user_docs/b.pdf differ diff --git a/user_docs/c.xlsx b/user_docs/c.xlsx new file mode 100755 index 0000000..542704d Binary files /dev/null and b/user_docs/c.xlsx differ