文章目錄
- 一、相關背景
- 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 是一個用于構建語言模型應用的開源框架,主要提供對大模型、多工具、多模態、鏈式推理等功能的統一封裝,支持通過 Chains
、Agents
、Tools
等模塊靈活組合。
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)并使用其結果