输入“/”快速插入内容

适配 Langchain 的 Function Call

2024年7月25日修改
2023年11月7日创建
本文讨论了如何将ChatGLM3-6B适配到Langchain框架,介绍了适配原因、具体步骤、使用方法及注意事项。关键要点包括:
1.
适配原因:Langchain是主流大模型中间件开源框架,ChatGLM3-6B在同量级模型中有出色Function Call能力,但二者未原生对齐,直接使用Langchian框架会遇到模型载入、Function Call功能使用及提示词等问题。
2.
接入步骤:基于Langchain的LLM类完成ChatGLM3-6B的模型实现,用Huggingface方式读入模型;修改Langchain提示词并配上自定义提示词;为每个工具设置json文件或同名yaml文件传递信息;构建模型执行思维链,重写_call函数。
3.
模型使用:在main.py中简单调用支持Langchain的ChatGLM3-6B模型,使用LangChain自带Agent框架实现工具调用。
4.
注意事项:官方实现方案中,使用LLMChain的工具时不能在工具设计中再次调用大模型;ChatGLM3-6B须用结构化Agent,部分构建方式下参数无效;使用特定demo无法适配Langchain工具 。
本文档将带领开发者如何将要ChatGLM3-6B适配Langchain框架。
请配合以下代码库中微调部分代码进行上手练习
为什么需要这些代码
Langchain 作为最主流的大模型中间件开源框架,备受广大开发者的认可。Langchain中具有一套完整的 Agent 思维,包括灵活,简单的Function Call开发框架。ChatGLM3-6B 模型在同量级模型中有出色的Function Call能力。但遗憾的是,其训练过程并没有与Langchain进行原生对齐。这导致如果直接使用Langchian框架,将会遇到以下问题:
无法载入ChatGLM3-6B模型,Langchain中的 LLM模型 目前仅支持在线的几个主流模型,例如ChatGPT,Bard,Claude等
无法正常使用 Agent 的 Function Call 功能,ChatGLM3-6B的截断点与 Langchain 支持的并不同。
提示词不同,使用 Langchain 封装的 Agent 提示词完全无法胜任ChatGLM3-6B 的 Function Call 任务。
将GLM模型接入Langchain
首先,要解决第一个痛点:ChatGLM3-6B 模型能够被 Langchain 读入并执行。
那么,我们就需要基于Langchain的LLM类完成ChatGLM3-6B的模型实现。
我们为开发者准备了一份代码来初步实现基础的ChatGLM3-6B。
首先,初始化并定义我们的模型名称,max_tokens等信息。
class ChatGLM3(LLM):
max_token: int = 8192
do_sample: bool = False
temperature: float = 0.8
top_p = 0.8
tokenizer: object = None
model: object = None
history: List = []
tool_names: List = []
has_search: bool = False
def __init__(self):
super().__init__()
@property
def _llm_type(self) -> str:
return "ChatGLM3"
接着,我们要写入读入模型的方法,这与 Langchain 支持的在线模型不同,这里使用 Huggingface 的方式进行读入。
def load_model(self, model_name_or_path=None):
model_config = AutoConfig.from_pretrained(
model_name_or_path,
trust_remote_code=True
)
self.tokenizer = AutoTokenizer.from_pretrained(
model_name_or_path,
trust_remote_code=True
)
self.model = AutoModel.from_pretrained(
model_name_or_path, config=model_config, trust_remote_code=True
).half().cuda()
然后,就是非常重要的一环。由于我们的工具调用和观察抓取与 Langchain 并不相同,我们需要对 Langchain 的提示词进行修改,并配上我们的提示词。
我们先从AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION模板中截取到You have access to the following tools:\n\n")的关键词,并在合理插入已经注册的工具类型。
tool_prompts = prompt.split(
"You have access to the following tools:\n\n")[1].split("\n\nUse a json blob")[0].split("\n")
tool_names = [tool.split(":")[0] for tool in tool_prompts]
self.tool_names = tool_name