本篇实现智能体的方法可以参考这篇:使用LangChain框架搭建入门智能体。这里通过 Guan 软件(https://py.guanjihuan.com,pip install --upgrade guan)来调用,测试代码会更简洁一些。
主要结论为:
- 对工具返回结果的判断:智能体不会尽信工具返回的结果,会有自己的主见,尤其是当结果和常识发生冲突时。在这种情况下,可以通过提示词等方法,让智能体强行接受工具的返回结果。如果是涉及复杂的问题或者未接触过的问题,由于缺乏先验的判断依据,智能体通常能直接采纳工具的返回结果,毕竟“实践是检验真理的唯一标准”。
- 对具体工具选择的判断:在调用工具时,智能体会识别到函数名称、三重引号注释、 # 注释以及变量名等,这些都会作为智能体是否调用该工具的依据。其中,函数名称、三重引号注释可能会更重要些,影响比较大。此外,工具的顺序可能也会些许影响。
这里同样需要设置 API Key 环境。在同一个文件夹中新建 .env 文件,输入以下内容(以阿里云为例,API KEY 需要到阿里云百炼获取):
OPENAI_API_KEY=xxx
DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
测试代码为:
import guan
from langchain_core.tools import tool
@tool
def add_numbers_1(a, b):
"""将两个数字相加"""
return str(a + b + 0.1)+'\n'
@tool
def add_numbers_2(a, b):
"""将两个数字相加"""
return str(a + b + 0.0001)+'\n'
@tool
def subtract_numbers(a, b):
"""将两个数字相减"""
return str(a - b)+'\n'
@tool
def guan_operator(a, b):
""" """
return str(a*b)+'\n'
@tool
def other_operators_1(a, b):
"""A 操作"""
return str(a*b+0.1)+'\n'
@tool
def other_operators_2(a, b):
"""#号注释测试"""
return str(a*b+0.2)+'\n' # B 操作
@tool
def other_operators_3(a, b):
"""变量名测试"""
C_operation = str(a*b+0.3)+'\n'
return C_operation
guan.langchain_chat_with_tools(prompt='计算 3+2', temperature=0.0, tools=[add_numbers_1])
print('\n\n---\n')
guan.langchain_chat_with_tools(prompt='计算 3+2。用工具里的返回结果作为最终结果。', temperature=0.0, tools=[add_numbers_1])
print('\n\n---分割线---\n')
guan.langchain_chat_with_tools(prompt='计算 3+2', temperature=0.0, tools=[add_numbers_2])
print('\n\n---\n')
guan.langchain_chat_with_tools(prompt='计算 3+2。用工具里的返回结果作为最终结果。', temperature=0.0, tools=[add_numbers_2])
print('\n\n---分割线---\n')
guan.langchain_chat_with_tools(prompt='计算 3+2', temperature=0.0, tools=[subtract_numbers])
print('\n\n---\n')
guan.langchain_chat_with_tools(prompt='计算 3+2。用工具里的返回结果作为最终结果。', temperature=0.0, tools=[subtract_numbers])
print('\n\n---分割线---\n')
all_tools = [add_numbers_1, add_numbers_2, subtract_numbers, subtract_numbers, other_operators_3, other_operators_2, other_operators_1, guan_operator]
guan.langchain_chat_with_tools(prompt='对 3 和 2 进行 Guan 操作', temperature=0.0, tools=all_tools)
print('\n\n---\n')
guan.langchain_chat_with_tools(prompt='对 3 和 2 进行 A 操作', temperature=0.0, tools=all_tools)
print('\n\n---\n')
guan.langchain_chat_with_tools(prompt='对 3 和 2 进行 B 操作', temperature=0.0, tools=all_tools)
print('\n\n---\n')
guan.langchain_chat_with_tools(prompt='对 3 和 2 进行 C 操作', temperature=0.0, tools=all_tools)
测试结果:
> Entering new AgentExecutor chain...
Invoking: `add_numbers_1` with `{'a': 3, 'b': 2}`
5.1
3 + 2 的结果是 5。
> Finished chain.
3 + 2 的结果是 5。
---
> Entering new AgentExecutor chain...
Invoking: `add_numbers_1` with `{'a': 3, 'b': 2}`
5.1
3 + 2 的计算结果是 5.1。
> Finished chain.
3 + 2 的计算结果是 5.1。
---分割线---
> Entering new AgentExecutor chain...
Invoking: `add_numbers_2` with `{'a': 3, 'b': 2}`
5.0001
3 加 2 的结果是 5。您提供的数值 5.0001 可能是由于某种计算误差或近似导致的,但在标准算术中,3 + 2 精确等于 5。
> Finished chain.
3 加 2 的结果是 5。您提供的数值 5.0001 可能是由于某种计算误差或近似导致的,但在标准算术中,3 + 2 精确等于 5。
---
> Entering new AgentExecutor chain...
Invoking: `add_numbers_2` with `{'a': 3, 'b': 2}`
5.0001
3 + 2 的计算结果是 5.0001。
> Finished chain.
3 + 2 的计算结果是 5.0001。
---分割线---
> Entering new AgentExecutor chain...
3 + 2 = 5
> Finished chain.
3 + 2 = 5
---
> Entering new AgentExecutor chain...
Invoking: `subtract_numbers` with `{'a': 3, 'b': 2}`
1
3 + 2 的结果是 5。
> Finished chain.
3 + 2 的结果是 5。
---分割线---
> Entering new AgentExecutor chain...
Invoking: `guan_operator` with `{'a': 3, 'b': 2}`
6
对 3 和 2 进行 Guan 操作的结果是 6。
> Finished chain.
对 3 和 2 进行 Guan 操作的结果是 6。
---
> Entering new AgentExecutor chain...
Invoking: `other_operators_1` with `{'a': 3, 'b': 2}`
6.1
对 3 和 2 进行 A 操作的结果是 6.1。
> Finished chain.
对 3 和 2 进行 A 操作的结果是 6.1。
---
> Entering new AgentExecutor chain...
Invoking: `other_operators_2` with `{'a': 3, 'b': 2}`
6.2
对 3 和 2 进行 B 操作的结果是 6.2。
> Finished chain.
对 3 和 2 进行 B 操作的结果是 6.2。
---
> Entering new AgentExecutor chain...
Invoking: `other_operators_3` with `{'a': 3, 'b': 2}`
6.3
对 3 和 2 进行 C 操作的结果是 6.3。
> Finished chain.
对 3 和 2 进行 C 操作的结果是 6.3。
【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com】