06-LangChain Tool 加载与使用指南:预制工具、SerpAPI、edge-tts、GraphQL

0 如何加载使用tool?

flowchart LR A[Agent] --> B[工具] A --> C[工具集] subgraph S1[工具来源] D[LangChain
预制工具 50+] E[用户自定义] end subgraph S2[LangChain 预制工具示例] F[Alpha Vantage] G[ArXiv] H[Bing Search] I[DALL-E Image Generator] J[GraphQL] K[IFTTT] L[...] end B --> D B --> E D --> F D --> G D --> H D --> I D --> J D --> K D --> L C --> T1[工具1] C --> T2[工具2] C --> TN[工具N]

加载预制tool的方法

langchain预制了大量的tools,基本这些工具能满足大部分需求,github

python 复制代码
# 添加预制工具的方法很简单
from langchain_community.agent_toolkits.load_tools import load_tools
tool_names = [...]
tools = load_tools(tool_names) #使用load方法
# 有些tool需要单独设置llm
from langchain_community.agent_toolkits.load_tools import load_tools
tool_names = [...]
llm = ...
tools = load_tools(tool_names, llm=llm) # 在load的时候指定llm

1 SerpAPI

最常见的聚合搜索引擎 serper.dev/dashboard

python 复制代码
search = SerpAPIWrapper()
search.run("Obama's first name?")

'Barack Hussein Obama II'

相当于自动帮我们调用了搜索引擎获得结果。

支持自定义参数,比如将引擎切换到bing,设置搜索语言等

python 复制代码
params = {
    "engine": "baidu",
    "gl": "cn",
    "hl": "zh",
}
search = SerpAPIWrapper(params=params)
search.run("Obama's first name?")

结果就不太一样了对吧:

java 复制代码
'[\'http://nourl.ubs.baidu.com/23\', \'Obama(奥巴马)是姓 Brack(布拉克-貌似中文是这个)是名 Hussein(侯赛因)是中间名(middle name)国外人名字一般的顺序是 名字(first name)+中间名(如果有的话)+姓(last/family name)所以奥巴马的全名是:Brack Hussein Obama 他姓奥巴马,全名是barack Obama,外国人姓氏在后,所以他姓奥巴马奥巴马...\', \'此外,一般来说英文的 first name 是单数,last name 也是单数(两个字组成的姓或名很少见,篇幅有限就先不说这个了);唯有 middle name(s) 中间名是可以有很多个的。例如,前英国首相布莱尔的全名就是 Anthony Charles Lynton Blair,或者Anthony C. L. Blair,有两个中间名。\', \'first Name是"名",last name是"姓"。中国人和外国人名字的区别:一、位置不同:外国名:Jim Green,翻译成吉姆格林,first name是Jim ,last name 是Green。中国名:王小二,first name是小二,last name 是王。二、中国人的名字是汉字,外国人的名字是英文。重点词汇:1、first name 英 [f&...\', \'举个例子:前美国总统奥巴马 他的英文全名是Barack Hussein Obama 即贝拉克·侯赛因·奥巴马 奥巴马是他的姓,贝拉克是他的名,侯赛因是他的中间名。 姓的英语有三个family name,surname,last name 名的英语有两个given name,first name 中间名的英语是middle name 我们看到西方女子结婚后会随夫姓,比如奥巴马...\', "Biden tweeted on "Best Friends Day" Saturdayand posted an interlocking friendship bracelet with the former President Barack Obama\'s first name and his first name. The caption read: "Happy #BestFriendsDay to my friend, @BarackObama."", \'Senator Obama's first name, however, is far more interesting if wholly and totally unrelated to his character and presidential campaign. My friend Paul Ogden did a little basic research on this name. The results were so fascinating that I couldn't resist doing a bit on my own and reportin...\', \'D. Obama Barack Hussein 答案:A 解析:本题考查的是对奥巴马英文原名的记忆。根据常识和英文人名的命名习惯,英文人名通常是由名(given name)和姓(surname)组成,有时还包括中间名(middle name)。在这个问题中,奥巴马的英文原名是"Barack Hussein Obama",其中"Barack"是名,"Hussein"是中间名,"Obama...\', "Obama\'s last name is Obama. His first name is Barack. I have no clue what Michelle\'s maiden name is. Text fits Mug Tee Hoodie Free Shipping to China Order in 0:00:58 for delivery Nov 1-12 724 reviews Color The Urban Dictionary Mug ..."]'

2 文生图大模型

python 复制代码
import base64
import httpx

def image_call(
    image_url: str = "https://dashscope.oss-cn-beijing.aliyuncs.com/images/256_1.png",
    prompt: str = "请描述这张图片的主要内容。",
):
    llm = create_qwen_model(
        model=os.getenv("QWEN_VL_MODEL", QWEN_MODEL),
        base_url=os.getenv("QWEN_BASE_URL", QWEN_BASE_URL),
        api_key=os.getenv("QWEN_API_KEY", QWEN_API_KEY),
        temperature=0,
    )

    # 将图片 URL 下载并转为 base64 data URL
    response = httpx.get(image_url)
    response.raise_for_status()
    content_type = response.headers.get("content-type", "image/png").split(";")[0]
    b64_data = base64.b64encode(response.content).decode("utf-8")
    data_url = f"data:{content_type};base64,{b64_data}"

    result = llm.invoke([
        HumanMessage(content=[
            {"type": "text", "text": prompt},
            {"type": "image_url", "image_url": {"url": data_url}},
        ])
    ])
    print(result.content)
    return result


image_call()

3 edge-tts

微软 Edge TTS,完全免费、无需 API Key、支持中日韩阿等多语言。

python 复制代码
import subprocess, sys
subprocess.run([sys.executable, "-m", "pip", "install", "-q", "edge-tts", "nest_asyncio"], check=True)

import asyncio, tempfile, nest_asyncio
import edge_tts

nest_asyncio.apply()

async def _tts(text: str, voice: str = "zh-CN-XiaoxiaoNeural") -> str:
    communicate = edge_tts.Communicate(text, voice)
    with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as tmp:
        path = tmp.name
    await communicate.save(path)
    return path

speech_file = asyncio.run(_tts(text_to_speak))
print(f"语音文件已保存: {speech_file}")

import subprocess
# 播放生成的语音文件
subprocess.run(["afplay", speech_file], check=True)

GraphQL

一种api查询语言,类似sql,用它来查询奈飞的数据库,查找一下和星球大战相关的电影,API地址

swapi-graphql.netlify.app/.netlify/fu...

bash 复制代码
! pip install httpx gql > /dev/null
! pip install gql
! pip install requests_toolbelt
python 复制代码
from langchain.agents import create_agent
from shared.llm_utils import create_qwen_model
from langchain_community.utilities import GraphQLAPIWrapper
from langchain_community.tools.graphql.tool import BaseGraphQLTool

GRAPHQL_ENDPOINT = "https://swapi-graphql.netlify.app/graphql"

llm = create_qwen_model(streaming=True)

graphql_wrapper = GraphQLAPIWrapper(
    graphql_endpoint=GRAPHQL_ENDPOINT,
    fetch_schema_from_transport=False,
)
tools = [BaseGraphQLTool(graphql_wrapper=graphql_wrapper)]

agent = create_agent(llm, tools)
print("Agent ready:", type(agent).__name__)

query = """
{
  allFilms {
    films {
      title
      director
      releaseDate
    }
  }
}
"""

# 先直接验证 GraphQL 连通性
raw_result = graphql_wrapper.run(query)
print(raw_result)
相关推荐
NettyBoy1 小时前
生产 YoungGC 导致的系统化卡顿
java·jvm
聚美智数1 小时前
食物热量搜索与详情双接口接入实战,轻量化生活服务 API 落地
java·开发语言·生活
Ting-yu1 小时前
Spring AI Alibaba零基础速成(2) ---- Ollama安装与使用
java·后端·spring·ai
砍材农夫1 小时前
物联网 基于netty构建mqtt服务协议支持
java·物联网·struts·netty
凤凰院凶涛QAQ1 小时前
《C++转Java快速入手系列》String篇:在C++里拼字符串像搬砖,在Java里拼字符串像玩乐高 —— 还是带垃圾回收的那种。
java·开发语言·c++
会编程的吕洞宾1 小时前
Spring_Boot_3_3_的___Transactional__
java·后端·spring
轻刀快马2 小时前
讲明白Lambda 表达式的进化史
java·开发语言
那个失眠的夜2 小时前
SpringBoot
java·开发语言·spring boot·spring·mvc·mybatis
多敲代码防脱发2 小时前
Spring进阶(Bean的生命周期与Bean的后处理器)
java·服务器·开发语言·spring boot·spring·servlet