文心大模型两大主力模型已全面免费,可参考我之前发的文章
AI菜鸟向前飞 — 今日三则AI相关新闻
但是,这些模型原生并不支持Tool/Function Call
如下所示:
@tool
def greeting(name: str):
'''向朋友致欢迎语'''
return f"你好啊, {name}"
# 以ERNIE-Speed-8K为例,其他几款都一样
model_with_tool = QianfanChatEndpoint(model="ERNIE-Speed-8K").bind_tools([greeting])
model_with_tool.invoke("你好,我是你的新朋友")
输出结果
# 首先,映入眼帘的是 "不支持"(很直白的说了)
base.py:634 [t:4391572992]: This key `functions` does not seem to be a parameter that the model `ERNIE-Speed-8K` will accept
content='你好,很高兴认识你!请问你有什么想要聊的或者需要我帮助的地方吗?我会尽力提供帮助和支持。' additional_kwargs={'finish_reason': '', 'request_id': 'as-iv6grn9awc', 'object': 'chat.completion', 'search_info': [], 'function_call': {}, 'tool_calls': [{'type': 'function', 'function': {}}]} response_metadata={'token_usage': {'prompt_tokens': 36, 'completion_tokens': 21, 'total_tokens': 57}, 'model_name': 'ERNIE-Speed-8K', 'finish_reason': 'stop', 'id': 'as-iv6grn9awc', 'object': 'chat.completion', 'created': 1717174194, 'result': '你好,很高兴认识你!请问你有什么想要聊的或者需要我帮助的地方吗?我会尽力提供帮助和支持。', 'is_truncated': False, 'need_clear_history': False, 'usage': {'prompt_tokens': 36, 'completion_tokens': 21, 'total_tokens': 57}} id='run-a7ff5600-5962-40b8-b9ac-6168b85ee02d-0'
其中,content倒是比较多,关键注意观察tool_calls 部分
'tool_calls': [{'type': 'function', 'function': {}}]
果然没让你失望,免费的真的就是免费的,不支持Tool/Function Call
另外、可以先简单理解,tool是N个function的"合集"
那百度的这俩免费的model真无缘Tool/Function了么?
有解法,往后看...
-
如果不支持bind_tools的话,我们可以自行编辑一份json格式的function,让LLM bind,请参考我之前写的这些内容
AI菜鸟向前飞 — LangChain系列之十三 - 关于Tool的必知必会
LangChain实战技巧之三:关于Tool的一点拓展
-
已经实现"bind_tool"方法,即:让LLM知道工具,已经迈出一大步了,然后紧接着只需让LLM“聪明”的选择它(function)即可
可以尝试使用提示词(Prompt)的解法
prompt = ChatPromptTemplate.from_messages(
[("system",
"""
您是一名助理,可以使用以下工具。以下是工具的名称和说明:
工具名称:greeting, 参数:name(str类型),此工具的用途说明:向朋友致欢迎语
根据用户输入,返回要使用的工具的名称和输入。以包含 "name" 和 "arguments" 键的 JSON blob 形式返回响应。
"""),
("user", "{input}")]
)
chain = prompt | model | JsonOutputParser()
chain.invoke("我是你的新朋友 —— Song榆钱儿")
我们用起来试试看
{'name': 'greeting', 'arguments': {'name': 'Song榆钱儿'}}
这虽然没执行函数,但这已经迈出一大步了,你往后看看 PS:LLM本身并不会执行任何函数,它只是完成了简单的交互逻辑
# 再来一个chain
tool_run_chain = prompt | model | JsonOutputParser() | (lambda x: x["arguments"]) | greeting
# 再看看效果
tool_run_chain.invoke("我是你的新朋友 —— Song榆钱儿")
效果如何,请君来看
你好啊, Song榆钱儿
这么做就将Model原本不支持Too/Function变成了“支持”
补充知识
# langchain提供了这样一个方法,很好用
from langchain.tools.render import render_text_description
# 可以用它来替代提示词中的工具说明,如下所示
prompt = ChatPromptTemplate.from_messages(
[("system",
f"""
您是一名助理,可以使用以下工具。以下是工具的名称和说明:
{render_text_description([greeting])}
根据用户输入,返回要使用的工具的名称和输入。以包含 "name" 和 "arguments" 键的 JSON blob 形式返回响应。
"""),
("user", "{input}")]
)