人工智能中级培训
day1
Python 环境搭建
- Miniconda 安装
- python.org
3.12 版本
注册环境变量(安装过程中,把勾选项都选中) - jupyter lab
- Visual Studio Code
code.visualstudio.com
注册环境变量(安装过程中,把勾选项都选中)
Dify 搭建
- docker 环境
docker desktop
wsl
案例
万能翻译
代码调用
import requests
base_url='https://pn10825mi7139.vicp.fun/v1/completion-messages'
api_key='app-04CSESf9RdtmvKD67eW66C6X'
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
text1="你好"
text2="你好"
language1="英语"
language2="日语"
for language,text in zip ([language1, language2],[text1, text2]):
# 请求数据
data = {
"inputs": {"language": f"{language}","text": f"{text}"},
"response_mode": "blocking",
"user": "abc-123"
}
r = requests.post(url=base_url, headers=headers, json=data)
print(r.json()['answer'])
文本摘要
代码调用
import requests
base_url='https://pn10825mi7139.vicp.fun/v1/completion-messages'
api_key='app-tYahTRpgAxxHuS7Q1rM0G1rR'
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
text="""
在城市的一隅,有一座老旧的居民楼,斑驳的墙壁诉说着岁月的故事,楼道里弥漫着陈旧的气息。林羽就住在这栋楼的 302 室,一个狭小却充满生活痕迹的空间。
林羽是一名普通的上班族,每天清晨,在嘈杂的闹钟声中醒来,匆忙洗漱,抓起一片面包便冲出门去。他在一家广告公司工作,压力如影随形。办公室里,电脑屏幕闪烁,键盘敲击声此起彼伏,同事们都在为了项目争分夺秒。林羽也不例外,他常常对着设计稿绞尽脑汁,为了一个创意反复修改,直到深夜。
这一天,林羽像往常一样加班到很晚。当他拖着疲惫的身躯回到家,打开门,屋里一片漆黑寂静。他打开灯,看着空荡荡的房间,心中涌起一股难以言喻的孤独。他走到窗前,望着窗外灯火阑珊的城市,思绪飘远。
林羽想起了自己的梦想,曾经,他怀揣着对艺术的热爱,渴望成为一名出色的设计师,用自己的作品打动人心。然而,现实却像一堵无形的墙,将他的梦想渐渐挤压。工作的压力、生活的琐碎,让他渐渐迷失了方向。
就在他沉浸在思绪中时,手机突然响起,是母亲打来的电话。电话那头,母亲关切的声音传来:“儿子,最近工作忙不忙?要注意身体啊。”林羽心中一暖,强装轻松地说:“妈,我挺好的,您别担心。”挂了电话,林羽的眼眶微微湿润。他意识到,生活虽然充满了艰辛,但家人的关爱始终是他最坚实的后盾。
第二天,林羽在上班途中遇到了一位卖花的老奶奶。老奶奶的摊位不大,几束鲜花在阳光下显得格外娇艳。林羽停下脚步,买了一束百合。当他捧着花走进办公室,同事们都投来了惊讶的目光。有人打趣道:“林羽,今天怎么这么有情调?”林羽笑了笑,没有说话。他将花插在办公桌上,顿时,整个办公室都弥漫着一股淡淡的花香。
在接下来的日子里,林羽开始尝试改变自己的生活。他不再把所有的时间都投入到工作中,而是学会了在工作之余给自己放松。周末,他会去公园散步,感受大自然的美好;也会参加一些绘画兴趣班,重拾自己的爱好。
一次,公司接到了一个重要的项目,要求设计一款公益广告。林羽主动请缨,他将自己对生活的感悟融入到设计中。广告画面中,一位孤独的老人坐在窗前,望着窗外的繁华,眼神中充满了渴望。而窗外,是一群年轻人欢快的身影。广告的主题是“关爱老人,让生活充满温暖”。
这个设计得到了客户的高度认可,也为公司赢得了荣誉。林羽也因此得到了领导的表扬和同事们的赞赏。那一刻,他感受到了生活的回馈,也明白了生活不仅仅是忙碌和奔波,更是对梦想的坚持和对美好的追求。
生活就像一场漫长的旅程,途中会有风雨,会有坎坷,但也会有阳光,会有花香。林羽在这座城市里,继续书写着自己的生活故事,他知道,未来的路还很长,但只要怀揣着希望,勇敢前行,生活就会充满无限可能。
"""
num=100
data = {
"inputs": {"num": f"{num}","text": f"{text}"},
"response_mode": "blocking",
"user": "abc-123"
}
r = requests.post(url=base_url, headers=headers, json=data)
print(r.json()['answer'])
聊天助手
day2
工作流
1. 规范大模型处理的宏观路径
2. graph:
node:节点,对数据的一次处理
从前面的节点获取处理
处理完之后,交给后续节点
特殊节点:
开始节点:
必须的!
做数据的输入!
结束节点:
必须的!
做数据的输出!
edge:处理完之后的流向
规定了节点之间的顺序
大模型能够处理的文本
- json
- markdown(默认)
- xml
大模型的角色:
- system: 系统角色,一般来说,优先级最高,只有一个
- user/human: 用户角色,用户输入;可以有多个
- assistant/ai: 模型角色,模型输出;可以有多个
- 经典对话结构:
system
user
assistant
user
assistant
…
案例:任意文件提问
需求:
有一个文件,我想基于这个文件进行任意的提问?
代码调用工作流
import requests
import json
import os
base_url="https://pn10825mi7139.vicp.fun/v1"
api_key="app-23TSEIKnkQcLtJIOOjl4tDO8"
def upload_file(file_path, user):
upload_url = f"{base_url}/files/upload"
headers = {
"Authorization": f"Bearer {api_key}",
}
try:
print("上传文件中...")
with open(file_path, 'rb') as file:
files = {
'file': (os.path.split(file_path)[-1], file, 'text/plain') # 确保文件以适当的MIME类型上传
}
data = {
"user": user,
"type": "TXT" # 设置文件类型为TXT
}
response = requests.post(upload_url, headers=headers, files=files, data=data)
if response.status_code == 201: # 201 表示创建成功
print("文件上传成功")
return response.json().get("id") # 获取上传的文件 ID else:
print(f"文件上传失败,状态码: {response.status_code}")
return None
except Exception as e:
print(f"发生错误: {str(e)}")
return None
def run_workflow(file_id, user, response_mode="blocking"):
workflow_url = f"{base_url}/workflows/run"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
data = {
"inputs": {
"why_file": {
"transfer_method": "local_file",
"upload_file_id": file_id,
"type": "document"
},
"query": "汤姆和杰瑞,谁学习更好?"
},
"response_mode": response_mode,
"user": user
}
try:
print("运行工作流...")
response = requests.post(workflow_url, headers=headers, json=data)
if response.status_code == 200:
print("工作流执行成功")
return response.json()['data']['outputs']['text']
else:
print(f"工作流执行失败,状态码: {response.status_code}")
return {"status": "error", "message": f"Failed to execute workflow, status code: {response.status_code}"}
except Exception as e:
print(f"发生错误: {str(e)}")
return {"status": "error", "message": str(e)}
# 使用示例
file_path = "E:\\Desktop\\stu_score.CSV"
user = "difyuser"
# 上传文件
file_id = upload_file(file_path, user)
if file_id:
# 文件上传成功,继续运行工作流
result = run_workflow(file_id, user)
print(result)
else:
print("文件上传失败,无法执行工作流")
案例:合同审查
需求:
- 一份合同
- 二份法规
- 分析:
三个文件
遍历
- 对一个容器内的所有元素都逐个处理一遍的操作!
- 也是一种循环!
每次训练处理一个元素!
每个元素也只能处理一次!
Agent
- 广义上的Agent指的是一切大模型上层应用
- 狭义上的Agent指的是
大模型 + 外部工具 - 一个大模型可以挂载多少个外部工具?
几个 - 几十个
一般来说不能太多 - 如果外部工具很多,进行拆分
多Agent系统
每个Agent负责一个方向,挂载某些专属工具
案例:客服助手
网络问题
交给网络Agent解决
公共大模型
网络知识库
网络相关的工具
宽带问题
交给宽带Agent解决
公共大模型
宽带知识库
宽带相关的工具
扣费问题
交给扣费Agent解决
公共大模型
扣费知识库
扣费相关的工具
套餐问题
交给套餐Agent解决
公共大模型
套餐知识库
套餐相关的工具
其他问题
交给其他Agent解决
公共大模型
其他知识库
其他相关的工具
思考问题
1.向量搜索、微调、预训练、强化学习分别适用什么场景,同一个向量库存储文件越来越多,带来的干扰和性能问题如何解决?
- 什么样的知识应该去微调?
- 生命周期比较长的通用知识! - 什么样的知识应放入RAG?
- 2025年通服公司出差报销标准!
2.做智能体过程中,为了提升准确性和稳定性,会增加大模型调用次数,带来时延过长问题如何解决?
3.目前很多ai工具都支持长文本处理,而且响应速度非常快,如果通过rag来做速度肯定会很慢,我想知道那些工具是如何实现长文本处理响应还特别快?
4.大模型的参数设置是否有相关标准,例如,温度参数,kv缓存,如何确保参数的合理性?
day3
MCP
1、MCP是一个工具箱
内部包含了很多个相互协同工作的工具
2、在开发前,需要按照微服务的理念进行接口拆解
3、针对每个接口开发即可
1)入参要尽量简单!使用pydantic进行参数约束
2)docstring是核心!!!
3)报错信息要语义化!
4)依赖底层支持库MCP进行开发即可。
代码创建MCP
# FastAPI
from mcp.server.fastmcp import FastMCP
# 创建一个 MCP 实例
# 0.0.0.0 任何IP都可以访问我
# 8000 端口
mcp = FastMCP(name="富士康", host="0.0.0.0", port=8000)
# 添加一个工具
@mcp.tool()
def get_bike_price(model: str = "A") -> dict[str, float | str]:
"""
功能:
查询某一个型号的自行车价格 参数:
model: 自行车型号,目前只支持 A, B, C 三种型号,其它型号暂不支持!
""" if model not in ("A", "B", "C"):
return {
"model": model,
"price": "目前只支持 A, B, C 三种型号,其它型号暂不支持!",
}
elif model == "A":
return {
"model": model,
"price": 800.0,
}
elif model == "B":
return {
"model": model,
"price": 600.0,
}
else:
return {
"model": model,
"price": 400.0,
}
@mcp.tool()
def get_student_score(name: str) -> dict[str, float | str]:
"""
功能:
查询某个学生的分数 参数:
name: 学生姓名
""" if name == "张三":
return {"name": name, "score": 90}
elif name == "李四":
return {"name": name, "score": 80}
else:
return {"name": name, "score": "暂无此学生分数!"}
if __name__ == "__main__":
# 启动 MCP 服务
mcp.run(transport="streamable-http")
代码创建Agent
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
# MPC 管理器
from mcpstore import MCPStore
# 初始化 storestore = MCPStore.setup_store()
# 添加服务
store.for_store().add_service(
config=[
{"name": "李晓华", "url": "http://pn10825mi7139.vicp.fun/mcp"},
# {
# "name": "高德地图",
# "url": "https://mcp.amap.com/mcp?key=95db6cb338a2b44f56f53b79a14e7a8b", # }, ]
)
# 转换成 langchain 的工具
tools = store.for_store().for_langchain().list_tools()
print(tools)
llm = ChatOpenAI(
temperature=0.1,
model="qwen-max",
openai_api_key="sk-135e890e556c49ffa234acd405f169cb",
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
def get_model():
return llm
def get_agent():
return create_react_agent(model=llm, tools=tools)
if __name__ == "__main__":
agent = get_agent()
response = agent.invoke(
input={"messages": [{"role": "user",
"content": "A类自行车多少钱?"}]}
)
for msg in response["messages"]:
msg.pretty_print()
可视化页面调用Agent
import streamlit as st
from models import get_agent
from langchain_core.messages import HumanMessage
# 设置页面配置
st.set_page_config(page_title="MCP Client Demo",
page_icon=":smiley:",
layout="wide")
# 居中显示标题
st.markdown(
body="<h1 style='text-align: center;'>MCP Client Demo</h1>", unsafe_allow_html=True
)
st.markdown(
body="<h3 style='text-align: center;'>李晓华</h3>", unsafe_allow_html=True
)
# 加载模型
@st.cache_resource
def get_my_agent():
return get_agent()
agent = get_my_agent()
if "history" not in st.session_state:
st.session_state.history = []
st.sidebar.markdown("### 系统设置")
if st.sidebar.button("清空对话"):
st.session_state.history = []
for msg in st.session_state.history:
with st.chat_message(name=msg.type):
st.markdown(msg.content)
# 提问框
query = st.chat_input(placeholder="请输入你的问题...")
if query:
# 渲染用户提问消息
with st.chat_message(name="user"):
st.markdown(query)
st.session_state.history.append(HumanMessage(content=query))
# 调用 Agent repsonse = agent.invoke(input={"messages": st.session_state.history})
# 渲染结果
with st.chat_message(name="assistant"):
last_message = repsonse["messages"][-1]
st.markdown(last_message.content)
st.session_state.history.append(last_message)
模型微调
网址:
LLaMA Factory
AutoDL
介绍:
1、训练:
1)训练是从头开始,需要1.5个月的时间学完40T的数据
2)千卡万卡平台,做大量的数据并行 data parallel
2、微调:
1)微调是直接从已有模型开始,做很少的数据(几百条起)学习
2)只要能把模型放得下
3)LoRA微调
3、相同点:
1)都是三个阶段
①预训练
②指令监督微调
③偏好优化
2)都是修改模型参数
4、Qwen2.5-0.5B-Instruction
1)2G完全足够了
2)数据并行
5、微调的好处和坏处
1)好处:
①学习私有知识!更好的理解我私有的业务
2)坏处:
①通用能力会下降
②很容易过拟合
模型评价
1、本质:考试、测评
2、MMLU、CMMLU、C-Eval …
3、考试:
1)学科考试
2)推理能力测试
4、TDD:
1)Test Driven Development
RAGvs微调
1、微调:
1)修改参数,修改知识,影响模型的行为
2)大的平台
2、RAG:
1)外挂知识库,影响模型的行为
2)外挂知识库
3)大模型和私有知识的解耦合
如何提升RAG的性能
1、我的知识分段多长比较好?
1)没有标准答案
2、如何提升召回率
1)一鱼多吃
2)用冗余来提升召回率
①用冗余并行找回,10个
②对所有结果进行重排序
微调流程
1、先测评
1)私有知识测评
①只有私有知识才须有微调
2)公开知识测评
②llamafactory-cli eval examples/train_lora/llama3_lora_eval.yaml
2、微调
3、测评
4、导出
5、安装vllm
6、启动
vllm serve Qwen2.5-0.5B-Instruction --port 9090
7、测试
from langchain_openai import ChatOpenAI
base_url="http://exp.com/v1"
model="Qwen2.5-0.5B-Instruction"
api_key="123"
```python
llm = ChatOpenAI(model=model,openai_api_base=base_url,openai_api_key=api_key)
response = llm.invoke("请简单介绍vLLM模型服务的优势")
print(response.content)