人工智能中级培训

HaiYang 5 阅读 AI

day1

Python 环境搭建

  1. Miniconda 安装
  2. python.org
        3.12 版本
    注册环境变量(安装过程中,把勾选项都选中)
  3. jupyter lab
  4. Visual Studio Code
     code.visualstudio.com
    注册环境变量(安装过程中,把勾选项都选中)

Dify 搭建

  1. 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:处理完之后的流向
      规定了节点之间的顺序

大模型能够处理的文本

  1. json
  2. markdown(默认)
  3. xml

大模型的角色:

  1. system: 系统角色,一般来说,优先级最高,只有一个
  2. user/human: 用户角色,用户输入;可以有多个
  3. assistant/ai: 模型角色,模型输出;可以有多个
  4. 经典对话结构:
        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("文件上传失败,无法执行工作流")

案例:合同审查

需求:

  1. 一份合同
  2. 二份法规
  3. 分析:
       三个文件

遍历

  1. 对一个容器内的所有元素都逐个处理一遍的操作!
  2. 也是一种循环!
       每次训练处理一个元素!
       每个元素也只能处理一次!

Agent

  1. 广义上的Agent指的是一切大模型上层应用
  2. 狭义上的Agent指的是大模型 + 外部工具
  3. 一个大模型可以挂载多少个外部工具?
    几个 - 几十个
    一般来说不能太多
  4. 如果外部工具很多,进行拆分
    多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)