Langroid
综合介绍
Langroid 是一个为研究人员和开发人员设计的Python框架,旨在简化由大型语言模型(LLM)驱动的应用程序的构建过程。它由来自卡内基梅隆大学和威斯康星大学麦迪逊分校的研究人员开发,其核心理念是通过多智能体编程来驾驭LLM的强大功能。在这个框架中,开发者可以设置多个智能体(Agent),为它们配备大型语言模型、向量数据库和各种工具,然后分配任务,让这些智能体通过交换消息来协同解决复杂问题。Langroid 的设计注重直观、轻量化和可扩展性,它不依赖于其他LLM框架(如LangChain),并且可以与几乎所有类型的大型语言模型配合使用,为开发者提供了一个灵活且强大的开发环境。
功能列表
- 多智能体协作: 支持创建多个智能体,让它们通过消息传递进行协作,共同完成复杂任务。
- 任务编排: 通过
Task
类来包装智能体,为其设定明确的指令和目标,并能以层级化、递归的方式进行任务委派。 - 广泛的LLM支持: 除了支持OpenAI的系列模型外,还通过代理库和本地服务器(如ollama, LiteLLM)支持数百种其他提供商的LLM,包括开源、本地部署和商业模型。
- 工具/函数调用: 支持OpenAI的函数调用功能,并提供了自有的
ToolMessage
机制,该机制适用于任何LLM。利用Pydantic进行定义,简化了开发流程,并能处理LLM生成的格式错误的JSON。 - 检索增强生成 (RAG): 内置
DocChatAgent
,可以轻松与文档集合(包括本地文件和URL)进行交互,支持文档分块、嵌入、向量存储和检索。 - 多种向量数据库支持: 支持Qdrant, Chroma, LanceDB, Pinecone, pgvector等多种向量数据库,以实现高效的RAG。
- 缓存机制: 支持使用Redis或Momento对LLM的API响应进行缓存,以减少重复调用的成本和时间。
- 可观察性与日志: 生成详细的多智能体交互日志,并维护消息的来源和沿袭,方便开发者追踪和调试。
使用帮助
Langroid 是一个强大的Python框架,它让你能够通过组合不同的“智能体”来构建复杂的应用程序。下面,我们将详细介绍如何安装和使用Langroid来完成一些基本和高级的操作。
安装Langroid
Langroid 需要 Python 3.11 或更高版本。强烈建议在一个虚拟环境中进行安装,以避免与其他项目的依赖冲突。
- 基础安装最核心的安装非常简单,只需要一个命令:
pip install langroid
这个基础版本包含了使用OpenAI模型所需的核心功能。
- 安装附加功能Langroid采用模块化的设计,许多高级功能需要安装额外的依赖。你可以根据需要选择安装:
- 文档聊天功能 (RAG): 如果你需要让智能体读取和理解PDF、Word文档等,需要安装
doc-chat
附加包。pip install "langroid[doc-chat]"
- 数据库交互功能: 如果你想让智能体连接并查询数据库,需要安装
db
附加包。pip install "langroid[db]"
- 你也可以同时安装多个附加包:
pip install "langroid[doc-chat,db]"
- 安装所有功能: 如果你想一次性安装所有可选依赖,可以使用
all
标签,但这会显著增加安装时间和体积。pip install "langroid[all]"
- 文档聊天功能 (RAG): 如果你需要让智能体读取和理解PDF、Word文档等,需要安装
环境配置
安装完成后,你需要配置必要的环境变量,主要是你的大语言模型API密钥。
- 创建
.env
文件在你的项目根目录下,复制仓库中的.env-template
文件并重命名为.env
。cp .env-template .env
- 配置API密钥打开
.env
文件,填入你的OpenAI API密钥。这是启动和运行Langroid最基本的要求。OPENAI_API_KEY=your-key-here-without-quotes
核心概念和操作
Langroid的核心是Agent
(智能体)和Task
(任务)。智能体是执行者,而任务是指导智能体如何行动的说明书。
1. 直接与LLM交互
你可以跳过智能体,直接与一个配置好的LLM进行对话。这对于快速测试模型反应很有用。
import langroid.language_models as lm
# 配置要使用的模型,例如GPT-4o
# 或者使用本地模型 "ollama/mistral"
llm_config = lm.OpenAIGPTConfig(
chat_model=lm.OpenAIChatModel.GPT4o,
)
model = lm.OpenAIGPT(llm_config)
# 直接发送问题并获取回答
response = model.chat("中国的首都是哪里?", max_tokens=20)
print(response.message)
2. 使用智能体进行对话
智能体(ChatAgent
)能够维护对话历史,实现有上下文的交流。
import langroid as lr
# 创建一个默认配置的聊天智能体
agent = lr.ChatAgent()
# 智能体能够记住之前的对话
agent.llm_response("中国的首都是哪里?")
response = agent.llm_response("那印度的呢?") # 智能体会理解“那”指代的是首都
print(response.content)
3. 通过任务来管理智能体
Task
(任务)为智能体提供了一个运行框架,可以定义其角色、目标,并管理与用户的交互循环。
import langroid as lr
# 1. 创建一个智能体
agent = lr.ChatAgent()
# 2. 为智能体创建一个任务,并赋予系统消息(角色设定)
task = lr.Task(
agent,
name="Bot",
system_message="你是一个乐于助人的助手。"
)
# 3. 运行任务,这将启动一个与用户的交互循环
task.run("你好") # 以用户的 "你好" 开始对话
4. 多智能体协同工作
这是Langroid最强大的功能之一。你可以创建多个智能体,并将它们组织起来解决一个更复杂的问题。
例如,我们创建一个“老师”智能体和一个“学生”智能体,让它们进行问答。
import langroid as lr
# 通用的大模型配置
llm_config = lr.ChatAgentConfig(
llm=lr.language_models.OpenAIGPTConfig(
chat_model=lr.language_models.OpenAIChatModel.GPT4o,
),
)
# 创建老师智能体和任务
teacher_agent = lr.ChatAgent(llm_config)
teacher_task = lr.Task(
teacher_agent,
name="Teacher",
system_message="""
向你的学生提出简明的数学问题,并给予反馈。
请从一个问题开始。
"""
)
# 创建学生智能体和任务
student_agent = lr.ChatAgent(llm_config)
student_task = lr.Task(
student_agent,
name="Student",
system_message="简明地回答老师的问题。",
single_round=True, # 学生回答一轮后就等待
)
# 将学生任务设置为老师任务的子任务
teacher_task.add_sub_task(student_task)
# 运行主任务,整个对话将自动进行
teacher_task.run()
在这个例子中,teacher_task
会首先发言(提出问题),然后将控制权交给student_task
,学生回答后,控制权再交还给老师,如此循环。
5. 与文档进行聊天 (RAG)
使用DocChatAgent
,你可以轻松地向一堆文档提问。
import langroid as lr
from langroid.agent.special import DocChatAgent, DocChatAgentConfig
# 配置文档路径,可以是网址或本地文件
config = DocChatAgentConfig(
doc_paths=[
"https://arxiv.org/pdf/2308.08155.pdf", # 一篇关于语言模型的论文
"/path/to/your/notes.txt",
],
)
# 创建DocChatAgent,它会自动处理文档的加载、切分和索引
agent = DocChatAgent(config)
# 将智能体包装在任务中,并开始交互式聊天
task = lr.Task(agent, name="DocAssistant")
task.run("请总结一下这篇论文的核心思想。")
这个过程背后,Langroid自动完成了文档下载、文本提取、分割成块、生成向量嵌入,并存入向量数据库的全部流程。当你提问时,它会先从数据库中检索最相关的文档片段,然后连同你的问题一起交给LLM,从而生成有理有据的回答。
应用场景
- 构建自动化研究助手可以创建一个智能体负责使用搜索引擎查找资料,另一个智能体负责从下载的文档中提取关键信息,第三个智能体负责将这些信息整合成报告。
- 开发交互式数据分析工具利用
TableChatAgent
,用户可以通过自然语言查询CSV文件或数据库中的数据。例如,可以问“上个季度销售额最高的产品是什么?”,智能体会自动生成并执行相应的查询代码。 - 创建特定领域的问答系统通过
DocChatAgent
加载专业领域的文档(如法律条文、医学手册、技术文档),快速搭建一个能够精准回答专业问题的智能问答机器人。 - 模拟复杂系统和流程在商业或社会科学研究中,可以设置代表不同角色(如消费者、供应商、监管者)的智能体,通过它们的互动来模拟市场动态或社会现象。
- 代码生成与解释可以设计一个智能体专门负责根据需求生成代码,另一个智能体则负责解释代码的逻辑和用法,或者在代码出错时进行调试。
QA
- Langroid和LangChain有什么区别?Langroid是一个独立的框架,不使用LangChain。它的设计哲学更侧重于通过多智能体协作来构建应用,其核心抽象是
Agent
和Task
。相比之下,LangChain更侧重于“链”式结构,将不同的组件(模型、提示、工具)串联起来。Langroid认为多智能体架构在处理复杂任务时更具灵活性和可扩展性。 - 我可以使用本地部署的开源大模型吗?可以。Langroid通过与Ollama、LiteLLM等工具集成,可以轻松连接到在本地运行的开源模型,如Llama、Mistral等。你只需要在配置中将
chat_model
指向你的本地模型服务地址即可,例如"ollama/mistral"
。 - 什么是工具(Tool)?它如何工作?工具是让智能体能够执行代码、调用API等超越语言模型本身能力的功能。在Langroid中,你可以通过定义一个继承自
ToolMessage
的Pydantic模型来创建一个工具。当智能体(的LLM)认为需要使用某个工具时,它会生成一个特定格式的“消息”,框架捕捉到这个消息后,会调用你预先定义好的Python函数来执行实际操作,然后将结果返回给智能体。这个过程对开发者来说非常直观。 - 智能体之间如何决定谁来发言?这由
Task
的编排逻辑决定。在层级结构中,父任务负责协调其子任务的执行顺序。默认情况下,任务会按顺序轮流执行(包括与用户的交互)。开发者也可以通过设置single_round
、done_if
等参数来精确控制任务的执行流程和终止条件。 - Langroid是否支持流式输出?支持。Langroid中的许多方法都有异步(async)版本,并且支持流式响应,这意味着你可以像在ChatGPT界面中那样,看到模型的回答一个字一个字地显示出来,而不是等待它生成完整的回答,这对于提升用户体验非常重要。