跳转到主要内容

热门内容

今日:


总体:


最近浏览:


Chinese, Simplified

category

在这个大型语言模型(LLM)时代,人们对利用这一变革性技术创建智能应用程序的需求是前所未有的。对于开发人员来说,在复杂的应用场景中利用LLM潜力的最佳方式是什么?

由于各种技术和实际原因(上下文长度限制、LLM脆性、延迟、令牌成本),这并不像向LLM系统抛出任务并期望它完成那么简单。所需要的是一个有原则的编程框架,提供正确的抽象和基元集,使开发人员在构建LLM应用程序时富有成效。

Langroid优雅的多Agent范式


Langroid团队(前CMU/UW Madison研究人员)对此有着独特的见解——他们构建了一个开源Python框架,以使用多代理编程范式简化LLM应用程序开发。Langroid的体系结构建立在Agent作为一流公民的基础上:它们是消息转换器,通过消息协作完成任务。

Langroid正在成为一种流行的LLM框架;开发人员欣赏其简洁的设计和直观、可扩展的体系结构。使用Langroid编程很自然,甚至很有趣:您可以配置Agent并为它们配备功能(如LLM、矢量数据库和函数调用/工具),连接它们,并让它们通过消息进行协作。这是一种“对话编程”范式,适用于本地/开放和远程/专有LLM。(重要的是,它不使用LangChain或任何其他现有的LLM框架)。

An Agent serves as a convenient abstraction, encapsulating the state of LLM conversations, access to vector stores, and various tools (functions or plugins). A Multi-Agent Programming framework seamlessly aligns with the demands of complex LLM-based applications.

代理作为一个方便的抽象,封装LLM会话的状态、对向量存储的访问以及各种工具(函数或插件)。多代理编程框架自然符合基于LLM的复杂应用程序的需求。

通过任务连接代理


在Langroid中,ChatAgent有一组“响应者”方法,每个“实体”一个:LLM、人员和工具处理程序。然而,它没有任何方法来遍历这些响应程序。这就是Task类的作用所在:Task包装Agent,并使其能够通过Task.run()方法循环通过其响应程序。

任务循环是围绕简单的规则组织的,这些规则控制响应者何时有资格响应、什么是有效响应以及任务何时完成。Task循环最简单的例子是与人类用户的交互式聊天。任务还使代理能够与其他代理交互:其他任务可以作为递归、分层(或DAG)结构中的子任务添加到任务中。从Task的角度来看,子任务只是附加的响应程序,并且呈现与Agent的“本机”响应程序相同的字符串到字符串消息转换接口(函数签名)。这是Langroid中任务可组合性的关键,因为子任务的行为方式与Agent的“本地”响应程序相同,并且受任务编排规则的约束。结果是,相同的任务编排机制无缝地实现了工具处理、LLM偏离时的重试以及对子任务的委派。更多详细信息请参阅Langroid快速入门指南。

Langroid编码的一种尝试
要开始使用Langroid,只需将其从pypi安装到您的虚拟环境中:

pip install langroid
要直接与OpenAI LLM聊天,请定义LLM配置,实例化语言模型对象,并与之交互:。。。。

import langroid as lr
import langroid.language_models as lm

llm_cfg = lm.OpenAIGPTConfig() # default GPT4-Turbo
mdl = lm.OpenAIGPT(llm_cfg)
mdl.chat("What is 3+4?", max_tokens=10)


MDL不维护任何会话状态;为此,您需要一个聊天代理:

agent_cfg = lr.ChatAgentConfig(llm=llm_cfg)
agent = lr.ChatAgent(agent_cfg)
agent.llm_response("What is the capital of China?")
agent.llm_response("What about France?") # interprets based on previous msg


将ChatAgent封装在Task中,以创建与用户的基本交互循环:

task = lr.Task(agent, name="Bot")
task.run("Hello")


让教师代理人与学生代理人交谈:

teacher = lr.ChatAgent(agent_cfg)
teacher_task = lr.Task(
teacher, name="Teacher",
system_message="""
Ask your student simple number-based questions, and give feedback.
Start with a question.
""",
)
student = lr.ChatAgent(agent_cfg)
student_task = lr.Task(
student, name="Student",
system_message="Concisely answer your teacher's questions."
)
teacher_task.add_sub_task(student_task)
teacher_task.run()


检索增强生成(RAG)和矢量数据库


最流行的LLM应用程序之一是通过矢量数据库支持的检索增强生成(RAG)对文档进行问答。Langroid有一个内置的DocChatAgent,它集成了几种先进的RAG技术,布局清晰,易于理解和扩展。

内置对LanceDB的支持

 

Langroid使用LanceDB作为其DocChatAgent的默认矢量存储。
默认情况下,Langroid的DocChatAgent使用LanceDB无服务器矢量数据库。由于LanceDB使用文件存储,因此易于设置和使用(不需要docker或云服务),并且由于其使用Lance柱状格式,因此具有高性能和可扩展性。此外,Langroid有一个专门的LanceDocChatAgent,它利用了LanceDB的独特功能,如全文搜索、类似SQL的过滤和Panda数据帧互操作。设置一个基本的RAG聊天机器人很简单(假设之前的导入):
from langroid.agent.special.lance_doc_chat_agent import import (
LanceDocChatAgent, DocChatAgentConfig
)
llm_config = lm.OpenAIGPTConfig()

rag_agent_config = DocChatAgentConfig(
llm=llm_config, 
doc_paths=["/path/to/my/docs"], # files, folders, or URLs.
)
rag_agent = LanceDocChatAgent(rag_agent_config)
rag_task = lr.Task(rag_agent, name="RAG")
rag_task.run()📄Chat with IMDB movies dataset


有关在多代理设置中展示工具/函数调用+RAG的示例,请参阅他们的快速入门Colab笔记本,该笔记本显示了一个双代理系统,其中一个代理负责从文档中提取结构化信息,并生成问题供另一个代理使用RAG回答。在Langroid示例库中,有一个具有相同功能的脚本,下面是它的实际情况:

检索增强分析


LanceDB的一个独特特性是其类似SQL的过滤和Pandas数据帧的互操作性。LLM非常擅长生成SQL查询,也擅长生成Pandas计算代码,如df.groupby(“col”).mmean()。这带来了一种非常有趣的可能性,我们称之为检索增强分析:假设用户有一个包含评级、年份和类型等元数据的电影描述的大型数据集,并想问:
2010年之后,关于大学生的喜剧电影评分最高的是什么?
不难想象,LLM应该能够生成一个查询计划来回答这个问题,包括:

  • 一个类似SQL的过滤器:流派=“喜剧”和年份>2010
  • Pandas计算:df.loc[df[“rating”].idxmax()]
  • 给定过滤器的改写后的查询:“关于大学生的电影”(用于语义/词汇搜索)


Langroid的Multi-Agent框架正好支持这种类型的应用程序。LanceRAGTaskCreator采用LanceDocChatAgent并添加两个额外的Agent:

  • QueryPlannerAgent:生成查询计划
  • QueryPlanCriticAgent:对从RAG Agent收到的查询计划和答案进行批评,以便QueryPlanner

在需要时生成更好的计划。
检查langroid examples repo中的lance-rag-movies.py脚本来尝试一下。
 

尝试并参与其中!


这只是对Langroid可以做什么以及代码外观的一瞥。试试看,在他们的GitHub repo上了解更多关于Langroid的功能和路线图。Langroid欢迎捐款,他们有一个友好的Discord社区。

本文地址
最后修改
星期二, 四月 23, 2024 - 20:58

Tags

Article