变革来袭!多Agent框架MuAgent带你解锁代码开发新姿势

在这个信息技术爆炸的时代,我们都知道大型语言模型(LLM)拥有处理复杂问题的能力,但当遇到编程难题这种更高级的挑战时,单独的LLM Agent可能就不够看了。社区里动起了脑筋,玩出了新花样——组合多个Agent来应对高难度挑战!正如Multi Agent的构建过程所示,与其说我们是在设计Agents,不如说是对当前需求的深入理解后去构建出一条专属于某个场景的SOP。

功能演示:在muAgent里能够实现本地代码库的问答功能

1、能够支持java代码库导入,并转换成向量数据、图数据以及传统数据库的内容

# delete codebase
codebase_name = 'client_local'
code_path = "D://chromeDownloads/devopschat-bot/client_v2/client"
# initialize codebase
use_nh = True
do_interpret = True
cbh = CodeBaseHandler(codebase_name, code_path, crawl_type='dir', use_nh=use_nh, local_graph_path=CB_ROOT_PATH,
                      llm_config=llm_config, embed_config=embed_config)
cbh.import_code(do_interpret=do_interpret)

2、在有了代码库之后,就可以基于语言模型来完成代码库问答


# 
phase_name = "codeChatPhase"
phase = BasePhase(
    phase_name, embed_config=embed_config, llm_config=llm_config,
)

# 
query_content = "remove 这个函数是做什么的"
query = Message(
    role_name="user", role_type="human", input_query=query_content,
    code_engine_name=codebase_name, score_threshold=1.0, top_k=3, cb_search_type="tag",
    local_graph_path=CB_ROOT_PATH, use_nh=use_nh
    )
output_message3, output_memory3 = phase.step(query)
# print(output_message3)
print(output_memory3.to_str_messages(return_all=True, content_key="parsed_output_list"))

3、下面,我们还可以基于代码库完成代码库转API文档工作,代码库自动生成测例的工作

那我们的muAgent是如何完成multi-agent的涉及工作的呢?

🏗️【muAgent框架大揭秘】

想象一下,你现在需要去用LLM来串联专属你的个性化业务场景SOP流程。那按照正常的Agent开发流程,我们首先需要定义每一个Agent的Prompt,其次将prompt传入到LLM接口进行调用,并将当前Agent的输出进行特定逻辑的后处理,再合并到下一个Agent的Prompt上,去获取它的输出,重复上述流程直到任务完成。而当这个SOP流程较长和复杂时,反复定义这样的Agent以及多种后处理会显得过于繁琐。

那muAgent就是为了解决这个问题并帮助大家快速实现SOP的串联。为了快速定义了Agent交互链路,我们要理解multi-agent的核心过程就在于如何把上一个agent的输出给到下一个agent的输入,其中需要涉及到llm的输出、具体action的执行以及信息的解析处理。为此,muAgent 巧妙地设计了Memory Manager 和 Prompt Manager 两个杀手级组件,能够管理长篇的聊天历史记录和自动化构筑 Prompts 。从而打造了一个扩展性满满、易用性爆表的多Agent超级框架!

✨【四种Agent类型,满足你的一切幻想】

在Agent层面,提供四种基本的Agent类型,对这些Agent进行Role的基础设定,可满足多种通用场景的交互和使用。所有的Action都由Agent执行。

  • BaseAgent:基础功打得溜,问答、工具使用、代码执行样样行。
  • ReactAgent:标准React流,遇事不慌,标准反应流程轻松应对。
  • ExecutorAgent:对任务清单进行顺序执行,根据 User 或 上一个Agent编排的计划,完成相关任务,排个队,挨个干!
  • SelectorAgent:挑三拣四,根据User 或 上一个 Agent的问题选择合适的Agent,总能找到最合适的Agent回答用户需求。

🔁【Communication进化论】

信息如同血液,Agent之间的通信变得前所未有的流畅,各类重要数据在Agents间如同接力赛跑,无缝传递!

  • System Content:用于存储管理当前LLM输出的时间,Role信息等
  • Info Content:LLM辅助信息,比如像知识库查询信息、代码库检索信息、工具信息、Agent信息等
  • LLM Content:直接存储和传递LLM 产生的信息
  • LLM Parsed Content:对LLM进行解析转成更易操作的key-value数据结构,方便对LLM内容进行过滤
  • Customized Content:用于管理自定义action产生的key-value数据内容,用于后续自定义Prompt模板的组装构建

🤖【Memory Manager记忆强化】

你的虚拟开发团队记忆力惊人,不管是保存、压缩还是检索聊天历史,他们能在数据库的海洋中自如潜泳。

  • 存储管理:在数据库或本地实现对chat history进行save和load管理,包括user input、 llm output、observation ouput
  • 信息压缩:对 chat history 进行关键信息压缩总结 summary context,比如说单文本概况、侧重不同角度进行文本概况、关键信息提取、多文本概况,作为 Prompt context
  • 记忆检索:提供基础检索功能,检索 chat history 或者 Summary Context 中与问题相关信息,辅助问答

🛠️【Prompt Manager – 大脑核心】

如何让多个大模型分工并协调好LLM并来引导它们产生期望的输出,其本质就是将业务问题抽象并拆解到可执行的Prompt,让他们像处理业务问题一样精准执行。Prompt Manager正是这个大脑——将各类Prompts巧妙组装,从而驱动LLM Agents发挥出惊人的生产力!

muAgent 将Prompt Manager模块中分为 System Prompt、Context Prompt、Customized Prompt三部分

  • System Prompt 包括 Role Name、Role Description、Task等,即希望模型执行的特定任务。
  • Context Prompt 包括 Doc Context、Code Context、Tool Context、Agent Context、Session Context等,即希望模型理解的请求所需的背景信息。
  • Customized Prompt 则是 自定义的一些 Input 和 Ouput,即模型需要处理的数据和期望的输出类型或格式的信号。

💻【Retrieval、Tool、Action – 辅助生态组件,muAgent框架的得力小助手】

  • Retrieval:好比虚拟团队的知识库管理员,有求必应。集成了Doc、Internet Search、Code Retrieval三种检索信息的方式,定义了一个抽象IMRetrieval类,可支持开发者自定义个性化的知识库,来完成Agent的知识库注册。
  • Tool:工具百宝箱,任你挑选,一键调用解决问题。支持Agent完成Tool的注册和langchain Tool接口的直接使用。
  • Action:作为LLM具体要执行的动作或动作流,会包括LLM信息处理、知识检索、工具调用以及代码执行等一个综合性的复杂过程,只要下达指令,他们就能将计划变成现实。

🏡【私人定制不是梦】

更炫的是,muAgent框架支持私有化定制,无论是个性化的LLM还是深情的嵌入式Embedding服务,只要你想,就能搞定!

🌟所以,还等什么?让我们一同携手muAgent框架,解锁编程世界的新潜力,体验创造力的大爆炸吧!🎉🎉🎉

通过 执行pip install codefuse-muagent 然后就能上手使用了

from muagent.connector.agents import ReactAgent, SelectorAgent
from muagent.connector.schema import Role, Message, ChainConfig
from muagent.llm_models.llm_config import EmbedConfig, LLMConfig


llm_config = LLMConfig(
    model_name=model_name, api_key=api_key,  api_base_url=api_base_url, temperature=0.3,
    stop="**Observation:**"
)

embed_config = EmbedConfig(
    embed_engine="model", embed_model=embed_model, embed_model_path=embed_model_path
)

# 定义了基于react的tool agent
tool_role = Role(role_type="assistant", role_name="tool_reacter", prompt=REACT_TOOL_PROMPT)
tool_react_agent = ReactAgent(role=tool_role,chat_turn=3,
    llm_config=llm_config, embed_config=embed_config,
)

# 定义了基于react的code agent
code_role = Role(role_type="assistant", role_name="code_reacter", prompt=REACT_CODE_PROMPT)
code_react_agent = ReactAgent(role=code_role, chat_turn=3,
    llm_config=llm_config, embed_config=embed_config,
)

prompt = """#### Agent Profile
Your goal is to response according the Context Data's information with the role that will best facilitate a solution, taking into account all relevant context (Context) provided.
When you need to select the appropriate role for handling a user's query, carefully read the provided role names, role descriptions and tool list.
#### Response Output Format
**Thoughts:** think the reason step by step about why you selecte one role
**Role:** Select the role from agent names.
"""

# 定义了一个groupAgent
role = Role(role_type="assistant", role_name="qaer", prompt=prompt)
base_agent = SelectorAgent(role=role,chat_turn=3,
    llm_config=llm_config, embed_config=embed_config,
    group_agents=[tool_react_agent, code_react_agent]
)

# 
question = "确认本地是否存在employee_data.csv,并查看它有哪些列和数据类型;然后画柱状图"
query = Message(role_type="user", role_name="user", input_query=question,tools=tools,)
output_message = base_agent.step(query)
print(output_message.role_content)

还可以支持CodeFuse-Chatbot的多种问答功能,CodeFuse-Chatbot使用演示视频:

https://www.youtube.com/watch?v=ex5sbwGs3Kg&ab_channel=HaotianZhu

项目链接

[1] https://github.com/codefuse-ai/CodeFuse-muAgent

[2] GitHub - codefuse-ai/codefuse-chatbot: An intelligent assistant serving the entire software development lifecycle, powered by a Multi-Agent Framework, working with DevOps Toolkits, Code&Doc Repo RAG, etc.

[3] codefuse-ai · GitHub

  • 23
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用伪装user-agent方法可以模拟多种浏览器类型和版本,减少被识别为爬虫的可能性,从而实现反爬。在Java中,可以通过设置Http请求头中的User-Agent字段来伪装user-agent。以下是Java中使用伪装user-agent方法进行反爬的代码示例: ```java import java.util.Random; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; public class UserAgentSpider { public static void main(String[] args) throws Exception { Random random = new Random(); String[] userAgentList = {"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko"}; String userAgent = userAgentList[random.nextInt(userAgentList.length)]; HttpGet request = new HttpGet("https://www.example.com"); request.setHeader("User-Agent", userAgent); CloseableHttpClient httpClient = HttpClientBuilder.create().build(); httpClient.execute(request); } } ``` 以上代码中,使用了Java中的HttpClient库来发送Http请求,首先定义了一个随机的User-Agent列表,然后随机选择一个User-Agent,设置到HttpGet请求的头部中,最后使用HttpClient发送请求。 需要注意的是,虽然伪装user-agent可以减少被识别为爬虫的可能性,但并不能完全避免被封锁。有些网站可能会对访问频率、访问流量等进行监控,如果访问过于频繁或流量过大,仍然可能会被封锁。因此,在进行反爬时,需要综合使用多种方法,避免单一方法失效导致整个爬虫失效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值