概述

在 AI 应用开发中,“让大模型既有常识又能获取实时信息” 是个高频需求 —— 毕竟大模型的知识有截止日期,而用户的问题常常涉及最新动态(比如 “今天的股市行情”)或特定数据(比如 “某部电影的最新票房”)。​

今天就以一个实操案例,讲讲如何用 LangChain 快速搭建一个 “会自己查资料” 的智能问答工具:它能接收用户提问,自动判断是否需要搜索,调用 Tavily 获取实时信息后,再通过 Kimi 大模型整理出自然语言回答。整个过程不用复杂架构,几行核心代码就能串联起来。

为什么选这几个工具?先理清楚 “技术组合” 逻辑​

在动手前,先简单说下工具选型的思路 —— 毕竟搭这类工具的核心是 “让组件各司其职”:​

  1. LangChain:作为 “胶水” 工具。它不用自己写复杂逻辑,就能把大模型、搜索引擎这些独立的工具 “粘” 起来,让它们协同工作(比如让大模型判断 “要不要调用搜索”,再把搜索结果传给大模型整理)。​

  2. Kimi ( moonshot-v1-8k ):作为 “大脑”。它兼容 OpenAI 的 API 格式,而且 8k 上下文足够处理搜索回来的多段信息,整理回答时逻辑更连贯。​

  3. Tavily Search:作为 “信息手”。相比普通搜索引擎,它专为 AI 工具设计,返回的结果是结构化的文本(不是网页链接),大模型能直接 “读” 懂,不用额外处理格式。​

这三个工具组合起来,既能解决大模型 “知识过时” 的问题,又不用从零开发复杂的交互逻辑,适合快速验证想法。

环境搭建

安装必要的库​

打开终端,先把需要的工具包装好,这些是连接 LangChain、Kimi、Tavily 的 “桥梁”:

pip install langchain langchain-community tavily-python openai

  1. langchain和langchain-community:LangChain 的核心库,提供组装工具的基础功能;​

  2. tavily-python:连接 Tavily 搜索引擎的工具;​

  3. openai:因为 Kimi 2 兼容 OpenAI 格式,用这个库能直接对接 Kimi 的 API。

API密钥准备

需要两个密钥,都是免费可申请的(额度足够个人测试用):​

  1. Tavily API 密钥:去Tavily 官网注册账号,每个账号每个月有1000的免费额度;​

  2. 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()

演示

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐