当前位置: 首页 > news >正文

基于 LangChain 实现通义千问 + Tavily 搜索 Agent 的简单实践

文章目录

    • 一、相关背景
      • 1.1 LangChain 简介
      • 1.2 通义千问(Tongyi Qianwen)
      • 1.3 Tavily 实时搜索引擎
      • 1.4 架构总览
    • 二、环境配置
      • 设置 API 密钥
    • 三、 Tavily 搜索
    • 四、智能 Agent 示例:自动判断是否调用 Tavily
      • 4.1 初始化 Agent
      • 4.2 提问两个问题:一个需要搜索,一个不需要
      • 4.3 Agent 自动推理过程

大语言模型(LLM)虽然拥有强大的语言理解和生成能力,但其自身知识具有时间滞后性,无法直接访问实时数据。这就催生了 Agent广泛应用。

本文将围绕 LangChain 框架,结合通义千问(Tongyi Qianwen)大模型与 Tavily 实时搜索引擎,构建一个具备 Agent 推理能力的实践案例。系统能够根据问题内容,自动判断是否需要使用工具(如 Tavily 进行实时搜索),实现更真实、更准确的答案生成。

一、相关背景

1.1 LangChain 简介

LangChain 是一个用于构建语言模型应用的开源框架,主要提供对大模型、多工具、多模态、链式推理等功能的统一封装,支持通过 ChainsAgentsTools 等模块灵活组合。

1.2 通义千问(Tongyi Qianwen)

通义千问是阿里云推出的大语言模型,具备优秀的中文理解与生成能力,尤其在中文问答、摘要、对话等任务中表现突出。通过 DashScope API 提供在线推理接口。

1.3 Tavily 实时搜索引擎

Tavily 是一个支持自然语言查询的网页摘要搜索引擎,能够根据用户的问题返回结构化网页摘要结果,适合用于外部知识增强场景。

1.4 架构总览

我们本次系统的架构如下:

用户问题 --> Agent 判断 -->|- 无需搜索 --> 通义千问直接生成答案|- 需要搜索 --> 使用 Tavily 搜索结果作为上下文 --> 生成答案

系统整体基于 LangChain 的 Agent 模式构建,利用 ZeroShotAgent 自动推理是否使用工具。

二、环境配置

pip install langchain langchain-community dashscope tavily-python

设置 API 密钥

export DASHSCOPE_API_KEY=your_dashscope_api_key
export TAVILY_API_KEY=your_tavily_api_key

三、 Tavily 搜索

我们首先展示一个基于 Tavily 搜索 的普通示例,演示 Tavily 的搜索结果如何作为上下文传给大模型。

from langchain_community.llms import Tongyi
from langchain_community.tools import TavilySearchResults
from langchain_core.prompts import PromptTemplate
import os
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableLambdaos.environ["OPENAI_API_KEY"] = "sk-"
os.environ["TAVILY_API_KEY"] = "tvly-"# 初始化 Tavily(旧版 API)
search = TavilySearchResults(k=3)# 增加 Tavily 搜索结果打印
def run_and_print_search(x):query = x["question"]results = search.run(query)print("\n🔍 Tavily 搜索结果:")for idx, item in enumerate(results):print(f"[{idx + 1}] {item['title']}")print(item['content'][:300])  # 打印前300字print(f"URL: {item['url']}")print("-" * 60)return resultssearch_tool = RunnableLambda(run_and_print_search)# 初始化通义千问
llm = Tongyi(model_name="qwen-turbo")# 提示模板
prompt = PromptTemplate.from_template("""
你是一个中文智能助手,请根据以下网页搜索内容回答用户的问题。
问题:{question}
搜索内容:{context}
请使用简体中文准确、简洁地作答:
""")# 构建 RAG Chain
rag_chain = ({"context": search_tool, "question": lambda x: x["question"]}| prompt| llm| StrOutputParser()
)# 执行
response = rag_chain.invoke({"question": "今天安徽合肥天气如何"})
print("\n通义千问回答:")
print(response)

在这里插入图片描述

四、智能 Agent 示例:自动判断是否调用 Tavily

在更高级的场景中,我们希望让模型“自己决定”是否使用工具进行搜索。这就需要借助 LangChain 的 Agent 模块。

4.1 初始化 Agent

from langchain.agents import initialize_agent, Tool
from langchain.agents.agent_types import AgentType# 通义模型
llm = Tongyi(model_name="qwen-turbo")# 工具定义
search_tool = TavilySearchResults(k=3)
tools = [Tool(name="tavily_search",func=search_tool.run,description="适用于需要通过网页获取实时信息的问题,例如新闻、事件时间、最新数据等")
]agent = initialize_agent(tools=tools,llm=llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,verbose=True
)

4.2 提问两个问题:一个需要搜索,一个不需要

import osfrom langchain.agents import initialize_agent, Tool
from langchain.agents.agent_types import AgentType
from langchain_community.llms import Tongyi
from langchain_community.tools.tavily_search import TavilySearchResultsos.environ["OPENAI_API_KEY"] = "sk-"
os.environ["TAVILY_API_KEY"] = "tvly-"# 初始化通义模型
llm = Tongyi(model_name="qwen-turbo")# 初始化 Tavily 工具
search_tool = TavilySearchResults(k=3)
tools = [Tool(name="tavily_search",func=search_tool.run,description="适用于需要通过网页获取实时信息的问题,例如新闻、事件时间、最新数据等")
]# 初始化 Agent
agent = initialize_agent(tools,llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,  # 基于描述自己选择用哪个工具verbose=True
)# 问题1:无需搜索,模型自己可答
question1 = "中国的首都是哪里?"# 问题2:需要搜索的实时问题
question2 = "今天的天气如何?"# 执行
print("\n问题1:无需调用 Tool")
response1 = agent.run(question1)
print("答案1:", response1)print("\n问题2:需要调用 Tavily")
response2 = agent.run(question2)
print("答案2:", response2)

4.3 Agent 自动推理过程

运行过程中,LangChain Agent 会自动识别问题的复杂度:

  • 若模型自身具备能力,则直接生成答案
  • 若识别到需要外部知识,会调用工具(Tavily)并使用其结果
    在这里插入图片描述
http://www.xdnf.cn/news/1081801.html

相关文章:

  • 在VMware虚拟机中安装Windows 98时,Explorer提示“该程序执行了非法操作,即将关闭”的解决办法
  • 虚拟机与容器技术详解:VM、LXC、LXD与Docker
  • php协程
  • MySQL 数据库传统方式部署主从架构的实现很详细
  • React Native 亲切的组件们(函数式组件/class组件)和陌生的样式
  • 若 VSCode 添加到文件夹内右键菜单中显示(通过reg文件方式)
  • 盘式制动器的设计+说明书和CAD)【6张】+绛重
  • Redis性能优化
  • 权电阻网络DAC实现电压输出型数模转换Multisim电路仿真——硬件工程师笔记
  • 前端捕获异常的全面场景及方法
  • Linux操作系统之文件(三):缓冲区
  • 每天一个前端小知识 Day 21 - 浏览器兼容性与 Polyfill 策略
  • 【每天一个知识点】动态知识库
  • JxBrowser 8.9.0 版本发布啦!
  • chrome插件合集
  • vue/微信小程序/h5 实现react的boundary
  • 智能电动汽车系列 --- 车载软件开发思想与已有OEM现状碰撞
  • vue-39(为复杂 Vue 组件编写单元测试)
  • 设计模式(十)
  • 区块链技术核心组件及应用架构的全面解析
  • Dash 安装使用教程
  • 程序计数器(PC)是什么?
  • Linux入门篇学习——Linux 帮助手册
  • 版本控制器SVN
  • 基于区块链的物联网(IoT)安全通信与数据共享的典型实例
  • 三体融合实战:Django+讯飞星火+Colossal-AI的企业级AI系统架构
  • Abase和ByteKV存储方案对比
  • [C++] C++多重继承:深入解析复杂继承关系
  • 怎么更改cursor字体大小
  • github上部署自己的静态项目