- 大家好,我是同学小张,日常分享AI知识和实战案例
- 欢迎 点赞 + 关注 👏,持续学习,持续干货输出。
- +v: jasper_8017 一起交流💬,一起进步💪。
- 微信公众号也可搜【同学小张】 🙏
本站文章一览:
前两篇文章我们了解了AutoGPT的概念原理及如何使用它。今天我们进一步深入学习AutoGPT的实现原理 - ReAct。
本文将使用LangChain,从0开始写一个简易版的AutoGPT,这既是对AutoGPT原理的深入学习,同时也是对前段时间学习LangChain的一个练习,这其中几乎涉及了LangChain的所有核心模块:Prompt模板、大模型封装、输出校验、记忆模块、Agents模块等。
文章目录
0. 前置推荐阅读
- 【AI大模型应用开发】【AutoGPT系列】0. AutoGPT概念及原理介绍 - Agent开发框架及ReAct方法
- 【AI大模型应用开发】【AutoGPT系列】1. 快速上手 - 运行原生AutoGPT or 利用AutoGPT框架开发自己的Agent
1. 本文实现的需求和使用的数据文件
声明:本文示例代码和文件来源知乎AGI课堂。
1.1 实现需求
设计一个 Agent,自动选择使用以下工具回答用户的问题:
- 查看目录下的文件
- 基于给定的文档回答用户问题
- 查看与分析 Excel 文件
- 撰写文档
- 调用 Email 客户端发邮件
1.2 数据文件
./data
|__2023年8月-9月销售记录.xlsx
|__供应商名录.xlsx
|__供应商资格要求.pdf
文件内数据示例如下:
2. 手撕AutoGPT - 代码编写
2.1 先定义一个类,定义主入口函数run
class AutoGPT:
"""AutoGPT:基于Langchain实现"""
def __init__(self):
pass
def run(self, task_description):
"""运行入口,思考 + 执行任务,最终输出最终结果
Args:
task_description (_type_): 任务描述
"""
pass
2.2 run
函数实现
2.2.1 run
函数里面应该有什么
(1)AutoGPT的原理,前面的文章已经介绍过,就是ReAct,先思考后行动。
(2)给大模型的Prompt,在工程中一般以Prompt模板形式存在,结合用户输入和上下文,组装成最终的Prompt
所以,run
函数里至少要有:
- 思考步骤
- 行动步骤
- Prompt模板组装步骤
- 获取用户输入步骤
- 获取上下文步骤(长短期记忆)
2.2.2 代码实现
def run(self, task_description, verbose=False) -> str:
thought_step_count = 0 # 思考步数
# 初始化模板
prompt_template = PromptTemplateBuilder(
self.prompts_path,
self.main_prompt_file,
).build(
tools=self.tools,
output_parser=self.output_parser,
).partial(
work_dir=self.work_dir,
task_description=task_description,
)
short_term_memory = ConversationTokenBufferMemory(
llm=self.llm,
max_token_limit=4000,
)
short_term_memory.save_context(
{
"input": "\n初始化"},
{
"output": "\n开始"}
)
# 初始化LLM链
chain = (prompt_template | self.llm | StrOutputParser())
# 如果有长时记忆,加载长时记忆
if self.memery_retriever is not None:
long_term_memory = VectorStoreRetrieverMemory(
retriever=self.memery_retriever,
)
else:
long_term_memory = None
reply = ""
while thought_step_count < self.max_thought_steps:
if verbose:
color_print(f">>>>Round: {
thought_step_count}<<<<", ROUND_COLOR)
action, response = self._step(
chain,
task_description=task_description,
short_term_memory=short_term_memory,
long_term_memory=long_term_memory,
verbose=verbose,
)
if action.name == "FINISH":
if verbose:
color_print(f"\n----\nFINISH", OBSERVATION_COLOR)
reply = self._final_step(short_term_memory, task_description)
break
observation = self._exec_action(action)
if verbose:
color_print(f"\n----\n结果:\n{
observation}", OBSERVATION_COLOR)
# 保存到短时记忆
short_term_memory.save_context(
{
"input": response},
{
"output": "返回结果:\n" + observation}
)
thought_step_count += 1
if not reply:
reply = "抱歉,我没能完成您的任务。"
if long_term_memory is not None:
# 保存到长时记忆
long_term_memory.save_context(
{
"input": task_description},
{