Lang Chain + kimi + tavily实现联网智能体(agent)
概述
在 AI 应用开发中,“让大模型既有常识又能获取实时信息” 是个高频需求 —— 毕竟大模型的知识有截止日期,而用户的问题常常涉及最新动态(比如 “今天的股市行情”)或特定数据(比如 “某部电影的最新票房”)。
今天就以一个实操案例,讲讲如何用 LangChain 快速搭建一个 “会自己查资料” 的智能问答工具:它能接收用户提问,自动判断是否需要搜索,调用 Tavily 获取实时信息后,再通过 Kimi 大模型整理出自然语言回答。整个过程不用复杂架构,几行核心代码就能串联起来。
为什么选这几个工具?先理清楚 “技术组合” 逻辑
在动手前,先简单说下工具选型的思路 —— 毕竟搭这类工具的核心是 “让组件各司其职”:
-
LangChain:作为 “胶水” 工具。它不用自己写复杂逻辑,就能把大模型、搜索引擎这些独立的工具 “粘” 起来,让它们协同工作(比如让大模型判断 “要不要调用搜索”,再把搜索结果传给大模型整理)。
-
Kimi ( moonshot-v1-8k ):作为 “大脑”。它兼容 OpenAI 的 API 格式,而且 8k 上下文足够处理搜索回来的多段信息,整理回答时逻辑更连贯。
-
Tavily Search:作为 “信息手”。相比普通搜索引擎,它专为 AI 工具设计,返回的结果是结构化的文本(不是网页链接),大模型能直接 “读” 懂,不用额外处理格式。
这三个工具组合起来,既能解决大模型 “知识过时” 的问题,又不用从零开发复杂的交互逻辑,适合快速验证想法。
环境搭建
安装必要的库
打开终端,先把需要的工具包装好,这些是连接 LangChain、Kimi、Tavily 的 “桥梁”:
pip install langchain langchain-community tavily-python openai
-
langchain和langchain-community:LangChain 的核心库,提供组装工具的基础功能;
-
tavily-python:连接 Tavily 搜索引擎的工具;
-
openai:因为 Kimi 2 兼容 OpenAI 格式,用这个库能直接对接 Kimi 的 API。
API密钥准备
需要两个密钥,都是免费可申请的(额度足够个人测试用):
-
Tavily API 密钥:去Tavily 官网注册账号,每个账号每个月有1000的免费额度;
-
Kimi API 密钥:去Moonshot AI 官网注册,在文档里面都有,网上也有教程这里就不多讨论了,新人好像是会送十几块钱的额度,省点用还是可以的。
拿到后先存好,后面代码里要用到。
功能实现
密钥配置
填好 “通行证”,让程序有权限调用工具
先把刚才拿到的 API 密钥 “告诉” 程序,这样调用 Tavily 和 Kimi 时,对方才会认我们的请求:
# 填Tavily的API密钥(替换成你自己的)
os.environ["TAVILY_API_KEY"] = "tvly-dev-xxx"
# 填Kimi的API密钥(替换成你自己的)
os.environ["OPENAI_API_KEY"] = "sk-xxx"
# Kimi的API地址
kimi_api_base = "https://api.moonshot.cn/v1"
搜索引擎初始化
初始化 “搜索引擎”,明确 “什么时候该用它”
接下来把 Tavily 搜索引擎准备好,还要告诉程序 “什么场景下该调用它”(比如用户问最新消息时):
# 初始化Tavily搜索引擎
tavily_search = TavilySearchResults()
# 给搜索引擎“贴标签”:起名字、说清功能、讲明白适用场景
tools = [
Tool(
name="Tavily Search", # 工具名,方便大模型识别
func=tavily_search.run, # 调用工具时执行的动作(这里就是“搜索”)
description="当需要最新信息(比如天气、新闻)、特定数据(比如票房、股价),或不确定答案时,用这个工具查"
)
]
这里的description很重要 —— 大模型会读这段描述,判断 “这个问题要不要调用搜索”。比如用户问 “2024 年诺贝尔物理学奖得主”,大模型看到 “2024 年” 是较新的时间,就会根据描述调用 Tavily。
模型初始化
连接 Kimi 2,调好 “回答风格”
把 Kimi 大模型连进来,顺便设置一下它的 “回答风格”(比如别太死板,也别太随意):
# 连接Kimi模型
llm = ChatOpenAI(
model_name="moonshot-v1-8k", # Kimi的模型名,换别的也可以
openai_api_base=kimi_api_base, # 前面填的Kimi API地址
temperature=0.7 # 控制回答的随机值,我这里取0.7
)
因为 Kimi 2 兼容 OpenAI 的 API 格式,所以直接用 LangChain 的ChatOpenAI函数就能连,不用额外写适配代码,这一步省了不少事。
agent
组装 “智能体”,让工具和模型 “合作干活”
用 LangChain 的initialize_agent函数,把前面准备的 “搜索引擎” 和 “大模型” 组装成一个能自主决策的 “智能体”:
# 组装智能体:给它工具、大脑,再定工作规则
agent = initialize_agent(
tools, # 前面准备的“工具箱”(含搜索引擎)
llm, # 前面连接的Kimi“大脑”
# 工作模式:先分析问题,需要的话调用工具,再整理答案
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True, # 打开“思考过程可视化”:能看到它是“怎么判断要不要搜索的”
handle_parsing_errors=True # 遇到小错误时自动处理,不用手动调试
)
到这里,核心功能就搭完了。这个agent就是整个工具的 “核心控制器”—— 后面用户提问时,直接让它处理就行。
对话界面
加个交互界面,让用户能直接用
最后加几行代码,做个简单的 “交互式问答界面”,用户输入问题,程序就返回答案:
print("输入'退出'结束程序。\n")
# 一直等用户提问(直到输入“退出”)
while True:
question = input("请输入你的问题: ")
# 如果用户输入“退出”,就结束程序
if question.lower() in ["退出", "q", "quit"]:
print("程序结束,再见!")
break
print("\n思考中...\n")
try:
# 让智能体处理问题,拿到答案
result = agent.run(question)
# 把答案显示给用户
print("回答:")
print(result)
except Exception as e:
# 如果出错了,显示错误信息
print(f"处理问题时出错: {str(e)}")
print("\n" + "-"*50 + "\n")
完整代码
import os
from langchain.agents import initialize_agent, AgentType
from langchain.tools import Tool
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain.chat_models import ChatOpenAI
def main():
# 请替换为你的实际API密钥
os.environ["TAVILY_API_KEY"] = ""
os.environ["OPENAI_API_KEY"] = ""
# Kimi API基础URL
kimi_api_base = "https://api.moonshot.cn/v1"
# 初始化Tavily搜索工具
tavily_search = TavilySearchResults()
# 定义工具列表,包含搜索功能
tools = [
Tool(
name="Tavily Search",
func=tavily_search.run,
description="当你需要获取最新信息、时事新闻、特定数据或不确定的知识时,使用这个工具进行搜索。"
)
]
# 初始化Kimi 2模型(兼容OpenAI格式)
llm = ChatOpenAI(
model_name="moonshot-v1-8k",
openai_api_base=kimi_api_base,
temperature=0.7 # 控制输出的随机性
)
# 初始化Agent,将模型和工具结合
agent = initialize_agent(
tools,
llm,
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True, # 输出思考过程
handle_parsing_errors=True
)
print("输入'退出'结束程序。\n")
# 交互式提问
while True:
question = input("请输入你的问题: ")
if question.lower() in ["退出", "q", "quit"]:
print("程序结束,再见!")
break
print("\n思考中...\n")
try:
# 运行Agent处理问题
result = agent.run(question)
print("回答:")
print(result)
except Exception as e:
print(f"处理问题时出错: {str(e)}")
print("\n" + "-" * 50 + "\n")
if __name__ == "__main__":
main()
演示



更多推荐

所有评论(0)