与其气到猛敲键盘,或者对着继承来的代码库掉几滴眼泪,更合理的做法其实是把这些信息交给 A.I.,然后直接跟它聊。一旦把大型语言模型(LLMs)的知识和推理能力接到这些资料上,下一步自然就是综合生成:在既有代码库之上产出能运行的新代码,让世界上任何人都可以从一句提示词变成一个可用功能。为了解决这些问题,下面这个演示是我周末花了一两天做出来的;做的过程很好玩,因为踩到很多新东西,也顺便真正理解了一些以前只是听过的概念。
Arthur - 搜索并检索任何东西
为什么还要工作 leh?

我想做的事情,是把我的数据工厂信息塞进 Deep Lake 向量存储,再借助 ChatGPT 对我的自定义知识库进行推理,搞清楚现有配置里到底发生了什么。比起努力理解人类留下来的遗留代码库(嘴上说抱歉,其实一点也不),这件事快乐太多了;毕竟很多时候,沟通和会议根本就是大型时间焚化炉,而等人回答问题的延迟,天啊,我真的无话可说……好,开搞。一旦把这第一块砖铺下去,我们就可以建出一整座自主智能体工厂,让它们围绕各种信息做研究、检索和推理,再把这些东西综合起来,产出新的价值,不管是社交媒体内容还是代码。对我来说,这正是为什么 A.I. 对劳动力市场的影响会,也应该,成为一场严肃的全社会对话。
当哪怕是零散拼起来的 A.I. 智能都已经是超人类智能,当我们可以把生产力放大 1000 倍,也就是说,也许根本没有足够的工作可以分给所有人时,我们该怎么办?退一步说,我们为什么本来就这么想让人类拼命工作?也许我们真正需要做的,是重新配置、重新画出工作、收入和意义之间的箭头。我会很开心投票支持每周工作 4 小时,然后把剩下的时间拿去玩和学习,随口一说。
遇到的挑战

在动手搭这个智能体的过程中,最让我卡住的几个硬骨头是:
- 用对 package 版本
为了先跑起来,我决定从一个现有项目(chat-with-code)学起,但一直遇到下面这种错误:
RuntimeError: no validator found for <class 're.Pattern'>, see `arbitrary_types_allowed` in Config
Traceback:
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/streamlit/scriptrunner/script_runner.py", line 557, in _run_script
exec(code, module.__dict__)
File "chatbot.py", line 2, in <module>
import utils
File "/home/erniesg/code/erniesg/chat-with-code/utils.py", line 1, in <module>
from langchain.document_loaders import TextLoader
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/__init__.py", line 6, in <module>
from langchain.agents import MRKLChain, ReActChain, SelfAskWithSearchChain
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/__init__.py", line 40, in <module>
from langchain.agents.agent_toolkits import (
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/agent_toolkits/__init__.py", line 12, in <module>
from langchain.agents.agent_toolkits.csv.base import create_csv_agent
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/agent_toolkits/csv/base.py", line 4, in <module>
from langchain.agents.agent_toolkits.pandas.base import create_pandas_dataframe_agent
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/agent_toolkits/pandas/base.py", line 18, in <module>
from langchain.agents.types import AgentType
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/types.py", line 5, in <module>
from langchain.agents.chat.base import ChatAgent
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/chat/base.py", line 6, in <module>
from langchain.agents.chat.output_parser import ChatOutputParser
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/chat/output_parser.py", line 12, in <module>
class ChatOutputParser(AgentOutputParser):
File "pydantic/main.py", line 229, in pydantic.main.ModelMetaclass.__new__
File "pydantic/fields.py", line 491, in pydantic.fields.ModelField.infer
File "pydantic/fields.py", line 421, in pydantic.fields.ModelField.__init__
File "pydantic/fields.py", line 542, in pydantic.fields.ModelField.prepare
File "pydantic/fields.py", line 804, in pydantic.fields.ModelField.populate_validators
File "pydantic/validators.py", line 723, in find_validators或者这种:
➜ chat-with-code git:(main) ✗ poetry run streamlit run chatbot.py [🐍 lewagon]
2023-08-04 19:39:49.759 INFO numexpr.utils: Note: NumExpr detected 12 cores but "NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 8.
2023-08-04 19:39:49.760 INFO numexpr.utils: NumExpr defaulting to 8 threads.
You can now view your Streamlit app in your browser.
Network URL: http://172.19.237.74:8501
External URL: http://180.129.59.54:8501
2023-08-04 19:39:51.484 Uncaught app exception
Traceback (most recent call last):
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/streamlit/scriptrunner/script_runner.py", line 557, in _run_script
exec(code, module.__dict__)
File "/home/erniesg/code/erniesg/chat-with-code/chatbot.py", line 2, in <module>
import utils
File "/home/erniesg/code/erniesg/chat-with-code/utils.py", line 1, in <module>
from langchain.document_loaders import TextLoader
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/__init__.py", line 6, in <module>
from langchain.agents import MRKLChain, ReActChain, SelfAskWithSearchChain
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/__init__.py", line 31, in <module>
from langchain.agents.agent import (
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/agent.py", line 15, in <module>
from langchain.agents.agent_iterator import AgentExecutorIterator
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/agents/agent_iterator.py", line 21, in <module>
from langchain.callbacks.manager import (
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/callbacks/__init__.py", line 10, in <module>
from langchain.callbacks.aim_callback import AimCallbackHandler
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/callbacks/aim_callback.py", line 5, in <module>
from langchain.schema import AgentAction, AgentFinish, LLMResult
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/schema/__init__.py", line 4, in <module>
from langchain.schema.memory import BaseChatMessageHistory, BaseMemory
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/schema/memory.py", line 7, in <module>
from langchain.schema.messages import AIMessage, BaseMessage, HumanMessage
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/langchain/schema/messages.py", line 147, in <module>
class HumanMessageChunk(HumanMessage, BaseMessageChunk):
File "/home/erniesg/.pyenv/versions/3.10.6/envs/lewagon/lib/python3.10/site-packages/pydantic/main.py", line 352, in __new__解决办法:后来发现我必须使用特定的 streamlit (1.25.0) 和 pydanic version (1.10.12);这类 package 之间的兼容性问题反复出现,所以我大概需要再学一下管理这些问题的工具和最佳实践。也许具体版本就应该永远写在 poetry 里!?
- 弄清楚如何导入 .json 文件里定义的 Azure Data Factory 资源,并切成可检索的 分块
结果发现,网上处理文档、.PDF、GitHub 代码仓库之类的教程一大堆,提到 .json 的却少得可怜。我先让 ChatGPT 生成,没用;于是只好认真盯着 .json 和 langchain JSON loader 看,再一步一步告诉 ChatGPT 我觉得它应该怎么做,最后才终于跑通。至少以我在 Google 和 YouTube 搜索第一页看到的结果来说,还没人拿 Azure Resource Manager(ARM)模板这么干过,所以我只好稍微创新一下。
解决办法:我的推理是,对这个初版原型来说,我想保留 Azure Data Factory 的 parameters、variables 和 resources,也想保留 resources 里的各个对象,因为那些会是我的 pipeline、activity 等等。再配上 few-shot 指令和给 ChatGPT 的上下文,最后就拿到了我需要的东西。
前路
所以最后我就这样把 75 个条目切进了我的 Deep Lake 数据集;现在已经开始想接下来得导入更多数据源(让我们把所有 SQL schema、stored procedures 和数据本身都查起来!)、围绕记忆更新元数据、在这个多模态数据湖兼向量存储上做 CRUD 操作、优化检索策略和 token 上下文。事实上,为什么不直接通过工具让 LLM 执行并采取行动?更进一步,为什么不让 LLM 自己写测试、自己 debug、自己做验证?保守地说,如果要把一个能让任意规模团队或组织生产力放大 1000 倍的自主智能体真正推上生产环境,这些都是绕不开的事。
好玩的时候来了!🤩🤩🤩
最初发布于 PubPub:erniesg.pubpub.org/pub/i8a0vp8z。