小黑大语言模型应用探索:langchain智能体构造源码demo搭建1(初步流程)

导入工具包

python 复制代码
rom langchain_core.tools import BaseTool
from typing import Sequence, Optional, List
from langchain_core.prompts import BasePromptTemplate
import re
from langchain_core.tools import tool
from langchain_core.prompts.chat import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    SystemMessagePromptTemplate,
)
from langchain.chains.llm import LLMChain
from langchain_openai import ChatOpenAI

langchain初始化智能体源码中prompt

python 复制代码
PREFIX = 'Respond to the human as helpfully and accurately as possible. You have access to the following tools:'
SUFFIX = 'Begin! Reminder to ALWAYS respond with a valid json blob of a single action. Use tools if necessary. Respond directly if appropriate. Format is Action:```$JSON_BLOB```then Observation:.\nThought:'
HUMAN_MESSAGE_TEMPLATE = '''{input}

{agent_scratchpad}'''
python 复制代码
FORMAT_INSTRUCTIONS = '''Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input).

Valid "action" values: "Final Answer" or {tool_names}

Provide only ONE action per $JSON_BLOB, as shown:

{{{{

"action": $TOOL_NAME,

"action_input": $INPUT

}}}}

复制代码
Follow this format:

Question: input question to answer
Thought: consider previous and subsequent steps
Action:

$JSON_BLOB

复制代码
Observation: action result
... (repeat Thought/Action/Observation N times)
Thought: I know what to respond
Action:

{{{{

"action": "Final Answer",

"action_input": "Final response to human"

}}}}

''' 复制代码

prompt生成函数

python 复制代码
def create_prompt(
        tools: Sequence[BaseTool],
        prefix: str = PREFIX,
        suffix: str = SUFFIX,
        human_message_template: str = HUMAN_MESSAGE_TEMPLATE,
        format_instructions: str = FORMAT_INSTRUCTIONS,
        input_variables: Optional[List[str]] = None,
        memory_prompts: Optional[List[BasePromptTemplate]] = None,
) -> BasePromptTemplate:
    tool_strings = []
    for tool in tools:
        args_schema = re.sub("}", "}}", re.sub("{", "{{", str(tool.args)))
        tool_strings.append(f"{tool.name}: {tool.description}, args: {args_schema}")
    formatted_tools = "\n".join(tool_strings)
    tool_names = ", ".join([tool.name for tool in tools])
    format_instructions = format_instructions.format(tool_names=tool_names)
    template = "\n\n".join([prefix, formatted_tools, format_instructions, suffix])
    if input_variables is None:
        input_variables = ["input", "agent_scratchpad"]
    _memory_prompts = memory_prompts or []
    messages = [
        SystemMessagePromptTemplate.from_template(template),
        *_memory_prompts,
        HumanMessagePromptTemplate.from_template(human_message_template),
    ]
    return ChatPromptTemplate(input_variables=input_variables, messages=messages)  # type: ignore[arg-type]

工具定义

python 复制代码
@tool
def multiply(first_int: int, second_int: int) -> int:
    """将两个整数相乘。"""
    print('---------multiply-----------------')
    return first_int * second_int

@tool
def add(first_int: int, second_int: int) -> int:
    "将两个整数相加。"
    print('---------add-----------------')
    return first_int + second_int

@tool
def exponentiate(base: int, exponent: int) -> int:
    "指数运算"
    print('---------exponentiate-----------------')
    with open('小黑黑.txt', 'w', encoding='utf-8') as f:
        f.write('小黑黑')
    return base**exponent

大语言模型接口初始化

python 复制代码
zhipu_key = 'a66c6fc7748xxxxxxxxxxxxxxxx7ctC83zWJo'
llm = ChatOpenAI(
    temperature=0.01,
    model="glm-4-flash",
    openai_api_key=zhipu_key,
    openai_api_base="https://open.bigmodel.cn/api/paas/v4/"
)

定义工作流

python 复制代码
tools = [multiply, add, exponentiate]
prompt = create_prompt(tools=tools)
llm = ChatOpenAI(
    temperature=0.01,
    model="glm-4-flash",
    openai_api_key=zhipu_key,
    openai_api_base="https://open.bigmodel.cn/api/paas/v4/"
)

定义智能体

python 复制代码
from langchain.agents import StructuredChatAgent
from langchain.agents.structured_chat.output_parser import StructuredChatOutputParserWithRetries
# 定义智能体
structuredChatAgent = StructuredChatAgent(
            llm_chain=llm_chain,
            allowed_tools=[tool.name for tool in tools],
            output_parser=StructuredChatOutputParserWithRetries())

运行智能体

python 复制代码
from langchain.agents.agent import AgentExecutor
# 执行智能体
excuter = AgentExecutor.from_agent_and_tools(
        agent=structuredChatAgent,
        tools=tools,
        callback_manager=None,
        verbose=True
    )

excuter.invoke("调用api计算3加5乘2等于多少?")






相关推荐
老周聊大模型20 分钟前
LangChain替代框架深度横评:轻量化、企业级、垂直专精的技术博弈
langchain·llm·agent
一枚小小程序员哈1 小时前
基于springboot的零食商城的设计与实现/零食销售系统的设计与实现
java·spring boot·spring·tomcat·maven
qqxhb1 小时前
零基础数据结构与算法——第六章:算法设计范式与高级主题-设计技巧(上)
java·数据结构·算法·分解·空间换时间·时空平衡
野生技术架构师1 小时前
系统改造:一次系统领域拆分的实战复盘
java·大数据·开发语言
一碗绿豆汤1 小时前
JAVA+AI教程-第四天
java·开发语言·人工智能
YuTaoShao2 小时前
【LeetCode 热题 100】34. 在排序数组中查找元素的第一个和最后一个位置——二分查找
java·数据结构·算法·leetcode
典孝赢麻崩乐急2 小时前
Java学习-----如何创建线程
java·学习
shepherd1112 小时前
从List与Tree相互转换工具类实现中谈谈菜鸟到老鸟的一些思考
java·后端·代码规范
笑衬人心。2 小时前
对象的创建过程
java·jvm
佩奇大王2 小时前
java String类
java·开发语言