基于Lepton AI构建对话式搜索引擎:500行代码实现智能问答
1. 项目概述用Lepton AI打造你自己的对话式搜索引擎最近在折腾AI应用开发发现很多朋友都想做一个能“对话”的搜索引擎。想象一下你问它“帮我找找最近有什么好用的开源向量数据库”它不仅能返回一堆链接还能理解你的意图把搜索结果整理成一段通顺的总结甚至能和你继续聊下去。这听起来很酷但实现起来是不是感觉要写几千行代码还得搞定复杂的后端部署其实不然。今天要聊的这个项目Search with Lepton它用不到500行代码就帮你搭起了一个功能完整的对话式搜索引擎。我自己上手跑了一遍发现它巧妙地利用了Lepton AI平台的能力把大语言模型LLM、搜索引擎API和前端界面这些复杂的东西打包成了一个开箱即用的方案。无论你是想快速验证一个产品想法还是想学习如何将LLM与搜索结合这个项目都是一个绝佳的起点。接下来我就带你从零开始拆解它的设计思路、手把手完成部署并分享我在实操中踩过的坑和总结的技巧。2. 核心架构与设计思路拆解2.1 为什么是“对话式”搜索传统的搜索引擎返回的是十条蓝色的链接和摘要片段。用户需要自己点开多个网页阅读、对比、归纳才能得到答案。这个过程效率低下。而“对话式”搜索的核心目标是让AI代理来完成“阅读、归纳、总结”这一步。它的工作流程通常是用户输入一个自然语言问题 - 系统调用搜索引擎API获取原始结果 - 将原始网页内容或摘要喂给大语言模型LLM- LLM生成一个结构清晰、语言自然的答案。这不仅仅是把搜索结果堆在一起而是要求LLM理解问题意图从多源信息中提取关键点去重、排序最终组织成一段有用的回复。Search with Lepton正是实现了这个核心流程。2.2 技术选型Lepton AI 作为粘合剂这个项目最巧妙的地方在于其技术选型。它没有让我们自己去搭建一个复杂的后端服务来协调LLM和搜索API而是深度依赖了Lepton AI平台。你可以把Lepton AI理解为一个云原生的AI应用部署和管理平台。它提供了两大核心能力正好被这个项目用上了内置的LLM服务项目通过leptonaiSDK可以几乎零配置地调用Lepton平台托管的高质量LLM比如GPT-4、Claude等。这意味着你不需要自己申请OpenAI的API Key、处理复杂的计费和速率限制Lepton帮你搞定了这一切。在代码里它可能就体现为一行client leptonai.Client()的调用。内置的KV存储对话式搜索有一个常见需求缓存。如果两个用户问了同样的问题每次都去重新搜索并调用LLM生成答案既浪费钱又慢。因此需要对问题和答案进行缓存。Lepton AI提供了内置的Key-Value存储服务项目用它来缓存搜索结果和生成的答案极大地提升了响应速度和降低了成本。这种设计让开发者只需关注业务逻辑即如何组合搜索和LLM而无需操心基础设施模型部署、缓存数据库、网络服务。这是它能用不到500行代码实现的核心原因。2.3 前端与后端分离的清晰架构从项目结构看它采用了经典的前后端分离架构前端web/目录一个用现代前端框架如React或Vue构建的交互界面。它负责展示搜索框、聊天历史、流式输出的答案并与后端API通信。项目已经写好了构建脚本npm run build我们只需要执行即可生成静态文件。后端search_with_lepton.py一个Python Web服务很可能基于FastAPI或Flask。它定义了接收用户查询的API端点。当收到查询时它执行以下操作检查KV缓存中是否有该问题的答案有则直接返回。若无缓存则根据配置BACKEND环境变量调用对应的搜索引擎APIBing或Google。将搜索引擎返回的原始结果标题、链接、摘要整理成一段提示词Prompt。调用Lepton平台的LLM服务将提示词送入请求生成总结性答案。将LLM生成的答案存入KV缓存然后返回给前端。这种架构职责清晰便于独立开发和扩展。例如你可以轻易地替换前端UI或者在后端增加对更多搜索引擎如DuckDuckGo的支持。3. 环境准备与核心配置详解3.1 搜索引擎API密钥获取项目支持多种搜索引擎后端这是实现搜索能力的基石。你需要根据选择申请对应的API Key。Bing Web Search API这是微软提供的商业搜索接口结果质量高稳定性好。访问 Microsoft Azure Portal 如果你没有账户需要注册。在Azure中创建一个新的“资源”。在搜索框里输入“Bing Search v7”选择它并创建。创建过程中你需要选择订阅Subscription、资源组Resource Group和区域。对于个人试用选择免费层F1即可它每月提供一定额度的免费调用。创建成功后进入该资源在“密钥和终结点”页面你会看到两个Key。复制其中一个。注意请妥善保管此密钥不要将其直接提交到Git等公开仓库。我们后续会将其设置为环境变量。Google Custom Search JSON API (Programmable Search Engine)这是Google官方提供的可编程搜索接口适合需要精准控制搜索范围的场景。访问 Google Cloud Console 。创建一个新项目或选择现有项目。在侧边栏找到“API和服务” - “库”。搜索“Custom Search API”并启用它。接着你需要创建凭据API Key。在“API和服务” - “凭据”页面点击“创建凭据” - “API密钥”。复制生成的密钥。仅有关键词还不够你还需要一个“搜索引擎ID”CX。访问 Programmable Search Engine控制台 。点击“新增”配置你的搜索引擎。你可以选择“搜索整个网络”也可以限定在某些特定网站。创建完成后在“控制面板” - “基本信息”里找到“搜索引擎ID”复制它。提示Google Custom Search API虽然有免费额度但额度较少。对于高频使用建议关注其定价。第三方聚合服务SearchApi / Serper如果你觉得直接申请Bing或Google的API流程繁琐或者需要更高的调用额度可以考虑这些第三方服务。它们封装了多个搜索引擎的API提供统一的接口通常有更友好的免费套餐。SearchApi.io注册后即可在仪表板获取API Key。Serper.dev同样注册后获取API Key。 这些服务的优点是开箱即用但需要注意其服务条款和稳定性。3.2 Lepton AI 工作空间配置这是项目的核心依赖用于提供LLM和KV服务。安装与登录按照提示在命令行执行pip install -U leptonai openai lep login。这行命令做了两件事安装/升级leptonai和openai的Python SDK然后通过lep login命令引导你进行认证。获取工作空间令牌登录命令通常会打开浏览器引导你完成OAuth授权。授权成功后你需要在 Lepton AI Dashboard 的Settings-Tokens页面复制你的LEPTON_WORKSPACE_TOKEN。这个令牌是你在代码中访问Lepton云服务的凭证。实操心得lep login有时可能因为网络问题失败。如果遇到问题可以尝试直接复制令牌然后在终端手动设置环境变量export LEPTON_WORKSPACE_TOKENyour_token_here后续的lep photon run命令也能识别。3.3 前端构建环境准备项目的前端部分需要Node.js环境来构建。安装Node.js如果你没有安装请前往 Node.js官网 下载并安装LTS版本。安装完成后在终端运行node -v和npm -v检查是否安装成功。安装依赖进入项目的web目录运行npm install。这个命令会根据package.json文件下载所有必要的前端依赖包如React, Vite, Tailwind CSS等。常见问题npm install可能因为网络问题失败。可以尝试配置淘宝镜像npm config set registry https://registry.npmmirror.com然后再执行安装。如果遇到node-sass等原生模块编译错误可能需要全局安装windows-build-toolsWindows或Xcode Command Line ToolsmacOS。4. 完整构建与本地运行实操4.1 环境变量配置与项目构建所有敏感信息都通过环境变量传递这是安全且标准的做法。我们以使用Bing Search和Lepton LLM为例展示完整流程。克隆项目首先将项目代码拉到本地。git clone https://github.com/leptonai/search_with_lepton.git cd search_with_lepton设置环境变量打开你的终端Linux/macOS用bash/zshWindows用PowerShell或CMD。设置Bing API密钥# Linux/macOS export BING_SEARCH_V7_SUBSCRIPTION_KEY你的Bing密钥 # Windows PowerShell $env:BING_SEARCH_V7_SUBSCRIPTION_KEY你的Bing密钥 # Windows CMD set BING_SEARCH_V7_SUBSCRIPTION_KEY你的Bing密钥设置Lepton工作空间令牌export LEPTON_WORKSPACE_TOKEN你的Lepton令牌 # Windows PowerShell $env:LEPTON_WORKSPACE_TOKEN你的Lepton令牌构建前端静态资源进入web目录并构建。构建过程会将React代码等编译、优化生成静态文件通常在dist或build目录。cd web npm install # 如果之前没安装过依赖 npm run build构建成功后你会看到输出目录比如dist里生成了index.html和一堆静态资源文件。此时可以回到项目根目录cd ..。启动后端服务在项目根目录指定后端为Bing并启动Python服务。BACKENDBING python search_with_lepton.py如果一切顺利终端会输出服务启动的信息通常监听在http://127.0.0.1:8000或类似地址。访问应用打开浏览器访问http://127.0.0.1:8000。你应该能看到一个简洁的搜索界面。尝试输入一个问题比如“Explain quantum computing in simple terms”稍等片刻就能看到搜索引擎返回的原始结果以及LLM生成的总结性答案。4.2 切换不同搜索引擎后端如果你想使用Google搜索需要在启动服务前设置对应的环境变量和BACKEND参数。使用 SearchApi.io:export SEARCHAPI_API_KEY你的SearchApi密钥 BACKENDSEARCHAPI python search_with_lepton.py使用 Serper.dev:export SERPER_SEARCH_API_KEY你的Serper密钥 BACKENDSERPER python search_with_lepton.py使用 Google Programmable Search Engine:export GOOGLE_SEARCH_API_KEY你的Google API密钥 export GOOGLE_SEARCH_CX你的搜索引擎ID BACKENDGOOGLE python search_with_lepton.py注意事项每次切换后端最好重启一下Python服务确保环境变量生效。另外不同搜索引擎返回的数据格式略有差异项目代码中已经做了适配但结果的风格和质量会有所不同。Bing的结果通常更偏重商业和新闻Google的覆盖面可能更广。4.3 核心代码流程解析虽然项目宣称不到500行但其核心逻辑非常清晰。我们简要看一下search_with_lepton.py中大概的流程伪代码# 1. 初始化Lepton客户端和KV存储 client leptonai.Client() kv leptonai.KV() # 2. 定义搜索函数 (以Bing为例) def search_bing(query): headers {Ocp-Apim-Subscription-Key: api_key} params {q: query, count: 10} # 获取10条结果 response requests.get(BING_ENDPOINT, headersheaders, paramsparams) # 解析返回的JSON提取标题、链接、摘要snippet return parsed_results # 3. 定义LLM总结函数 def summarize_with_llm(query, search_results): # 将搜索结果的标题和摘要拼接成一段文本作为LLM的上下文 context \n.join([f{r[title]}: {r[snippet]} for r in search_results]) # 构建Prompt指示LLM基于上下文回答问题 prompt f基于以下搜索结果请用中文回答这个问题{query}\n\n搜索结果\n{context}\n\n答案 # 调用Lepton托管的LLM completion client.completions.create(modelgpt-4, promptprompt, max_tokens500) return completion.choices[0].text # 4. Web服务主逻辑 app.post(/search) def handle_search(user_query: str): # 检查缓存 cached_answer kv.get(user_query) if cached_answer: return {answer: cached_answer, cached: True} # 执行搜索 if BACKEND BING: raw_results search_bing(user_query) # ... 其他搜索引擎分支 # LLM总结 final_answer summarize_with_llm(user_query, raw_results) # 写入缓存 kv.put(user_query, final_answer) # 返回结果包括原始结果和总结 return {answer: final_answer, raw_results: raw_results, cached: False}可以看到整个流程就是“接收查询 - 查缓存 - 搜索 - LLM总结 - 存缓存 - 返回”这样一个清晰的管道。KV缓存的存在避免了重复计算是生产级应用的必要考虑。5. 部署到Lepton AI云平台本地运行没问题后你很可能希望将它部署到公网分享给其他人使用。Lepton AI提供了极其简便的一键部署能力。5.1 一键部署推荐项目仓库的README中通常有一个“Deploy with Lepton AI”的按钮。点击这个按钮它会引导你跳转到Lepton AI的Dashboard并预填好部署这个光子PhotonLepton对可部署单元的称呼所需的配置。你只需要确认部署的名称如search-with-lepton。在环境变量部分填入你之前申请的BING_SEARCH_V7_SUBSCRIPTION_KEY和LEPTON_WORKSPACE_TOKEN。选择你想要的硬件资源对于轻量级应用小型CPU实例通常足够。点击部署。几分钟后你的应用就会有一个专属的URL如https://search-with-lepton-[你的用户名].lepton.run任何人都可以通过这个链接访问你的对话式搜索引擎。5.2 使用命令行部署如果你希望对部署有更精细的控制或者修改了代码想部署自己的版本可以使用lep photon run命令。lep photon run -n my-search-app -m search_with_lepton.py \ --env BACKENDBING \ --env BING_SEARCH_V7_SUBSCRIPTION_KEY你的Bing密钥 \ --env LEPTON_WORKSPACE_TOKEN你的Lepton令牌命令解释-n my-search-app给你的部署实例起个名字。-m search_with_lepton.py指定入口文件。--env设置运行所需的环境变量。执行命令后CLI会打包你的代码和依赖上传到Lepton平台并启动。部署完成后同样会给出访问链接。实操心得在部署前务必确保requirements.txt文件如果有或代码中列明了所有依赖如requests,openai等。Lepton的打包系统会自动安装它们。如果部署失败查看部署日志是排查问题的第一步通常能发现缺失依赖或环境变量错误。6. 高级定制与优化方向基础功能跑通后你可以根据自己的需求对这个项目进行深度定制。6.1 自定义提示词工程项目的核心效果很大程度上取决于它发给LLM的提示词Prompt。默认的提示词可能比较简单。你可以修改summarize_with_llm函数中的prompt模板来改变LLM的行为。例如你可以要求LLM以特定格式输出“请用分点列表的形式回答。”注重信息的时效性“请优先参考2023年以后的搜索结果。”进行批判性思考“在总结后请指出这些搜索结果中可能存在的矛盾或未涵盖的方面。”限制回答长度“答案请控制在200字以内。”优化提示词是提升应用效果性价比最高的方式。你可以多尝试不同的表述观察输出结果的变化。6.2 集成其他搜索引擎或数据源项目架构支持轻松扩展新的搜索后端。在代码中仿照search_bing函数编写一个新的搜索函数如search_duckduckgo。在Web请求处理逻辑中增加一个新的BACKEND分支如BACKENDDUCKDUCKGO。修改前端设置如果需要让用户可以选择这个新的搜索引擎。更进一步你不仅可以接入网页搜索还可以接入学术搜索引擎如Google Scholar、Semantic Scholar构建学术问答助手。内部知识库结合向量数据库如Milvus, Pinecone先进行向量相似性检索再将相关文档片段送给LLM总结实现基于私有文档的智能问答。实时数据API如天气、股票、航班信息API让助手能回答事实性极强的实时问题。6.3 前端界面个性化前端代码在web/目录下通常由src/中的组件构成。你可以修改样式通过CSS或Tailwind CSS类改变颜色、字体、布局使其符合你的品牌风格。增加功能对话历史持久化将聊天记录保存在浏览器LocalStorage中。答案反馈按钮增加“有帮助/没帮助”的按钮收集用户反馈用于后续优化。流式输出修改后端和前端代码让LLM的答案像ChatGPT一样一个字一个字地流式输出提升用户体验。多轮对话修改后端逻辑将历史对话上下文也送入LLM使其能进行连贯的多轮对话而不仅仅是单次问答。6.4 性能与成本优化当用户量增大时需要考虑优化。缓存策略优化默认的KV缓存是永久缓存。你可以引入缓存过期机制TTL例如只缓存24小时内的热门查询以平衡新鲜度和性能。LLM模型选择Lepton平台可能提供不同规模和价格的模型如GPT-3.5-Turbo比GPT-4便宜且快。对于简单查询可以尝试使用更小、更快的模型并在代码中根据查询复杂度动态选择模型。结果分页与截断对于复杂的查询搜索引擎可能返回大量结果。全部送给LLM会消耗大量Token。可以只选取相关性最高的前5条结果进行总结或者先让LLM筛选一遍结果。异步处理对于耗时的操作如网络搜索、LLM生成可以使用异步框架如FastAPI的async/await避免阻塞请求提高服务器的并发处理能力。7. 常见问题与故障排查实录在实际搭建和运行过程中你可能会遇到以下问题。这里记录了我踩过的坑和解决方法。7.1 环境变量未生效症状启动服务时提示“API Key not found”或类似错误。排查检查你是否在正确的终端窗口设置了环境变量。新开的终端窗口需要重新设置。在Python代码中尝试print(os.environ.get(BING_SEARCH_V7_SUBSCRIPTION_KEY))看看是否能打印出来。对于Windows用户注意在PowerShell和CMD中设置环境变量的语法不同且设置后可能需要重启终端或IDE。解决最稳妥的方式是使用.env文件。在项目根目录创建.env文件内容如下BING_SEARCH_V7_SUBSCRIPTION_KEY你的密钥 LEPTON_WORKSPACE_TOKEN你的令牌 BACKENDBING然后在Python代码开头使用python-dotenv库加载from dotenv import load_dotenv; load_dotenv()。记得将.env添加到.gitignore中避免密钥泄露。7.2 前端构建失败症状运行npm run build时出现各种错误如Module not found,SyntaxError。排查确保Node.js版本符合要求查看package.json中的engines字段。删除node_modules文件夹和package-lock.json文件然后重新运行npm install。检查网络如果是国内环境配置npm镜像源。解决# 清除缓存并重装 rm -rf node_modules package-lock.json npm cache clean --force npm config set registry https://registry.npmmirror.com npm install npm run build7.3 Lepton AI 认证或调用失败症状服务启动后搜索时后端报错提示Lepton认证失败或LLM调用失败。排查确认LEPTON_WORKSPACE_TOKEN是否正确且未过期。可以到Lepton Dashboard的Tokens页面查看。确认你的Lepton工作空间是否有配额是否绑定了有效的支付方式如果使用付费模型。在代码中增加错误处理打印出Lepton API返回的具体错误信息。解决重新生成一个Token并更新环境变量。登录Lepton Dashboard检查工作空间的额度和账单状态。尝试在代码中显式指定一个已知可用的模型例如client.completions.create(modelgpt-3.5-turbo-instruct, ...)。7.4 搜索返回结果为空或质量差症状LLM生成的答案很空洞或者直接说“根据搜索结果未找到相关信息”。排查首先绕过LLM直接打印出搜索引擎API返回的原始数据raw_results。看看是否真的有数据数据格式是否正确。检查你的搜索引擎API是否配置正确特别是Google Custom Search的CX搜索引擎ID是否正确它决定了搜索的范围。尝试用简单的英文关键词在代码中直接测试搜索函数。解决如果原始结果为空检查API密钥的权限和额度。去对应的云平台控制台查看调用日志和错误信息。如果原始结果有数据但质量差考虑优化搜索查询。可以在将用户问题发送给搜索引擎前先用一个简单的LLM调用或规则对问题进行关键词提取或重写使其更符合搜索引擎的语法。尝试更换搜索引擎后端。不同引擎在不同类型查询上表现有差异。7.5 部署后无法访问或报错症状一键部署或命令行部署成功但访问给出的URL显示错误如502 Bad Gateway。排查在Lepton AI Dashboard上找到你的部署实例查看其日志Logs。这是最重要的排查手段。日志中通常会明确指示错误原因可能是环境变量缺失、依赖安装失败、代码语法错误、端口绑定冲突等。解决依赖问题确保项目根目录有正确的requirements.txt或pyproject.toml文件。入口点错误确认lep photon run命令中-m参数指定的文件路径和入口函数正确。对于这个项目入口文件就是search_with_lepton.pyLepton会自动识别其中的Web应用。资源不足如果日志显示内存不足OOM尝试在部署时选择配置更高的实例规格。这个项目就像一个精心设计的乐高套装提供了搭建对话式搜索引擎所需的所有核心模块。通过它你不仅能快速获得一个可用的工具更能透彻理解这类应用背后的技术栈和工作原理。从环境配置、本地调试到云端部署整个流程走一遍你对AI应用开发的认知会具体很多。我自己的体会是最大的收获不在于运行了这个Demo而在于通过修改它的代码、定制提示词、接入新数据源的过程真正掌握了将想法快速实现为可交互AI产品的能力。如果你在复现过程中遇到了上面没提到的问题最好的办法就是仔细阅读错误日志并善用搜索引擎——毕竟你现在正在构建的就是一个更好的搜索引擎。