基于 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.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…