文章目录

    • 一、相关背景
      • 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.pswp.cn/news/913218.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913218.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913218.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SegGPT: 在上下文中分割一切

摘要 我们提出了 SegGPT,一个在上下文中执行“分割一切”的通用模型。我们将各种分割任务统一为一个通用的上下文学习框架,通过将不同类型的分割数据转换为相同的图像格式来兼容这些差异。SegGPT 的训练被建模为一个带有随机颜色映射的上下文着色问题。…

【网络】Linux 内核优化实战 - net.core.busy_read

目录 核心功能工作原理与优势配置方式1. 临时配置(重启失效)2. 永久配置(重启生效) 与 net.core.busy_poll 的协同作用适用场景与注意事项适用场景:注意事项: 总结 net.core.busy_read 是 Linux 内核中与网…

alpine安装及配置nodejs开发测试环境

在Alpine Linux上安装和使用Node.js,打造开发和测试的环境。 apk仓库打开社区的源。 先在命令行中使用命令apk search nodejs npm yarn对仓库源进行搜索,,看看nodejs、yarn、npm的版本情况。 localhost:~# apk search nodejs npm yarn nod…

Apache Commons Pool中的GenericObjectPool详解

GenericObjectPool 是 Apache Commons Pool 库中的核心类,用于实现对象的池化管理,适用于数据库连接、HTTP 客户端、线程等昂贵资源的复用。以下从核心概念、工作原理、参数配置、使用场景及最佳实践等方面详细解析: ⚙️ 一、核心概念与组成…

攻防世界CTF题目解析系列————(1)

题目来源:攻防世界wife_wife 打开题目之后,发现登录界面,然后尝试弱口令,sql二次注入,xss发现都没有,然后看见下面go register(去注册)按钮 成功注册(username和password随便搞&…

楚存科技SD NAND贴片式T卡—高性能存储解决方案、赋能AI智能硬件

楚存科技SD NAND贴片式T卡—高性能存储解决方案、赋能AI智能硬件应用 在 AIoT 技术重构产业生态的时代浪潮中,智能硬件正从单一功能终端向数据枢纽演进 —— 智能家居设备日均产生 TB 级交互数据,工业物联网传感器需实时存储生产参数,车载智…

Python[数据结构及算法 --- 查找]

一.顺序查找&#xff08;无序表&#xff09;&#xff1a; def sequentialSearch(alist, item):pos 0found Falsewhile pos < len(alist) and not found:if alist[pos] item:found Trueelse:pos pos 1return foundtestlist [1, 2, 32, 8, 17, 19, 42, 13, 0] print(s…

Seata Saga模式实战:Java微服务中的分布式事务管理

在分布式系统中&#xff0c;Saga模式是一种用于管理跨多个服务的事务的柔性事务解决方案。它通过将长事务拆分为多个本地事务&#xff08;每个事务对应一个服务的操作&#xff09;&#xff0c;并通过补偿机制保证最终一致性。以下是Java中Saga模式的详细介绍&#xff0c;包括实…

若依学习笔记1-validated

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 保证 Spring AOP 相关的依赖包 --><dependency><groupId>org.springframework.boot<…

Excel 如何处理更复杂的嵌套逻辑判断?

处理复杂的嵌套逻辑判断&#xff0c;是Excel进阶路上必然会遇到的一道坎。当简单的IF函数“套娃”变得冗长、难以阅读和维护时&#xff0c;我们就需要更高级、更清晰的工具。 这里介绍三种从基础到高级的处理方法&#xff1a; 传统的 IF 函数嵌套 (经典&#xff0c;但容易混乱)…

使用Claude和MCP增强Selenium

1.配置MCP服务器打开Claude Desktop—>Settings—>Developer—>Edit Config{"mcpServers": {"selenium": {"command": "npx","args": ["-y", "angiejones/mcp-selenium"]}} }配置完成后重启Cl…

数据仓库锚点建模方法的前世今生

数据仓库锚点建模方法&#xff08;Anchor Modeling&#xff09;作为一种面向复杂数据环境的创新方法论&#xff0c;其发展历程与技术演进深刻反映了数据管理从结构化到动态化的转型需求。以下从起源、发展、核心思想、技术演进及未来趋势五个维度&#xff0c;系统梳理锚点建模的…

<三>Sping-AI alibaba 文生图

环境和配置请看&#xff1c;二&#xff1e;Sping-AI alibaba 入门-记忆聊天及持久化 源代码&#xff1a;https://github.com/springaialibaba/spring-ai-alibaba-examples/blob/main/spring-ai-alibaba-image-example/dashscope-image/src/main/java/com/alibaba/cloud/ai/exam…

vue组件和模板

好的&#xff0c;我们来详细解释一下在 Vue&#xff08;以及现代前端开发&#xff09;中两个最核心的概念&#xff1a;组件 (Component) 和 模板 (Template)。 理解了它们&#xff0c;就等于掌握了现代 Web 应用开发的基石。 一个核心比喻&#xff1a;乐高积木 在开始前&…

python学习打卡:DAY 18 推断聚类后簇的类型

浙大疏锦行 聚类后的分析&#xff1a;推断簇的类型 知识点回顾&#xff1a; 推断簇含义的2个思路&#xff1a;先选特征和后选特征通过可视化图形借助ai定义簇的含义科研逻辑闭环:通过精度判断特征工程价值 作业&#xff1a;参考示例代码对心脏病数据集采取类似操作&#xff0c;…

Ubuntu for ARM 更换为阿里云镜像源

1. 简介 该镜像适用于配置 ARM, PowerPC 等其他架构的 ubuntu系统&#xff0c;不适用 x86 &#xff01;&#xff01;&#xff01; 各种版本的Ubuntu for ARM下载地址&#xff1a;https://cdimage.ubuntu.com/releases 2. 配置方法 打开 sources.list 文件。 vim /etc/apt/s…

HTML与JavaScript:构建动态交互式Web页面的基石

HTML与JavaScript&#xff1a;构建动态交互式Web页面的基石 在现代Web开发中&#xff0c;HTML和JavaScript是不可或缺的两位主角。HTML负责页面的结构和内容&#xff0c;而JavaScript则赋予页面生命&#xff0c;使其能够响应用户交互、动态更新内容&#xff0c;并与后端服务进…

Python数据分析基础03:探索性数据分析

相关文章&#xff1a; 《python数据分析基础02&#xff1a;数据可视化分析》 《Python数据分析基础01&#xff1a;描述性统计分析》 探索性数据分析&#xff08;Exploratory Data Analysis, EDA&#xff09; 的深度解析&#xff0c;涵盖核心目标、方法论框架、关键技术及可视…

D3 面试题100道之(41-60)

这里是D3的面试题,我们从第 41~60题 开始逐条解答。一共100道,陆续发布中。 🟩 面试题(第 41~60 题) 41. D3 中如何添加图例? 图例可以通过手动创建 SVG 元素或使用 D3 的辅助函数来实现。常见做法是结合 d3.scaleOrdinal() 和 .range() 创建颜色映射图例。 示例: c…

Spring Boot事件驱动模型深度解析

目录 一、什么是Spring事件机制&#xff1f; 与传统方法调用的对比&#xff1a; 二、四大核心组件解析 1. ApplicationEvent&#xff1a;事件对象 2. ApplicationEventPublisher&#xff1a;事件发布器 3. ApplicationListener&#xff1a;事件监听接口 4. EventListener…