一、 LangChain 简介

LangChain 是一个用于构建大语言模型(LLM)应用的开发框架,支持 Python 和 JavaScript。它通过模块化设计简化了以下任务:

  • 数据感知:集成外部数据源(如文档、数据库)

  • 交互能力:调用 API、执行代码等动态操作

  • 记忆管理:维护对话历史等上下文信息

核心组件:

  • Models:对接主流LLM(OpenAI、HuggingFace等)

  • Prompts:模板化提示词管理

  • Chains:多步骤任务流水线

  • Agents:自主决策调用工具

  • Memory:状态保持

  • Indexes:文档检索增强

二、 Function Calling 概念

Function Calling 是让LLM根据自然语言指令动态调用预定义函数的能力,典型场景:

  • 天气查询 → 调用天气API

  • 数学计算 → 执行代码

  • 数据查询 → 搜索数据库

优势:

  1. 突破LLM的静态知识限制

  2. 实现实时数据交互

  3. 执行复杂逻辑运算

三、使用LangChain实现Function Calling

1、第一种方法

直接通过langchain的基本功能去调用

import json
import os
from dotenv import load_dotenv
from langchain_core.tools import tool
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage

load_dotenv(override=True)

@tool
def add(a: int, b: int) -> int:
    """Adds two numbers together."""
    return a + b

@tool
def subtract(a: int, b: int) -> int:
    """Subtracts two numbers."""
    return a - b

llm = init_chat_model(
    "gpt-4o-mini",
    api_key = os.getenv("DMX_OPENAI_API_KEY"),
    base_url = os.getenv("DMX_BASE_URL"),
    model_provider="openai"
)

llm_tools = llm.bind_tools([add, subtract])

query = "12和15相差多少?"

messages = [
    HumanMessage(query)
]

output = llm_tools.invoke(messages)

# 打印工具调用明细
print(output)
tool_load = json.dumps(output.tool_calls, indent=4)
print(tool_load)

# template.append(output)

# 创建新的消息列表
messages.append(output)

available_tools = {"add": add, "subtract": subtract}

for tool_call in output.tool_calls:
    select_tool = available_tools[tool_call["name"]]
    tool_message = select_tool.invoke(tool_call)
    messages.append(tool_message)

second_output = llm_tools.invoke(messages)
for message in second_output:
    print(message)
    # print(json.dumps(message.model_dump(), indent=4, ensure_ascii=False))
print(second_output.content)

结果:

2、第二种方法

通过langchain的Agent去调用

import os
from dotenv import load_dotenv
from langchain.agents import AgentType, initialize_agent
from langchain_openai import ChatOpenAI
from langchain.tools import Tool, StructuredTool
from typing import Optional
from langchain.chat_models import init_chat_model

load_dotenv(override=True)
# 定义工具函数
def search_api(query: str) -> str:
    """模拟API调用"""
    return f"结果: {query}"
def add_two_numbers(a: int, b: int) -> int:
    """模拟两个数字相加"""
    return a + b

# 创建工具实例
tools = [
    Tool(
        name="SearchAPI",
        func=search_api,
        description = "用于查询实时信息"
    ),

    # StructuredTool 来处理多参数工具:
    StructuredTool.from_function(
        func=add_two_numbers,
        name="add_two_numbers",
        description="用于计算两个数的和",
    )
]

# 初始化Agent
# llm = ChatOpenAI(
#     api_key = os.getenv("DMX_OPENAI_API_KEY"),
#     base_url = os.getenv("DMX_BASE_URL"),
#     model="gpt-3.5-turbo",
#     temperature=0
# )


llm = init_chat_model(
    "gpt-4o-mini",
    api_key = os.getenv("DMX_OPENAI_API_KEY"),
    base_url = os.getenv("DMX_BASE_URL"),
    model_provider="openai"
)


agent = initialize_agent(
    tools, 
    llm, 
    agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

# 执行查询
response = agent.run("123和456相加是多少?")
print(response)

如果:

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐