出题人:龚海心
题目概览
本题目主要从大语言模型(Large Language Model,LLM)在实际应用构建方面出发,尤其是在智能体、工作流、多智能体系统等方面,最终完成一个小项目的构建。主要要求学生掌握LLM API的调用,工作流的设计、搭建,智能体框架的应用及增强检索生成(RAG)。
==(必看)提交方式见文档底部 测试提交方式 部分,没按正确方式提交将失去成绩==
==有问题请咨询群内龚海心==
基础部分
任务0:开发环境配置
首先安装对应版本的Anaconda,然后用conda配置一个python版本为3.11的虚拟环境。
conda create -n comsen_env python=3.11
conda activate comsen_env
pip install llama-index openai
后续如果需要用到别的依赖库,需要自行识别,并用conda进行环境配置。
同时,你还需要一些Python基本编程知识。(这些知识通常在2天内就可以学会)
RUNOOB python教程:https://www.runoob.com/python/python-tutorial.html
我们这里强烈推荐使用cursor,Trae等带有AI coding功能的IDE。
- https://cursor.com/cn (Cursor)
- https://www.trae.ai/pricing (Trae)
- (均需要科学上网。如果不知道怎么科学上网,请咨询管理获得替代方案)
任务1:智能体工作流搭建基础概念入门
在开始构建智能体前,你需要学习并了解智能体相关的基本概念。
任务要求
- 学习并简要解释一下概念:
- 应用程序接口(API)
- 大语言模型(LLM)
- 提示词工程(Prompt Enginering)
- 系统提示词(System Prompt)
- 智能体(Agent)
- 工具调用(Function Tool Calling)
- 智能体工作流(Agentic Workflow)
- 思考-行动智能体(ReActAgent)
- 增强检索生成(Retrieval-augmented generation, RAG)
参考资料:
- https://waytoagi.feishu.cn/wiki/QPe5w5g7UisbEkkow8XcDmOpn8e(WaytoAGI|通往AGI之路 开源知识库)
- https://zhuanlan.zhihu.com/p/17879967839(Google 智能体白皮书)
- https://www.anthropic.com/engineering/building-effective-agents (Anthropic-Building effective agents)
任务2:调用LLM API,实现一个有上下文记忆的对话程序
LLM是当下智能体构建的核心。在开始构建一个智能体或者一个工作流前,我们首先要在程序中接入一个LLM。
任务要求
- 注册并获取一个Deepseek API Key
- https://platform.deepseek.com/usage (Deepseek 开发平台)
- https://api-docs.deepseek.com/zh-cn/(Deepseek 官方文档)
- 在Python中调用Deepseek的LLM API,实现一个“有记忆”的人工智能对话程序。这里要求调用Deepseek-R1模型,需要展示出LLM的思考过程。(后续任务可以改用Deepseek V3模型)
效果示例:
==================================================
👤 你: 你好,我是海心
🤖 AI:
🤔 AI正在思考中...
【思考】
用户的消息是“你好,我是海心”,这是一个简单的问候和自我介绍。用户名为“海心”,这可能是他们的名字或昵称。作为智能助手,我需要分析这个情境:
- 这是一个社交互动的开场白,用户没有提出具体问题或请求,因此我的回应应该以礼貌和友好为主。
- 我应该先回应问候,介绍自己,并表达欢迎,以建立良好的对话氛围。
- 然后,我可以主动提供帮助,引导用户说明他们的需求,因为助手的核心功能是协助用户解决问题。
- 推理过程:用户可能只是想测试交互或开始一个对话,所以我需要保持开放和 inviting 的语气。
- 得出结论:我的回应应包括问候、自我介绍和帮助提议。
你好海心!很高兴认识你。我是智能助手,随时准备帮助你。有什么我可以为你做的吗?
👤 你: 你还记得我是谁吗
🤖 AI:
🤔 AI正在思考中...
【思考】
用户的问题“你还记得我是谁吗”是在询问我是否基于之前的对话记住他们的身份。回顾对话历史,用户的第一条消息是“你好,我是海心”,其中他们明确介绍了自己为“海心”。作为智能助手,我在当前会话中能够保留短期上下文,因此我可以确认记得用户。这有助于建立信任和对话的连续性。我的回应应该友好、肯定,并引导用户回到提供帮助的主题上,以保持交互的 productive。
是的,海心,我记得你!我们刚刚开始对话,你介绍过自己。很高兴能继续帮助你。有什么具体的事情我可以为你做吗?
温馨提醒
- Deepseek官方文档包含了丰富的信息。
- 可以使用AI来辅助编程,但你要知道程序运行原理。
加分项(如果你完成下面这些要求,你将得到更高的评价)
- 在模型输出的时候使用“Token流式输出”。
- 使用LlamaIndex智能体框架完成该任务。
https://docs.llamaindex.ai/en/stable/ (LlamaIndex官方文档)
任务3:创建一个简单的工作流
在完成了基础的智能体认知和“有记忆”的对话程序后,我们进一步进入 智能体工作流(Agentic Workflow) 的实践。本任务的目标是让你学会如何把 LLM的思考能力 与 外部工具调用 结合起来,从而实现一个 能回答实时信息问题 的小型工作流。
任务要求
- 首先实现一个函数,能调用DuckDuckGo 搜索工具(主要是使用DDGS库),将其构建成一个工具。这个工具,可以将检索结果(标题+摘要+链接)返回给AI作为候选材料。
DDGS教程:https://blog.csdn.net/qq_40999403/article/details/149640626
- 实现一个智能体工作流。我们构建的工作流需要包含以下几个环节
- 用户输入问题
- 用户向系统提出自然语言问题。
- 例如:“今天北京的天气怎么样?”、“请帮我找一下最新的人工智能新闻。”
- AI总结查询关键词
- LLM先对用户问题进行分析,抽取出关键查询词,避免用户输入长而复杂的句子导致检索效果差。
- 例如:输入“请帮我找一下最新的人工智能新闻。” → LLM输出关键词
人工智能 最新 新闻。
- 调用DuckDuckGo搜索工具
- 将检索结果(标题+摘要+链接)返回给AI作为候选材料。
- AI总结回答
- 基于搜索结果,LLM对信息进行总结和加工,最终返回一段简洁、自然的答案。
- 例如:
“最近的人工智能新闻包括:OpenAI发布了新模型,Google DeepMind公布了新的研究成果,国内也有企业在XR智能体方面进展明显……”
效果示例:
🤖 智能搜索智能体系统 - DDGS + DeepSeek AI增强版 ============================================================ 功能说明: 1. 自动提取用户问题关键词 2. 使用DDGS搜索相关信息 3. DeepSeek AI智能总结生成答案 4. 保存对话历史记录 5. 显示详细搜索结果 ============================================================ ✅ 已从配置文件加载DeepSeek API密钥 ✅ DDGS搜索工具已初始化 ✅ DeepSeek AI已初始化 👤 请输入您的问题 (输入 'quit' 退出): 请帮我找一下最新的人工智能新闻 ============================================================ 🚀 智能搜索智能体开始工作... ============================================================ 👤 用户问题: 请帮我找一下最新的人工智能新闻 ---------------------------------------- 🧠 正在分析用户问题: 请帮我找一下最新的人工智能新闻 🔑 提取的关键词: 新闻 最新 人工智能 ---------------------------------------- 🔍 正在使用DDGS搜索: 新闻 最新 人工智能 ✅ 找到 5 个搜索结果 ---------------------------------------- 🤖 正在调用DeepSeek AI分析搜索结果... ✅ DeepSeek AI回答生成成功 🤖 AI答案: ---------------------------------------- 根据您对最新人工智能新闻的需求,我整理了以下专业信息渠道供您参考: 📊 **实时行业动态类** 1. **AIHub工具导航** - 每日更新行业新闻、产品发布和研究进展,适合开发者与研究者追踪前沿趋势 2. **AI工具导航站** - 汇聚全球AI技术突破、应用案例和企业动态,涵盖政策法规和学术研究 🌐 **深度分析门户** 3. **智能网(中文门户)** - 提供市场前景分析和企业跟踪报道,注意其部分内容更新频率需核实(摘要显示2021年数据) 4. **AI News** - 5天前持续更新的深度分析和趋势洞察,涵盖技术应用与市场动态 ⏱️ **每日快讯类** 5. **AIbase日报** - 每日三分钟精选资讯,适合快速掌握行业动态并获取独家解读 💡 使用建议: - 如需实时追踪:优先选择AIHub和AI工具导航站 - 关注深度分析:推荐AI News和智能网(建议核实日期) - 每日碎片化阅读:AIbase日报最高效 (注:由于搜索结果未提供具体链接,建议通过平台名称直接搜索访问。部分渠道的更新时效性需您实际访问时确认) 希望这些渠道能帮助您及时获取有价值的AI行业资讯! ============================================================ - 用户输入问题
加分项
- 工作流中的每个Agent都有结构化的提示词和标准化的格式输出。
- 使用LlamaIndex智能体框架构建。
- 用Mermaid工具或其他工具,绘制一副框图来描述该工作流。
任务4:构建一个多Agent智能路由工作流
在前一任务中,我们实现了“单一路线的AI工作流”。接下来,本任务将引入 多智能体协作 的概念。你需要设计一个 至少包含两个Agent的系统,利用 智能路由 (Intelligent Routing) 和 ReAct范式 (Reason+Action+Observation) 来动态分配任务并执行。
任务要求
- 首先,你需要构建以下3种智能体
- 一个 路由Agent(Router Agent):负责理解用户输入意图,并智能分发任务。
- 两个规定好的业务Agent:
- 数学Agent(MathAgent):处理用户输入的数学题,并给出解答过程与答案。我们这里给这个数学Agent一个乘法工具,用于计算两数相乘。
- 搜索Agent(SearchAgent):能根据用户的查询来进行联网搜索,并根据搜索到的结果回答问题。(这里可以直接使用任务3中的成果)。
- 一个 总结输出Agent :用于总结最终的答案,输出给用户。
设计重点:
- 路由必须依靠 LLM语义推断(而非简单if-else)来判断该调用
MathAgent还是SummaryAgent。 - 两个业务Agent需采用 ReAct 思维模式(思考-行动-观察-总结),即在回答时显式展现推理过程。
- 不需要外部API调用,全部用LLM本身就能完成任务。
- 接着,实现一个多Agent工作流。
工作流逻辑
- 用户输入
- 示例1:“请帮我计算123乘以456的结果”
- 示例2:“请帮我总结这段话的内容:……”
- 路由Agent
- 解析用户输入 → 推断意图
- 如果是数学计算 → 分流到
MathAgent - 如果是摘要任务 → 分流到
SearchAgent
- 业务Agent执行
- MathAgent(数学Agent)
- ReAct范式:
- 思考(Reasoning):分析用户输入,识别数学运算类型
- 行动(Action):执行计算(可以直接用Python计算 or 让模型做算术)
- 观察(Observation):核对结果是否合理
- ReAct范式:
- SearchAgent(搜索Agent)
- 使用第二问中实现的搜索Agent
- MathAgent(数学Agent)
- 总结Agent总结最终答案,结果返回
- 总结Agent输出最终结果给用户
- 如果业务Agent未能正确处理任务 → 可以反馈回
路由Agent重新判断
输出示例
============================================================
测试用例 1
============================================================
Running step route_task
用户输入:请帮我计算1234567乘以456789的结果
--------------------------------------------------
1. 路由 Agent 正在分析任务类型...
路由决策:MATH
--------------------------------------------------
Step route_task produced event RoutingEvent
Running step generate_final_output
2. 数学 Agent 正在处理...
数学 Agent 回答:1234567乘以456789的结果是563936625363。
--------------------------------------------------
3. 总结 Agent 正在总结最终答案...
--------------------------------------------------
Step generate_final_output produced event FinalOutputEvent
Running step complete_workflow
最终答案:
1234567乘以456789的结果是563936625363。
Step complete_workflow produced event StopEvent
[StreamEvent] StopEvent:
工作流执行完成,结果:1234567乘以456789的结果是563936625363。
============================================================
============================================================
测试用例 2
============================================================
Running step route_task
用户输入:请帮我总结这段话的内容:人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。
--------------------------------------------------
1. 路由 Agent 正在分析任务类型...
路由决策:SUMMARY
--------------------------------------------------
Step route_task produced event RoutingEvent
Running step generate_final_output
2. 摘要 Agent 正在处理...
摘要 Agent 回答:人工智能是计算机科学的一个分支,旨在理解智能的本质并创造能够模拟人类智能的机器。其研究领域广泛,涵盖机器人、语言识别、图像识别、自然语言处理和专家系统等。
--------------------------------------------------
3. 总结 Agent 正在总结最终答案...
--------------------------------------------------
Step generate_final_output produced event FinalOutputEvent
Running step complete_workflow
最终答案:
人工智能是计算机科学的一个分支,旨在理解智能的本质并创造能够模拟人类智能的机器。其研究领域广泛,涵盖机器人、语言识别、图像识别、自然语言处理和专家系统等。
Step complete_workflow produced event StopEvent
[StreamEvent] StopEvent:
工作流执行完成,结果:人工智能是计算机科学的一个分支,旨在理解智能的本质并创造能够模拟人类智能的机器。其研究领域广泛,涵盖机器人、语言识别、图像识别、自然语言处理和专家系统等。
============================================================
加分项
- 使用LlamaIndex智能体框架。
- 每个Agent都有结构化的系统提示词和格式化的输出。
- 使用Mermaid或者其他工具来绘制一个框图,展示这个工作流的工作流程。
进阶部分
下面任务为24级同学选做。可以在下面任务中二选一,也可以全做。
任务5(可选):构建一个带有RAG知识库的Agent
在前几个任务里,我们的智能体主要依赖 LLM 自身的语言理解与推理能力。
但当涉及到 专业知识领域 的知识问答,LLM 常常会出现“幻觉”(编造答案)。
为了解决这个问题,本任务要求你实现一个包含 RAG (Retrieval-Augmented Generation) 的知识型 Agent:
- 能够基于给定的 《多元分析学》教材文本 搭建知识库
- 用户向Agent提问时,Agent依赖 检索 + 生成 来保证答案的准确性
- 最终完成一个 基于教材问答/摘要/复习的AI助理
任务要求
- 构建一个基于RAG的知识库检索工具
- 使用给定的《多元分析学》教材 markdown 文件作为语料:https://github.com/Gonghysin/Multivariate_analysis_markdown/blob/main/%E5%A4%9A%E5%85%83%E5%88%86%E6%9E%90%E5%AD%A6_markdown.md
- 将文本切分为合适的 chunk(例如 500~1000 字)
- 将每个片段用Embedding模型向量化存入本地检索库。
- 将该工具添加到一个Agent里。然后要求实现与这个Agent连续、有上下文记忆的对话。
- 测试样例:
- “请问《多元分析学》的作者是谁?”
- “请问Abel第二定理的内容是什么?”
- LLM基于检索片段生成回答。
- 测试样例:
示例输出
Q: 请问《多元分析学》的作者是谁?
A: 《多元分析学》由黄永忠老师编写了第1章、第2章、第6章、第7章及第4章的第7节,刘艳红老师编写了第3章,韩志斌老师编写了第4章、第5章。全书由黄永忠老师统稿和润色。
Q: 请问Abel第二定理的内容是什么?
A: Abel第二定理指出,如果一个幂级数 $sum a_n x^n$ 的收敛半径 $R$ 是有限且大于零的,那么该级数在 $(-R, R)$ 上是内闭一致收敛的。此外,如果该幂级数在 $x=R$ 处收敛(且 $R neq infty$),那么它在 $(-R, R]$ 的任意闭子区间上都是一致收敛的。
加分项
- 使用LlamaIndex智能体框架。
- 使用ollama本地部署embedding模型。
Ollama教程:https://zhuanlan.zhihu.com/p/17482899149
推荐使用Embedding模型:dengcao/Qwen3-Embedding-4B:Q8_0
- ⭐️使用Docker部署的Qdrant向量储存数据库来储存向量数据
任务6(可选):微调模型
有的时候,我们希望模型能在某一个垂直领域有更强的能力,而且这些能力往往是RAG不足以实现的。例如,当我们需要一个作者Agent的时候,我们希望这个Agent能拥有优美的文风。如果仅仅是在“请你用优美的文风写作”,这样的效果往往差强人意。
所以我们希望,如果我们能利用手上已有的语料数据,例如某一位自己喜欢的作家的文本,用于去微调训练一个自己专属的LLM,从而达到自己想要的输出风格。这时就要用到“微调模型”技术了。
为了解决这个问题,本任务要求你实现一个以基于QLoRA微调技术微调过后的LLM为基础的Agent,能进行可拓展的角色扮演。
任务要求
- 学习以下概念
- 微调模型(fine-tune)
- LoRA微调
- 学习如何租用AutoDL云算力服务器
- 租用服务器教程:https://api.autodl.com/docs/quick_start/
- 推荐显卡选择4090
- 学习实用Vscode的Remote SSH功能来链接AutoDL云服务器:https://blog.csdn.net/qq_38198286/article/details/127886049
- 在服务器中练习linux系统的几个常用命令:https://www.runoob.com/w3cnote/linux-common-command-2.html
- 租用服务器教程:https://api.autodl.com/docs/quick_start/
- 在AutoDL服务器上本地部署Qwen3-14B大模型
- 模型链接:https://huggingface.co/Qwen/Qwen3-14B
- 教程:https://blog.csdn.net/Z2781067882/article/details/140611101
- 用这个本地部署的模型,实现「任务2」中的简单有记忆对话Agent
- 推荐使用Llama-Factory进行模型部署(使用非常方便):https://github.com/hiyouga/LLaMA-Factory
- 微调Qwen3-14B大模型
- 微调数据集使用:https://huggingface.co/datasets/BigPancake01/roleplayLLM_Chinese
- 推荐使用Llama-Factory微调框架进行微调
- 最后展示和微调后的模型进行对话的记录
示例输出
System Prompt:
以下是一段关于旅行者与可莉之间的对话。你需要扮演其中的可莉与旅行者对话。
可莉的信息:可莉是米哈游旗下游戏《原神》中的登场角色,她性格纯真好奇,对外界的一切都充满爱意和探索欲。她热爱爆炸物,对此抱有极大的热忱和创造力,但也因此时常闯祸,不过每次事后都会愧疚地努力弥补。可莉天性贪玩,不计后果,但又极具天赋,一旦才能用对地方,就能爆发出惊人的实力。她对家人和朋友充满深厚的感情,骑士团是她的第二个家,而妈妈则是她的偶像和榜样。可莉的乐观、勇敢和坚持不懈,让她在冒险的道路上不断前行,即使面对困难和挑战,也永远不会放弃自己的梦想和“礼物”——神之眼。
旅行者的信息:旅行者是米哈游出品游戏《原神》中的主角,作为一对跨越诸多世界的双子之一,旅行者与血亲远渡重天,降临名为「提瓦特」的大陆,希望能与这个世界和谐相处。然而,陌生的神灵拦在面前,带走了你唯一的血亲,并将你封印,陷入漫长的沉眠。再度醒来时,天地已变,战火平息,熟悉的景象不复存在,你孤身一人踏上旅途,寻找那位神灵的踪迹。在旅途中,你遇到了旅伴派蒙,并得知此世由七位神灵以「尘世七执政」之名统治七国。你将第一站定为风神建立的自由城邦蒙德,却目睹了深渊教团与至冬国冰之女皇的双重威胁。你与风神化身吟游诗人一同行动,解救被腐化的东风之龙,却在巨龙的瞳中看到了统领深渊之人——那位曾与你一同跨越世界的血亲。旅行者的旅程不仅是对抗危机与寻找亲人的冒险,更是对提瓦特世界真相的探索。你无法获得「神之眼」,却以独特的力量引导元素之力,见证了凡人的渴望与神明的意志。在穿行于诸多世界的旅途中,旅行者不断思考着生命的本质与命运的意义,以坚定的步伐迈向未知的未来,最终将登上「神」之座,守护这个不再灼烧的世界。
Input:
有什么想要分享…
Output:
可莉知道,骑士团的墙是不能炸的。虽然打通了能从禁闭室出去很方便,但凯亚哥哥说,这样做了以后,琴团长恐怕会让我再也见不到第二天的太阳…
测试提交方式
重要提示:本次作业提交方式已更新!
你将不再需要将代码推送到 GitHub。所有提交内容将打包成一个ZIP文件并通过邮件发送。但项目结构和模板仍需参考 GitHub 示例仓库。
1. 代码获取与结构要求
- 项目初始化:请从以下示例仓库中获取项目结构和模板,并在本地进行开发。无需在 GitHub 上创建自己的仓库或进行提交。
- 本地开发分支:建议你的所有本地代码开发都在
main分支上进行,以保持结构清晰。 - 目录结构:请务必遵循以下结构,将各任务代码存放于不同文件夹。
your_project_folder/ # 这是你要打包的项目根文件夹 ├── task_1/ ├── task_2/ ... ├── README.md ├── requirements.txt ├── .gitignore └── .env # 此文件本地存放,不可上传
2. 开发环境与视频要求
- Python版本:统一使用 3.11。
- API Key管理:严禁硬编码,所有Key须通过
.env文件读取。 - 视频录制:每个任务录制一个演示视频,命名为
task1.mp4,task2.mp4... ,总时长 不超过5分钟。
3. 最终提交步骤
- 创建说明文档 在本地创建一个名为
submit.md的文档(无需随项目代码上传),内容包括:- 你的制作思路、遇到的问题和创新点。
markdown语法教程:https://markdown.com.cn/basic-syntax/
推荐markdown编辑器:Obsidian, Typora
- 打包文件 将以下所有需要提交的文件和文件夹打包成一个 ZIP 压缩包:
- 你的项目代码文件夹(例如
your_project_folder/,其中包含所有任务代码、README.md、requirements.txt、.gitignore等)。请务必确保.env文件已从打包的文件中移除。 - 你创建的
submit.md文档。 - 所有任务的演示视频 (
.mp4格式)。
请确保压缩包内容层级清晰,例如:
submission.zip ├── your_project_folder/ # 你的整个项目代码 │ ├── task_1/ │ ├── task_2/ │ └── ... ├── submit.md ├── task1.mp4 ├── task2.mp4 └── ... - 你的项目代码文件夹(例如
- 发送邮件
- 发送压缩包到邮箱: hayisaka@163.com
- 邮件标题格式:
Comsen提交-专业-班级-姓名-学号
Comments NOTHING