▲TrafficGPT: Viewing, processing and interacting with traffic foundation models
期刊:Transport Policy
时间:May 2024
作者:Maximilian Geisslinger ✉ , Franziska Poszler & Markus Lienkamp
单位:北京航空航天大学、智能交通技术与系统教育部重点实验室、上海人工智能实验室、大连理工大学
DOI:https://doi.org/10.1016/j.tranpol.2024.03.006
全文速览
本文预计阅读时间15分钟,重点探讨当前热门的大语言模型智能体在智慧城市中的应用,结合TrafficGPT及其代码,深入解析AI在智慧城市中的潜在应用。
01背景
随着ChatGPT等大型语言模型(LLM)向公众的推广,我们已经可以看到它们在常识、推理和计划方面展现出了非凡的能力,经常能提供富有洞察力的指导。这些能力为它们在城市交通管理和控制中的应用提供了巨大的潜力。然而,LLM在处理交通问题方面还存在一些挑战,尤其是在处理数值数据和与仿真交互时,这限制了它们在解决与交通相关的挑战中的潜力。
与此同时,专门的交通基础模型虽然存在,但通常都是为特定任务设计,其输入输出交互有限。将这些模型与LLM结合,为增强它们解决复杂交通问题的能力并提供富有洞察力的建议提供了一种可能。
为了解决这一问题,北京航空航天大学联合其他机构推出了TrafficGPT——一种将ChatGPT与交通基础模型相融合的新型工具。这种整合带来了以下几个关键的增强功能:1) 赋予ChatGPT查看、分析、处理交通数据的能力,并为城市交通系统管理提供富有洞察力的决策支持;2) 促进对广泛且复杂任务的智能解构,并顺序地利用交通基础模型逐步完成这些任务;3) 通过自然语言对话帮助人类在交通控制中做出决策;4) 实现交互式反馈和征求修改后的结果。
通过无缝地将大型语言模型与交通专业知识相结合,TrafficGPT不仅推进了交通管理的进步,还为在这一领域利用人工智能的能力提供了一种新颖的方法。这种创新的结合,展示了智能技术如何更深层次地融入城市运营的各个方面,为未来的智慧城市构建提供了新的思路和可能性。
02架构
TrafficGPT的框架可拆分为3层:
多模态交通数据获取层:TrafficGPT框架利用了多模态交通数据,这些数据来源包括视频数据、探测器数据、仿真系统数据等。
中间数据库管理层:与直接处理这些庞大且复杂的数据源不同,TrafficGPT通过一个中间的数据库管理层来促进数据访问。这一层的存在极大简化了数据处理过程,使得交通基础模型(TFM)能够更高效地获取和处理来自不同来源的数据。通过这种方式,TFM成为连接实际数据和智能处理功能的桥梁,确保了数据的有效整合和利用。
大语言模型执行层:在框架的最外层,一个大语言模型(LLM)扮演着关键的角色。LLM的任务是识别用户需求并通过TFM来指挥任务的执行。这一过程中,LLM不仅需要理解用户的自然语言输入,还要根据这些输入来定制和优化任务执行策略。通过这种方式,LLM能够确保所有操作都严格对应用户的具体需求,同时保持操作的高效和精确。
图1 TrafficGPT 架构
此外,LLM的应用不限于简单的任务执行。它在设计上就具有处理复杂情况和多步骤操作的能力,能够在保证操作效率的同时,也确保数据安全和处理过程的透明度。通过这样的设计,TrafficGPT框架不仅提升了交通管理系统的智能化水平,也为城市交通的可持续发展提供了强有力的技术支持。
03方法
TrafficGPT利用大语言模型来解构和执行复杂的流量相关任务包含以下8个关键步骤:
第1步:自然语言输
一切从用户在TrafficGPT前端以自然语言形式输入任务需求开始。这些输入文本作为提示(prompt),并将传递到下一步的提示管理。在这一环节,用户的直观需求被转化为系统可处理的具体任务,标志着智能系统与用户交互的开始。
第2步:提示管理
提示管理是整个流程的基础步骤,它定义了大语言模型智能体的操作框架。此步骤涉及到明确智能体的工作机制,指定关键考虑因素,并传达关于可用工具集的信息。更为重要的是,这一步骤还支持历史对话内容的整合,以便于多轮交互。提示管理将用户任务请求、系统前缀、可用工具、推理历史和对话历史等元素整合为一个连贯的提示,为智能体提供必要的背景和指令,以便有效地解构和执行任务。
第3步:自然语言理解与任务规划
在这一步骤中,利用大语言模型的能力,智能体理解自然语言中的提示。得益于LLMs固有的认知能力,智能体通过结合任务请求、可用工具集和推理历史库进行演绎推理。这一智力过程最终形成了可识别且可操作的洞见,这些洞见在“图2”的推理过程部分被称为“思考”。
第四步:交通基础模型执行
基于已经形成的“思考”,智能体调用所选的交通基础模型(TFM)中的可用工具,并根据工具定义中规定的前提条件制定参数。利用这些参数,TFM执行各种任务,包括数据库检索和分析、数据可视化和系统优化等功能,最终生成所需的输出结果。
第五步:结果输出与中间答案
在工具执行完成后,智能体通过API接口检索交通基础模型(TFM)的输出结果。然后,智能体将这些输出结果整合为自然语言形式的中间答案,以供大语言模型进一步规划使用。在需要多模态输出作为补充信息的场景中,结构化内容如表格将以Markdown格式产出,同时,可视化图像、数据文件及类似组件将以文件路径的形式提供。
第六步:任务评估与持续执行
智能体将用户任务请求与正在进行的中间答案进行比较分析,以评估任务完成的状态。如果任务尚未解决,流程将回退到第二步至第五步,确保执行过程的迭代连续性。这一步骤是确保智能体能够在未达到预定目标时,持续优化和调整策略,直至找到最佳解决方案。
第七步:最终答案生成
在第六步确认任务已经完成后,智能体利用大语言模型的广泛能力,整合工具生成的输出内容,形成一个决定性的响应。随后,这一精心制作的响应通过前端接口传输给用户。这一步不仅展示了智能体在整合和提炼信息方面的高效能力,也体现了其在提供精确解决方案方面的实用性。
第八步:对话记忆存储
在此步骤中,通过存储用户输入和大语言模型的输出来保留连续对话。这些记录被概述在对话历史中,并作为后续互动中提示管理输入的一部分,提供了一个会话上下文,使得大语言模型具备记忆能力。
图2 TrafficGPT任务执行流程图
此外,LLM的应用不限于简单的任务执行。它在设计上就具有处理复杂情况和多步骤操作的能力,能够在保证操作效率的同时,也确保数据安全和处理过程的透明度。通过这样的设计,TrafficGPT框架不仅提升了交通管理系统的智能化水平,也为城市交通的可持续发展提供了强有力的技术支持。
04应用
作为人工智能交通助手,TrafficGPT 的基本能力在于能够根据人类用户提供的指令进行多轮对话并执行基本任务。
1.基于自然语言理解执行交通相关任务
图3说明了TrafficGPT基于自然语言理解执行交通相关任务的基本能力。在左侧的对话示例中,可以看到数据处理机器人(Data Processing Bot)具备从数据库中提取特定时间段内的交通数据的能力。更令人印象深刻的是,它还能执行复杂的数据可视化命令。这种能力极大地提高了数据处理的效率和直观性,使城市管理者能够迅速做出基于数据的决策。而在右侧的对话中,模拟控制机器人(Simulation Control Bot)展示了其在检索、建模及控制模拟数据方面的能力。这不仅是数据的简单处理,更是对未来城市交通流的预测和模拟,帮助规划者优化交通布局和控制策略,以应对高峰期的交通压力。
图3 TrafficGPT 基于自然语言理解执行交通相关命令的基本能力
2.理解执行模糊任务
如图4所示,从左侧的对话中可以看出,TrafficGPT具有理解并执行模糊任务的能力。在交互过程中,即使面对初步不够明确的指令,它也能通过对话进行逐步明晰,及时纠正执行过程中可能出现的偏差。这种动态调整的能力,使其在处理城市交通管理等复杂情景时更加得心应手。在对话的右侧,我们则可以见到TrafficGPT在需要额外信息时,如何主动向用户请求这些信息的例子。这不仅展示了它的主动性,也体现了智能体技术在实际操作中的灵活性和用户交互的高效性。通过这种方式,TrafficGPT能够确保每一项任务的执行都尽可能地精准,有效地提升了服务的质量和用户的满意度。
图4 TrafficGPT 能够有效处理不明确的指令
3.富有洞察力的决策支持
图5展示了 TrafficGPT 和人类用户之间的 6 轮对话:中间和右侧的栏目记录了在六轮对话中用户的提问与TrafficGPT的回答。这些对话反映了TrafficGPT在处理实际问题时的响应速度和准确性。用户的问题涵盖了从基础信息查询到复杂情况处理的多种需求,而TrafficGPT的回答则准确、及时,完美地展现了其作为智能助手的有效性。左侧的栏目则专门展示了在第一轮对话中TrafficGPT的详细推理和行为过程。在这一部分,我们可以看到TrafficGPT如何逐步解析问题,如何调动其庞大的数据处理能力,以及如何通过逻辑推理来形成最终的答案。这一过程不仅体现了TrafficGPT在技术层面的先进性,也显示了其在实际应用中处理复杂、多变信息的能力。
图5 人类与 TrafficGPT 之间进行的多轮对话
05问题
作为一篇开创性的工作,该篇文章没有进行讨论,并与当前的一些SOTA(state-of-the-art)工作进行对比。因此,尽管这篇文章并未发表在顶尖期刊或知名会议上,但在交通领域结合大型模型进行业务落地方面,仍具有重要的参考价值。
06代码解读
解读1:作者是如何实现agent的?
关于这一节解读的代码,可以参考该网址,其中有相对详细的对于提示工程概念和代码的介绍:https://www.promptingguide.ai/zh介绍整体的代码之前,有必要介绍下整体使用的框架LangChain。
LangChain提供多种工具,可以分为4类:
(1)模型集成工具:这一类工具主要是为了简化与各种语言模型的集成过程,包括但不限于:Model Wrapper,封装各种语言模型,提供统一的调用接口;API Connector,连接外部语言模型API,如 OpenAI 的 ChatGPT。
(2)数据处理工具:为了提高语言模型在特定应用中的效果,Langchain 提供一系列数据处理工具:Tokenizers,文本分词工具,用于将文本转换为模型可以理解的形式;Preprocessors,预处理模块,用于清洗和标准化输入数据。
(3)应用开发工具:这类工具主要是帮助开发者构建和测试语言模型应用:Dialog Manager,对话管理器,用于构建和管理多轮对话系统;Testing Framework,提供一套测试框架,帮助开发者验证模型的性能和稳定性。
(4)部署与维护工具:为了确保语言模型应用的稳定运行,Langchain 还提供了部署和维护相关的工具:包络Deployment Kits:部署套件,帮助将应用部署到各种环境,如云平台或本地服务器;Monitoring Tools:监控工具,用于实时监控应用的性能和状态。
本文章使用的langchian版本为0.0.288属于较老旧的版本。第一个实现的重点是如何把tool进行封装。下面是通过TrafficGPT总结出来的封装逻辑
class toolEncapsulationClass:
def __init__(self, figfolder: str) -> None:
# your code to initial
@prompts(name='your prompt',
def inference(self, target: str) -> str:
# your code to call specific implementation
return the_fig_path
但是实际上,上面的实现已近相对比较旧,是最原始版本的实现,现在可以通过@tools如下直接实现。
from langchain_core.tools import tool
@tool def multiply(first_int: int, second_int: int) -> int:
"""Multiply two integers together."""
return first_int * second_int
一般agent系列为了py引用的方便,会把tools和最终的agent放在同一个package里面,这样不涉及py的相对路径引用的问题。TrafficGPT原代码生成最核心的agent是如下的部分:
prompt = ZeroShotAgent.create_prompt(
tools,
prefix=customedPrefix,
suffix=suffix,
input_variables=["input", "chat_history", "agent_scratchpad"], )
self.agent_memory = ConversationBufferMemory(memory_key="chat_history")
llm_chain = LLMChain(llm=llm, prompt=prompt)
agent = ZeroShotAgent(
llm_chain=llm_chain,
tools=tools, verbose=verbose )
self.agent_chain = AgentExecutor.from_agent_and_tools(
agent=agent, tools=tools,
verbose=verbose, memory=self.agent_memory,
handle_parsing_errors="Use the LLM output directly as your final answer!" )
可以看到这里调用的是ZeroShotAgent函数,那么我们需要思考llm里面的agent到底有哪些,为什么这里是ZeroShotAgent。以及agentExecutor和agent在意义理解上面的区别。
agentExecutor是相对于更加顶层的封装,这个能直接调用执行用户的直接输入。agent则是决定agent的类型。我们可以访问该网址https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/agents/react/base.py#L80,了解langchian有哪些agent的类型,现在的agent的类型显然还比较少,比较重要的有self_ask_with_research,react,tool_calling_agent等,这些其实是对于agent的类型进行定义。
对于提示工程这部分,其实我们需要祛魅的来看待这项技术,比如COT,中文名是思维链,实际上就是提示例子。思维链这个名字就徒增了这件事情的复杂性,本质上是非常简单的事情,就是先手动给出一些例子的思考过程。这部分langchain并没有实现,因为思维链是特例化的,只能用在少部分场景。所谓的零样本思维链就是在prompt添加’’’让我们一步一步思考’’’。
我们可以具体阅读langchain的react的实现流程,最关键的代码已经在下方展示出来,可以看出来,这里有个最基本的两个tools,分别是search和look up。这里回到react的论文,其中有三个最核心的步骤,是Observation,Thought,Action。那么到这里读者是不是还有一点别的问题,这几个步骤分别是如何实现的,以及LLM为什么会这样做:Observation其实就是对应search和look up这两个函数,只不过一个是范围比较广的搜索,一个相对偏细节的查询。那么Thought是如何做的呢,其实Thought的保证是Pormpt的,Langchain在0.1.0的版本会以一个解锁的游戏作为Prompt,然后在0.2.0的版本中,会从langchainhub下载Prompt,新的Prompt简短很多,就是说要用Prompt。所以回到本质,实际上Thought的保证是通过LLM的遵循指令的能力保证的,我们加上Prompt只是在引导LLM这样回答, 或者说是用了COT(0.1.0直接给例子)或者零样本COT(最新的版本0.2.0给描述)的办法,推荐LLM这样回答。但是如果这个LLM的能力不够强,比如没有经过指令微调,或者没有经过超大规模的数据集训练,那么所谓的React就是没有任何价值的,因为React必须要基于LLM的遵循指令的能力。这也折射出当前的Agent研究的问题,被动地等待大模型的能力的提升才能有更好的效果。但是我始终认为提示工程是必须要的,以后重要性也不会降低。这就好比做题,大模型是学生,提示工程的质量代表了题目描述地多清楚,当然是描述地越清楚学生作对的概率越大,所以提升学生能力的同时把题目描述清楚也是必要的。
@deprecated("0.1.0", removal="0.2.0")
class ReActChain(AgentExecutor):
"""[Deprecated] Chain that implements the ReAct paper."""
def __init__(self, llm: BaseLanguageModel, docstore: Docstore, **kwargs: Any):
"""Initialize with the LLM and a docstore."""
docstore_explorer = DocstoreExplorer(docstore)
tools = [
Tool(
name="Search",
func=docstore_explorer.search,
description="Search for a term in the docstore.", ),
Tool(
name="Lookup",
func=docstore_explorer.lookup,
description="Lookup a term in the docstore.", ), ]
agent = ReActDocstoreAgent.from_llm_and_tools(llm, tools)
super().__init__(agent=agent, tools=tools, **kwargs)
解读2:作者是如何实现所谓的交通流量建模的?
这里作者的实现的思路是针对不同的问题封装tools,所以其实所谓的针对所有的交通任务是不可能的,就此来看GPT只是完成了一个自然语言调用函数的作用加上一些简单的分析。但是这里GPT的重要作用就是能够有组织的调用函数,而且知道正确的顺序。比如用户问了相对简单的问题:分析traffic network然后提出优化的建议,然后模型就知道先去调用查询函数,查询哪些是通过延迟最高和通过速度最低的路口。但是这里有非常严重的问题,就是作者测试的数据量是非常小的,也就是整个数据库就只有OD map显示出来的那几百个街道的流量,交叉路口也是在百这个数量级,这可能是这篇论文没办法走向实用的问题。所有的tools还是采用输入一个大的str,然后和GPT规范好这个str,比如一个交叉路口ID的list,中间则是逗号分隔。
所以本篇文章的创新点算是Agent赋能传统行业的经典创新,所谓的webster优化算法也是前人提出的,作者只是构建了一个和AI交互的窗口然后更加智能化的系统,但是所谓的交互也做得较少,因为数据量只有很短的时间,也是不算大的地点。很有可能随着scale的增加,GPT就不能做到很精确的调用,导致整个系统未知的问题。
07总结
总的来说,TrafficGPT在交通管理和AI整合领域代表了一次进步。通过无缝整合大语言模型的能力与交通基础模型的专业技术,这种方法不仅推进了交通管理领域的发展,还为在这一领域利用AI能力提供了新的视角。TrafficGPT的适应性和灵活性,允许根据具体业务需求整合TFM,加上LLM对任务需求的自主选择和执行TFM,这标志着在解决交通和城市规划领域的复杂挑战上迈出了重要的一步。这种方法不仅提高了AI任务执行的效果和可靠性,还引入了决策辅助中所必需的洞察力和创造力层面。
尽管存在一些不足,例如利用各种tricky(如缩小数据量)、人工绘制论文展示图、缺乏多次测试等问题。但作者开诚布公地展示代码,使大家可以免费学习,这种态度有助于推进LLM在智慧交通和智慧城市领域的应用。