langchain开发框架实践(二)

Posted by     "虞天" on Wednesday, August 7, 2024

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_nameAPI 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 模型功能的流程,具体包括:

  • 创建语言模型
  • 定义工具函数并绑定到模型
  • 设置一个包含工具的代理
  • 通过代理执行任务,并确保使用工具来处理问题。

「真诚赞赏,手留余香」

YuTian Blog

真诚赞赏,手留余香

使用微信扫描二维码完成支付