2025.8.5学习日记
1.xiaozhi-server
1.1 xiaozhi-MCP
小智的MCP服务主要参考以下文档MCP接入点部署指南,MCP接入点使用指南,MCP终端服务器。
【MCP接入点部署指南】:
第一步:下载MCP接入点项目源码
根据本项目地址MCP终端服务器,下载ZIP至本地重命名为endpoint-server
第二步:启动程序
这里其实分为了docker启动和源码启动,为了学习方便,参照源码启动MCP服务教程,下载完毕后,安装依赖,启动MCP服务器即可。建议直接在Anaconda Poweshell Prompt
中使用python main.py
启动即可(记得先进入相关文件夹中)
【注】:禁用PyCharm自动更新
第三步: 回到xiaozhi-server,配置MCP接入点
这里分为了单模块部署和全模块部署的区别,单模块部署请在data/.config.yaml文件下的mcp_endpoint中添加上一步骤中的token
,如果是全模块部署请在智控台部分添加key
,最后回到xiaozhi-server
使用python app.py
启动xiaozhi服务端即可,出现mcp接入点
是ws://192.168.1.25:8004/mcp_endpoint/mcp/?token=abc
则配置成功
【MCP接入点使用指南】:
第一步:搭建具有MCP工具的服务器
这一步以计算器功能为例,下载这个项目,通过如下方法安装
# 进入项目目录
cd mcp-calculator
conda remove -n mcp-calculator --all -y
conda create -n mcp-calculator python=3.10 -y
conda activate mcp-calculator
pip install -r requirements.txt
第二步:启动MCP工具端服务器
首先拿到上述的MCP接入点地址
,而后设置环境变量MCP_ENDPOINT
,最后通过python mcp_pipe.py calculator.py
启动工具端服务器
【注】由于WINDOWS无法直接使用export MCP_ENDPOINT = ...
,所以通过进入到mcp_pipe.py
源代码中,修改endpoint_url
变量为你上述拿到的MCP接入地址
第三步:查看结果
将mcp-endpoint-server
,mcp-calculator
,xiaozhi-server
按顺序启动,而后使用../xiaozhi-server/test
文件夹下的网页测试工具,之后会跳出以下消息,此时你的计算器calculator就可以正常使用了
【注】:如果在过程中出现了json
文件缺失,可以按照命令行中的提示,将mcp_server_settings.json
复制一份到./data
目录下,并删除json
文件中mcpServer
键对应的所有值
1.2 自定义MCP工具
目前本地部署的mcp服务主要通过websocket接口,使用stdio传输方式;而使用远程部署的mcp服务需要修改provider这边的内容
这里需要补充如下的前置概念
- Host:
Host
为xiaozhi-server
- Server:
Server
为xiaozhi-esp32
程序,其运行在ESP32硬件上,该程序源码中包含了一个用C++编写的MCPServer
类,除了设备以外,在其他主机上编写MCPServer
- Client:
Client
在xiaozhi-server
上搭建,在xiaozhi-server
的源码中编写了device_mcp
与server_mcp
,用于创建Host
上的MCPClient
- 初始化阶段
- 信息交互阶段
2.Model Scope上的MCP
魔搭社区上的MCP组件包括了创空间,MCP-Inspector
3.版本控制系统
3.1 简介
版本控制系统全程为Version Control System
,简称VCS
,常见的版本控制系统工具有集中式版本控制工具(SVN)
与分布式版本控制工具(Git)
。Pycharm支持的版本控制系统工具就有上述两种
3.2 仓库的使用
4. 异步IO
asyncio 协程运行在同一个线程中,需要协程主动通过 await 释放控制权给事件循环,由事件循环来决定下一个运行哪个协程(一般让await关键字后的协程执行)。这两种模型各有优劣,在嵌入式和服务器端有不同的适用场景。
4.1 介绍
- 核心概念:
核心概念包括协程(Coroutine),事件循环(Event Loop),任务(Task),Future - 基本用法:
1.要运行一个协程,可以使用asyncio.run()
函数。它会创建一个事件循环,并运行指定的协程。
2.可以使用asyncio.gather()
函数并发执行多个协程,并等待它们全部完成。
3.可以使用asyncio.wait_for()
函数为协程设置超时时间。如果协程在指定时间内未完成,将引发asyncio.TimeoutError
异常。 - 应用场景
1.网络请求:如 HTTP 请求、WebSocket 通信等。
2.文件 I/O:如异步读写文件。
3.数据库操作:如异步访问数据库。
4.实时数据处理:如实时消息队列处理。
4.2 常用类,方法,函数
- 核心函数
核心函数包括run
,create_task
,gather
,sleep
,wait
。这里较为重要的有run
运行异步主函数,create_task
,创建任务并加入事件循环(Loop),gather
并发运行多个协程 - 协程与任务
async def
定义协程,cancel()
取消任务,done()
检查任务是否完成,result
获取任务结果 - 同步原语
Lock()
异步互斥锁,Event()
事件通知,Queue()
异步队列,Semaphore()
信号量 - 网络与子进程
open_connection()
建立TCP连接,start_server()
创建TCP服务器,create_subprocess_exec()
创建子进程
【注】:
- Python版本:部分功能需Python 3.7+(如asyncio.run())。
- 阻塞操作:避免在协程中使用同步阻塞代码(如time.sleep())。
- 调试:设置PYTHONASYNCIODEBUG=1环境变量可启用调试模式。
- 取消任务:被取消的任务会引发CancelledError,需妥善处理。
4.3 重要的概念
事件循环,asyncio.run(main())
会隐式创建一个Event Loop
,并选择main()
中创建的协程Coroutine
或者Task
运行
5. RAG
原生RAG(纯代码实现),无参构造函数,创建默认的对象,指定5个构造参数,创建对象