使用Guidance、Langchain和本地LLM的生成式智能体
这是论文《生成式智能体:人类行为的交互式模拟》的实现。本项目基于Langchain的实现,我们对其进行了改进并添加了更多功能,尽可能使其与原论文一致。 更多解释请查看我的Medium文章。
注意:我刚刚修复了当前提示和guidance之间的冲突。由于稳定性考虑,我建议使用guidance==0.063版本。
支持的功能:
- 使用本地LLM
- 记忆和检索
- 反思
- 计划(需要改进)
- 反应和重新计划
- 对话生成(需要改进)
- 智能体摘要
- 采访
- Web界面(Gradio)
使用方法
安装
Python包:
- Guidance
pip install guidance==0.0.63
- GPTQ-for-LLaMa
- Langchain
pip install langchain==0.0.190
- Faiss (用于向量存储,可以自由更换为其他向量存储)
我使用的GPTQ-for-LLaMa是oobabooga的分支。你可以使用这个命令安装。
运行
请查看notebook文件。我使用的是wizard-mega-13B-GPTQ模型。你可以自由尝试其他模型。
Notebook
定义生成式智能体
description = "Sam是一名计算机专业的博士生;Sam喜欢计算机;Sam和他的朋友Bob住在一起;Sam的父亲是一名医生;Sam有一只叫Max的狗"
sam = GenerativeAgent(guidance=guidance,
name='Sam',
age=23,
des=description,
trails='有趣,喜欢足球,玩CSGO',
embeddings_model=embeddings_model)
添加记忆
sam_observations = [
"Sam早上醒来",
"Sam因为玩游戏感到疲劳",
"Sam有一份人工智能课程的作业",
"Sam看到Max生病了",
"Bob向Sam打招呼",
"Bob离开房间",
"Sam向Bob说再见",
]
sam.add_memories(sam_observations)
摘要
summary = sam.get_summary(force_refresh=True)
print(summary)
"""
姓名: Sam (年龄: 23)
摘要: Sam是一名对计算机科学感兴趣的博士生,有一只名叫Max的狗。他正在学习人工智能课程,父亲是一名医生。Sam也是一名游戏玩家,与朋友Bob同住。此外,Sam是一个有爱心的人,因玩游戏感到疲劳,并向朋友Bob道别。Sam是一名主修计算机科学的博士生。他早上起床,与朋友Bob同住。Sam有一只名叫Max的狗,目前因玩游戏感到疲劳。Sam还有一份人工智能课程的作业。很难确定Sam对自己最近的生活进展的感受。但如果我们假设Sam对自己的进展感到满意,我们可以描述他的感受为满足或充实。
"""
计划和更新状态
status = sam.update_status()
反应
bool_react, reaction, context = sam.react(observation='狗碗是空的',
observed_entity='狗碗',
entity_status='狗碗是空的')
print(f"{bool_react}\n反应: {reaction}\n上下文: {context}")
"""
是
反应: Sam可以给狗碗里加食物,然后叫Max过来吃。
上下文: Sam有一只名叫Max的狗,他是一名主修计算机科学的博士生。Sam的父亲是一名医生,Sam和朋友Bob住在一起。Sam喜欢计算机,目前正在学习人工智能课程。Sam因为玩游戏感到疲劳。Bob离开房间并向Sam打招呼。Sam早上醒来,看到狗碗是空的。
"""
对话生成
bool_react, reaction, context = sam.react(observation='Bob带着新电脑进入房间',
observed_entity=bob,
entity_status='Bob正在设置他的新电脑')
print(sam.dialogue_list[0])
"""
2023年6月2日星期五,18:15
Bob: 嘿Sam,快看这个!我买了一台新电脑,太棒了。
Sam: 太好了,Bob。你需要帮忙设置吗?
Bob: 不用,我已经设置好了。这主要是用来玩游戏的,我真的很兴奋。
Sam: 太棒了。我一直对尝试新硬件感兴趣。也许我待会儿可以过来看看。
Bob: 好啊,当然可以。我刚才在想,也许你可以帮我调整一些设置。我对这些不太在行。
Sam: 没问题,我很乐意帮忙。你想什么时候开始?
Bob: 今晚晚些时候怎么样?我准备好了就给你打电话。
Sam: 没问题。你准备好了就告诉我,我就过来。
"""
采访
response = sam.interview('朋友', '你和谁住在一起?')
print(response)
"""
我和我的一个朋友住在一起,他叫Bob。
"""
许可证
知识共享署名-非商业性使用 (CC BY-NC-4.0)