文章目录
- 一、相关背景
- 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)并使用其结果