4、模块 Agent
对于agent的使用,这里将结合一个具体的场景进行讲解 我门现在有这么一个场景,需要统计英文单词的字数,但是我们不希望统计工作由大模型生成,而是希望大模型调用我们定义好的工具,完成字符长度的计算工作,代码应该如何实现?
1. 日志配置
import logging
# 设置日志配置
logging.basicConfig(level=logging.INFO)
这部分代码用于设置日志配置。logging.basicConfig(level=logging.INFO)
指定了日志的级别为 INFO
,这意味着所有 INFO
级别及以上的日志消息都会被输出,便于跟踪程序的运行过程。
2. 创建语言模型
from langchain_openai import ChatOpenAI
# 创建语言模型
llm = ChatOpenAI(
model_name='qwen1.5-32b-chat-int4', # 替换为你使用的模型名称
openai_api_base='http://20.20.136.251:8001/v1', # 替换为你的API base URL
openai_api_key='q7r8s9t0-u1v2-w3x4-y5z6-a7b8c9d0e1f2' # 替换为你的API密钥
)
这部分代码使用 langchain_openai
模块中的 ChatOpenAI
类创建了一个语言模型实例 llm
。模型使用指定的 model_name
和 API base URL
,并通过提供的 API key
进行授权。这个模型将用于处理用户输入并生成响应。
3. 构建工具
from langchain.agents import tool
@tool
def get_word_length(word: str) -> int:
"""返回单词的长度"""
length = len(word)
logging.info(f"get_word_length tool invoked with word: {word}, length: {length}")
return length
这里定义了一个名为 get_word_length
的工具函数,使用了 @tool
装饰器。这个工具接受一个字符串 word
,返回它的长度。在计算长度后,函数会通过日志记录这个工具的调用情况,包括输入的单词和计算出的长度。
4. 创建工具清单
# 创建工具清单
tools = [get_word_length]
tools
是一个包含所有可用工具的列表。在这里,tools
列表中仅包含 get_word_length
这个工具。
5. 绑定工具到模型
from langchain_core.utils.function_calling import convert_to_openai_function
llm_with_tools = llm.bind(
functions=[convert_to_openai_function(t) for t in tools]
)
这部分代码将自定义工具绑定到语言模型 llm
上。convert_to_openai_function(t)
将每个工具函数转换为 OpenAI 函数的格式,然后使用 llm.bind()
将这些函数绑定到模型实例中,生成 llm_with_tools
对象,这个对象可以通过工具来扩展模型的功能。
6. 创建代理
from langchain.agents import initialize_agent, AgentType
from langchain.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个非常优秀的人,但是不会计算单词的长度。你必须使用工具get_word_length来解决此问题。"),
("user", "{input}")
])
这里创建了一个 ChatPromptTemplate
实例 prompt
,它定义了模型将收到的系统消息和用户消息模板。系统消息告诉模型它必须使用 get_word_length
工具来解决问题。
7. 初始化代理
agent_executor = initialize_agent(
agent_type=AgentType.OPENAI_FUNCTIONS, # 使用 OpenAI Functions 代理类型
tools=tools,
llm=llm,
prompt=prompt,
verbose=True
)
initialize_agent
函数初始化了一个代理(agent_executor
)。该代理使用 AgentType.OPENAI_FUNCTIONS
类型,并绑定了前面定义的工具和语言模型。这意味着代理将利用 OpenAI 的函数调用机制来执行工具函数。
8. 调用代理执行任务
result = agent_executor.invoke({"input": "关于color有多少个字母? 要求必须使用工具get_word_length解决问题"})
logging.info(f"Agent execution result: {result}")
最后,代码使用 agent_executor.invoke
方法执行代理任务。输入是一个包含问题的字典,即“关于color有多少个字母? 要求必须使用工具get_word_length解决问题”。代理会处理这个输入,通过模型生成的指令调用工具函数 get_word_length
来计算单词的长度。结果通过日志记录下来。
总结
整个代码实现了一个利用 langchain
框架扩展 OpenAI 模型功能的流程,具体包括:
- 创建语言模型
- 定义工具函数并绑定到模型
- 设置一个包含工具的代理
- 通过代理执行任务,并确保使用工具来处理问题。
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付
