文章目录
在使用 LLM(大语言模型)
时,经常需要调用一些自定义的工具方法完成特定的任务,比如:执行一些特殊算法、查询天气预报、旅游线路等。
很多大模型都具备使用这些工具方法的能力,Langchain
也为这些调用提供了便利。
之前的文章介绍了
llama3.1
与工具方法交互的实际例子,不过可惜langchain
对deepseek
支持还不够,导致:
- llm.bind_tools 根据用户问题生成的工具方法签名与
llama3.1
不同,在后续在调用工具方法时报错deepseek
返回的结果中包含了思考过程内容,显然Langchain
还不能正确解析出最终结果,这会导致langchain
的很多方法不能正常运行
这次我们将尝试通过以下两种方法解决 Langchain
使用 deepseek
时产生的上述问题:
- 使用提示词让大模型推理调用工具的方法名称和参数
- 使用自定义的
JsonOutputParser
处理deepseek
返回的信息
这里使用
llama3.1
和deepseek
等不同模型做对比,并不是为了说明孰优孰劣,而是仅仅为了技术演示需要。
准备
在正式开始撸代码之前,需要准备一下编程环境。
-
计算机
本文涉及的所有代码可以在没有显存的环境中执行。 我使用的机器配置为:- CPU: Intel i5-8400 2.80GHz
- 内存: 16GB
-
Visual Studio Code 和 venv
这是很受欢迎的开发工具,相关文章的代码可以在Visual Studio Code
中开发和调试。 我们用python
的venv
创建虚拟环境, 详见:
在Visual Studio Code中配置venv。 -
Ollama
在Ollama
平台上部署本地大模型非常方便,基于此平台,我们可以让langchain
使用llama3.1
、qwen2.5
等各种本地大模型。详见:
在langchian中使用本地部署的llama3.1大模型 。
定义工具方法
下面定义了两个简单的工具方法:计算加法和乘法:
def create_tools():
"""创建tools"""
@tool
def add(x: int, y: int) -> int:
"""计算a和b的和。"""
print (f"add is called...{
x}+{
y}")
return x + y
@tool
def multiply(x: int, y: int) -> int:
"""计算a和b的乘积。"""
print (f"multiply is called...{
x}*{
y}")
return x * y
tools = [add, multiply]
for t in tools:
print("--")
print(t.name)
print(t.description