--0 背景
最近项目中考虑使用LLM来进行红绿灯信号控制,考虑的是这种涉及调度策略,逻辑分析的工作,交由LLM来执行分析效果会不会好一点,因此做了这个尝试。
--1 框架设计
该系统的核心框架由以下几个模块组成:
Traffic Flow Sim: 交通流仿真模块,演绎交通车在路口的交汇、冲突以及收到红绿灯之后的响应。
LLMClient:负责与LLM模型的交互,支持同步和异步调用,确保系统能够高效地处理多个请求。
LLMClientManager:管理多个LLM客户端实例,支持动态注册、注销和查询客户端,确保系统的灵活性和可扩展性。
TscLLMPromptGenerator:根据输入的交通数据生成符合LLM要求的提示词,两段提示词 user 和 system。
TextUtils:提供文本处理工具,如去除代码块、JSON解析等,确保LLM输出的结果能够被正确解析和处理。
gRPC:通过GRPC协议与外部系统进行通信,提供高效的远程调用接口,确保系统能够与其他交通管理系统无缝集成。
--2 通讯设计
系统采用GRPC(Google Remote Procedure Call)作为通讯协议,具有以下优势:
- 高效性:GRPC基于HTTP/2协议,支持多路复用和流式传输,能够高效处理大量并发请求。
- 跨语言支持:GRPC支持多种编程语言,便于与其他系统进行集成。
- 强类型接口:通过Protobuf定义接口和消息格式,确保通讯的可靠性和一致性。
在系统中,GRPC服务负责接收外部系统的交通数据请求,调用LLM模型生成信号灯控制方案,并将结果返回给调用方。通过GRPC的多线程处理机制,系统能够同时处理多个请求,确保高并发场景下的性能。
--3 提示词设计
提示词设计是系统的关键环节,直接影响LLM模型的理解和输出质量。系统采用了两段式提示词设计,基于proto定义:
- 系统提示词(System Prompt):定义了交通信号灯控制的任务规则、思考步骤、流向类型和组合定义等,确保模型能够准确理解交通信号控制的复杂逻辑。
- 用户提示词(User Prompt):根据实时交通数据动态生成,包含当前路口ID、流向组合、相位信息、交通流量、历史相位和约束条件等,确保模型能够基于最新数据生成合理的信号灯控制方案。
系统能够将复杂的交通信号控制任务转化为LLM模型能够理解的提示词,确保模型输出的准确性和合理性。
--4 提示词生成
提示词生成模块(TscLLMPromptGenerator)负责将输入的交通数据转换为符合LLM要求的提示词。该模块的主要功能包括:
- 加载提示词模板:从文件中加载系统提示词和用户提示词模板。
- 格式化交通数据:将输入的交通数据(如路口ID、流向组合、当前相位、交通流量等)格式化,填充到用户提示词模板中。
- 生成最终提示词:将系统提示词和格式化后的用户提示词组合成最终的提示词列表,供LLM模型使用。
通过这种模块化设计,系统能够灵活应对不同的交通场景,确保提示词的生成过程高效且准确。
--5 LLM调用封装
LLM调用封装模块(LLMClient)负责与LLM模型的交互,支持同步和异步调用。其主要功能包括:
- 同步调用:通过同步接口调用LLM模型,适用于单次请求场景。
- 异步调用:通过异步接口调用LLM模型,适用于高并发场景,能够同时处理多个请求。
- 模型信息展示:提供模型信息的展示功能,便于系统调试和监控。
- 支持多种模型调用:支持本地Ollama 和 远程API 调用,通过yaml文件管理模型
models:
deepseek-chat:
base_url: "https://api.deepseek.com/v1"
model: "deepseek-chat"
api_key: "your-deepseek-api-key"
ollama-local:
base_url: "http://localhost:11434"
model: "ollama-model"
api_key: "your-ollama-api-key"
通过封装LLM调用接口,系统能够灵活选择同步或异步调用方式,确保在不同场景下的性能和效率。
--6 整体运行效果
- 在实际运行中,系统能够根据实时交通数据动态生成信号灯控制方案,提高了交通通行效率同时保证各相位通行公平性,但是似乎对于通行效率而言,LLM会比较容易忽略公平性。
- 单次调用耗时大约是4s ~ 6s,耗时还是有的,采用异步调用时,在本次相位结束前10s调用LLM请求。
- 代码中支持了并发的操作,接下来会尝试让LLM处理多个路口,看效果如何。
Tags:yaml 格式化