在langchain框架开发AI应用时,为了确保模型能够获取到最新消息,并与外界进行连接,从外界获取信息。通常会给模型配置联网工具。本文介绍一款与langchain适配性极好,额度大的api联网搜索工具Tavily,原生支持作为工具为大模型配置

1.首先注册tavily获取密钥

访问https://auth.tavily.com/

注册或登录后进入页面

申请一个秘钥用于进行api调用,普通用户每个月可以免费进行1000次调用。

复制api秘钥后打开开发环境

2.集成入大模型

确保你的环境中安装了langchain系列的依赖

在配置文件中配置tavily和大模型的url和api_key

from langchain_tavily import TavilySearch
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
import os
from dotenv import load_dotenv
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage, ToolMessage
from pydantic import BaseModel, Field

load_dotenv()

search_tool = TavilySearch(
    max_results = 5, # 最多返回5条
    topic = "general" # 常规查询模式
)

# 结构化输出约束
class Reference(BaseModel):
    title: str = Field(description="标题")
    url: str = Field(description="链接")

class AnswerInfo(BaseModel):
    answer: str = Field(description="答案")
    references: list[Reference] = Field(description="参考资料")

agent = create_agent(
    init_chat_model(
        model = "deepseek-v4-flash",
        model_provider="openai",
        api_key = os.getenv("DEEPSEEK_API_KEY"),
        base_url = os.getenv("DEEPSEEK_BASE_URL"),
        model_kwargs={
            "extra_body": {
                "thinking": {"type":"disabled"}
            }
        }
    ),
    tools = [search_tool],
    response_format= AnswerInfo,
    system_prompt = "你是一个智能助手,擅长实用工具来解决用户问题",
)

response = agent.invoke({"messages": HumanMessage("鸡你太美是什么梗?")})

for message in response["messages"]:
    message.pretty_print()

在TavilySearch()中可以配置多种参数,比如时效、返回条数、查询模式等等,这里演示只配置了最简单的参数。

在默认情况下,代码示例中的方法会使大模型在调用工具时先理解每一个tavilySearch工具参数的含义然后进行调用。在简单场景下这种方式很不划算,会使大模型小号的token剧增。如果事先知道只需要哪几个参数,可以单独封装出一个tool工具为大模型配置,改为下面这样:

from langchain.tools import tool

@tool
def search(query: str):
    """
    :param query: the question params that need to search
    :return: answer
    """
    return search_tool.run(query)

然后将模型工具列表的工具替换为 search

下面是控制台输出,可以看到每一环节的执行细节都被打印了出来。

3.扩展

如果想要将模型的执行过程各个时段的状态展示出来,做到当前许多网页版大模型的效果。可以使用下面这种方式获取模型运行时的事件流,并流式返回进行json解析。

    async for event in agent.astream_events(
        {"messages": HumanMessage("鸡你太美是什么梗?")},
        version="v2"
    ):
        print(event)
Logo

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

更多推荐