当前位置: 首页 > article >正文

用LangChain Tools打造会自主查资料的GPT模型

1. 项目概述为什么你需要一个“会自己查资料”的GPT模型我第一次在ChatGPT里输入“2024年巴黎奥运会新增了哪些比赛项目”时得到的回复是“我的训练数据截止于2021年9月无法提供2024年的最新信息。”——这句话我看了三年每次看到都像被按在键盘上反复摩擦。不是模型不行是它被“锁死”在出厂那一刻的知识库里。而现实世界每天都在刷新政策变了、股价涨了、新药获批了、明星发新歌了……你总不能为了查一条新闻先切到浏览器再复制粘贴回对话框最后手动总结吧这已经不是效率问题是认知带宽的持续损耗。更实际的痛点在于工程落地。很多团队已经在用OpenAI API做内部知识助手、客服机器人或数据分析前端但卡在同一个地方API调用返回的是静态文本没法自动触发搜索、查维基、扒视频链接。你写个提示词让它“去搜一下”它只会礼貌地告诉你“我无法访问互联网”。这不是模型的缺陷是架构设计的留白——它需要一个“手”而LangChain Tools就是这双手的骨骼与神经。这篇文章要带你亲手搭出这个“会自己查资料”的GPT模型。它不依赖ChatGPT Plus订阅不走网页UI纯Python代码驱动能同时调用Google、DuckDuckGo、Wikipedia和YouTube四大信息源且所有操作可复现、可调试、可嵌入生产系统。核心就一句话让大模型从“被动应答者”变成“主动调研员”。你给它一个问题它自己判断该查什么、去哪查、怎么整合结果最后交给你一段自然语言回答——整个过程像一个资深研究员在你面前边思考边操作。接下来我会拆解每一个环节的真实细节为什么选这四个工具而不是其他每个API背后的数据质量差异有多大如何避免维基百科返回三页无关内容当Google Serper返回一堆广告链接时该怎么过滤这些都不是文档里写的而是我在调试27个失败案例后记下的血泪笔记。2. 整体设计思路不是堆砌工具而是构建信息决策链很多人一上来就猛装工具库pip install完就急着跑demo结果发现模型要么乱用工具要么死活不用。根本原因在于没理解LangChain Tools的本质——它不是给模型加功能而是给它建一套“信息决策链”。这条链有三个不可跳过的环节意图识别→工具路由→结果熔炼。跳过任何一个环节你的“浏览能力”都会变成随机碰运气。2.1 意图识别让模型学会“读空气”模型不会天然知道“哈利·波特”该查维基还是Google。它依赖工具描述description里的关键词做语义匹配。比如我们给Wikipedia工具写的描述是“Useful when users request biographies or historical moments.” 这句话里藏着两个强信号词“biographies”和“historical moments”。当用户问“爱因斯坦生平”模型的embedding向量会和这两个词高度相似于是优先选择维基。但如果描述写成“Useful for looking up facts”那它就会和Google工具的“search in Google”描述打架导致路由混乱。我实测过12种描述写法最有效的是“动词领域限定条件”结构。比如YouTube工具的原始描述是“Useful for when the user explicitly asks you to look on Youtube.” 这里“explicitly asks”就是关键限定——它强制模型必须看到“youtube”“视频”“链接”等明确指令才触发避免把“讲讲量子力学”这种抽象问题也扔给YouTube。而Google工具我改成“Useful for time-sensitive queries requiring real-time data (e.g., news, stock prices, weather).” 加了“time-sensitive”和括号里的例子模型对时效性问题的响应准确率从63%提升到91%。提示别迷信默认描述。每个工具的description字段是你和模型之间的“暗号协议”必须用它最常遇到的用户提问句式来编写。建议收集你业务场景中真实的100条query统计高频动词和名词再反向定制description。2.2 工具路由四把钥匙开四扇不同的门为什么非得凑齐Google、DuckDuckGo、Wikipedia、YouTube这四个因为它们解决的是完全不同的信息需求就像医生不会用听诊器查CT片Google Serper解决“此刻正在发生什么”。它的优势是新闻聚合快、本地化强比如搜“北京今天限行”Google能返回交管局官网公告但缺点是广告多、摘要质量参差。我测试过对“昨日西班牙新闻”这类问题Google Serper的首屏结果里平均有3.2条广告必须靠后续的Observation清洗逻辑过滤。DuckDuckGo解决“隐私敏感型查询”。当你处理医疗、金融等敏感话题时DDG不追踪用户行为返回结果更中立。比如搜“抑郁症治疗副作用”Google可能推付费诊所广告而DDG直接返回NIMH美国国立卫生研究院的临床指南原文。但它对长尾问题召回率低搜“2023年Q3特斯拉电池良品率报告”基本无结果。Wikipedia解决“结构化事实确认”。人物生平、历史事件、科学概念的定义维基的编辑审核机制保证了基础事实的可靠性。但要注意维基页面标题必须和query严格匹配。搜“Harry Styles biography”能精准命中但搜“Harry Styles age”就会返回整页摘要需要额外的文本抽取逻辑。YouTube解决“非文本信息需求”。当用户要“看教程”“听演讲”“查演示”文字回答永远是二手信息。YouTube工具返回的是原始视频ID你可以用pytube库进一步提取字幕、时长、频道信息甚至做视频内容分析。这四个工具不是并列关系而是分层协作。我的路由策略是先用Wikipedia确认基础事实如人物、事件定义再用Google/DuckDuckGo补充时效性信息如最新进展、争议观点最后用YouTube提供多媒体佐证。这种顺序不是拍脑袋定的而是基于信息可信度金字塔——维基是基座新闻是中层视频是顶层表达。2.3 结果熔炼让模型学会“挑重点”工具返回的Observation往往是海量文本。Wikipedia可能返回5000字摘要Google Serper返回10个链接的标题描述。如果直接喂给LLM它会被噪声淹没。真正的难点在于如何把原始数据压缩成模型能消化的“高密度信息块”我的方案是在Agent执行链里插入预处理层。以Wikipedia为例原始返回包含多个同名页面Harry Styles、Debbie Harry、Harry Potter但模型只需要第一个。我写了个小函数def clean_wiki_observation(obs): # 只取第一个页面的Summary段落截断到前300字符 if Page: in obs: pages obs.split(Page:) first_page pages[1] if len(pages) 1 else pages[0] summary_start first_page.find(Summary:) if summary_start ! -1: summary first_page[summary_start10:].split(\n\n)[0] return summary[:300] ... return obs[:300]这个函数把5000字维基摘要压成300字精华同时规避了多义词干扰。同样Google Serper的Observation里充斥着“Missing: Yesterdays”这类无效标记我用正则re.sub(rMissing:.*?\|, , obs)一键清除。这些看似琐碎的清洗步骤实际决定了最终回答的质量下限——没有干净的输入再强的模型也是垃圾进垃圾出。3. 核心工具深度解析参数、陷阱与实操技巧光会pip install和import远远不够。每个工具背后都有隐藏参数、数据偏差和调用限制不摸清这些你的模型要么查不到东西要么查到一堆垃圾。下面是我踩坑后整理的硬核细节按工具分类展开。3.1 DuckDuckGo Search隐私守护者的双刃剑DuckDuckGo的Python库duckduckgo-search表面简单但有两个致命坑点第一结果数量控制失效。官方文档说DuckDuckGoSearchRun(num_results5)能限制返回条数实测发现它只控制请求参数不控制实际返回。我抓包发现即使设num_results1API仍返回10条只是后9条被库自动丢弃。这导致你误判工具性能。解决方案是改用底层DDGS类from duckduckgo_search import DDGS ddgs DDGS() # 真实控制返回条数 results ddgs.text(quantum computing basics, max_results3) # results是list每项含title、body、href第二中文搜索的编码陷阱。当query含中文时DuckDuckGoSearchRun.run()会把中文转成URL编码但DDG后端有时解码失败返回空结果。比如搜“人工智能发展史”编码后变成%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%8F%91%E5%B1%95%E5%8F%B2某些地区节点会返回400错误。绕过方法是手动解码后再传import urllib.parse def safe_ddg_search(query): # 先解码再搜索避免URL编码污染 decoded urllib.parse.unquote(query) return ddg_search.run(decoded)实操心得DDG最适合查技术概念、学术术语、小众产品。我对比过100个query它对“Transformer架构原理”“Rust borrow checker”这类问题的准确率比Google高22%因为不掺杂商业推广。但千万别用它查人名、地名——搜“张伟”会返回中国姓名大全、张伟律师所、张伟食品公司毫无上下文。3.2 Google Serper低成本但高门槛的实时情报源Serper.dev的API key申请看似简单但有三个隐藏门槛第一免费额度陷阱。官网说“100次/天免费”但实际是按“请求次数”计费不是“结果条数”。一次google_search.run(latest AI news)算1次但如果你在Agent里连续调用3次不同query就消耗3次额度。更坑的是当结果为空时如搜错别字它仍计费1次。我曾因调试时query拼错一天烧光50次额度。第二结果排序玄学。Serper返回的organic列表默认按Google排序但这个排序受地域、设备、历史行为影响。我在东京IP搜“iPhone 15发布日期”首条是苹果官网用洛杉矶IP搜首条是TechCrunch评测。为保稳定必须强制指定gl国家码和hl语言码google_search GoogleSerperAPIWrapper( glus, # 固定美国节点 hlen, # 固定英文界面 kyour_api_key )第三广告过滤黑科技。Serper返回的ads字段包含付费推广但organic里也混着软广。我观察到含“best”“top 10”“review”字样的标题大概率是软文。于是写了过滤规则def filter_serper_ads(results): filtered [] for r in results.get(organic, []): title r.get(title, ).lower() # 屏蔽明显软文标题 if any(word in title for word in [best, top 10, review, vs]): continue # 保留含官网、白皮书、GitHub的链接 if any(domain in r.get(link, ) for domain in [github.com, docs.google.com, arxiv.org]): filtered.append(r) return filtered[:3] # 只取前三条高质量结果注意Serper对新闻类query有特殊优化加q“news”参数能强制返回新闻源。比如google_search.run(Tesla Q2 earnings news)不如google_search.run(Tesla Q2 earnings site:reuters.com)精准后者直接锁定路透社。3.3 Wikipedia结构化知识的金矿与迷宫Wikipedia工具的问题不在API而在维基自身的数据结构。WikipediaQueryRun默认返回全文摘要但维基页面有三大坑第一消歧义页面泛滥。搜“Java”返回的可能是编程语言、印尼岛屿、咖啡豆。WikipediaAPIWrapper会自动跳转到消歧义页但WikipediaQueryRun不处理。解决方案是预查消歧义from wikipedia import search, page def smart_wiki_search(query): # 先搜关键词取第一个结果通常最相关 titles search(query, results1) if not titles: return No Wikipedia page found. try: # 获取页面内容只取摘要 p page(titles[0]) return p.summary[:500] ... except Exception as e: return fWikipedia error: {str(e)}第二多语言版本错配。WikipediaAPIWrapper默认调用英文维基但用户query是中文时返回结果常是机翻烂尾。比如搜“深圳地铁”英文维基只有两行介绍。必须动态切语言import locale def auto_lang_wiki(query): # 根据系统语言或query检测语言 lang zh if any(\u4e00 c \u9fff for c in query) else en wrapper WikipediaAPIWrapper(langlang) return WikipediaQueryRun(api_wrapperwrapper)第三引用缺失的真相。维基摘要常省略数据来源。比如“2023年全球碳排放量”只写数字不标IPCC报告页码。生产环境必须追加引用检查def wiki_with_citations(page_title): p page(page_title) # 提取参考文献部分 refs p.references if hasattr(p, references) else [] return { summary: p.summary[:400], references: refs[:3] # 只取前3个权威引用 }3.4 YouTube不只是视频链接更是内容指纹YouTubeSearchTool返回的只是videoId但真正价值在于用这个ID挖出深层信息。我封装了一个增强版工具from youtube_search import YoutubeSearch import re class EnhancedYouTubeTool: def __init__(self): self.max_results 5 def run(self, query): # 用youtube-search库获取真实结果比LangChain原生版更准 results YoutubeSearch(query, max_resultsself.max_results).to_dict() videos [] for r in results: # 提取视频ID从url中 video_id re.search(rwatch\?v([^]), r[url_suffix]) if video_id: videos.append({ title: r[title], channel: r[channel], duration: r[duration], url: fhttps://www.youtube.com/watch?v{video_id.group(1)}, views: r[views] }) return str(videos[:3]) # 返回前3个高质量视频这个版本能返回播放量、时长、频道名让模型判断“哪个视频更权威”。比如搜“PyTorch tutorial”返回的视频里官方PyTorch频道的播放量120万而个人博主的只有2万模型自然优先推荐前者。4. 实操全流程从零搭建可运行的浏览型GPT现在把所有碎片组装成完整工作流。以下代码经过生产环境验证支持Python 3.9无需修改即可运行。我会逐行解释关键设计意图不只是贴代码。4.1 环境准备与依赖管理先解决最痛的依赖冲突问题。LangChain更新频繁langchain0.1.0和langchain0.2.0的API完全不同。我锁定经测试的稳定组合# 创建隔离环境强烈推荐 python -m venv langchain-browse-env source langchain-browse-env/bin/activate # Linux/Mac # langchain-browse-env\Scripts\activate # Windows # 安装精确版本避免自动升级破坏兼容性 pip install openai1.35.0 \ langchain0.1.16 \ duckduckgo-search4.2.0 \ google-serp-api1.1.0 \ wikipedia1.4.0 \ youtube-search2.1.0 \ pydantic2.6.4 # LangChain 0.1.x 依赖此版本注意pydantic版本必须是2.6.4。新版pydantic 2.7会导致LangChain初始化报错ValidationError: Input should be a valid dictionary这是已知兼容性bug。4.2 工具链初始化带健康检查的工厂模式把工具初始化封装成工厂函数加入自动健康检查避免运行时才发现API失效import os from langchain.tools import Tool from langchain.utilities import GoogleSerperAPIWrapper, WikipediaAPIWrapper from langchain.tools import DuckDuckGoSearchRun, YouTubeSearchTool from wikipedia import exceptions def create_tools(): tools [] # 1. DuckDuckGo自带健康检查 try: ddg DuckDuckGoSearchRun() # 测试能否返回结果 test_result ddg.run(test) if test in test_result.lower(): tools.append(Tool( nameDuckDuckGo Search, funcddg.run, descriptionUseful for privacy-focused searches. Returns concise summaries., )) print(✓ DuckDuckGo tool ready) except Exception as e: print(f✗ DuckDuckGo failed: {e}) # 2. Google Serper检查API key有效性 serper_key os.getenv(SERPER_API_KEY) if serper_key: try: google GoogleSerperAPIWrapper( glus, hlen, kserper_key ) # 发送测试请求 test google.run(test) if test and len(test) 10: tools.append(Tool( nameGoogle Search, funcgoogle.run, descriptionUseful for time-sensitive queries (news, stock, weather). Filtered for reliability., )) print(✓ Google Serper tool ready) except Exception as e: print(f✗ Google Serper failed: {e}) # 3. Wikipedia检查连接和语言 try: wiki_wrapper WikipediaAPIWrapper(langen) # 测试基础功能 wiki_tool Tool( nameWikipedia Search, funclambda q: wiki_wrapper.run(q)[:400], # 截断防超长 descriptionUseful for verified biographies, historical events, and scientific concepts., ) # 预热查一个确定存在的页面 wiki_tool.func(Albert Einstein) tools.append(wiki_tool) print(✓ Wikipedia tool ready) except exceptions.DisambiguationError: print(✓ Wikipedia disambiguation handled) except Exception as e: print(f✗ Wikipedia failed: {e}) # 4. YouTube轻量级测试 try: yt YouTubeSearchTool() # 测试是否能返回ID result yt.run(machine learning tutorial) if https://www.youtube.com/watch?v in result: tools.append(Tool( nameYouTube Search, funcyt.run, descriptionUseful for finding authoritative video tutorials and talks. Returns direct links., )) print(✓ YouTube tool ready) except Exception as e: print(f✗ YouTube failed: {e}) return tools # 调用工厂函数 tools create_tools() print(f✅ Loaded {len(tools)} working tools)这段代码的价值在于它会在启动时告诉你哪个工具挂了而不是等到用户提问时才报错。生产环境必须有这种前置校验否则半夜告警全是“工具调用失败”。4.3 Agent配置Zero-shot ReAct的深度调优initialize_agent的默认参数在生产环境会出大问题。以下是经过压力测试的调优配置from langchain.agents import initialize_agent, AgentType from langchain.llms.openai import OpenAI import openai # 配置OpenAI关键设置超时和重试 openai.api_key os.getenv(OPENAI_API_KEY) llm OpenAI( model_namegpt-3.5-turbo-0125, # 用新版修复旧版token bug temperature0.3, # 降低随机性保证结果稳定 max_tokens1024, # 防止过长响应 request_timeout30, # 关键避免卡死 max_retries2 # 自动重试应对网络抖动 ) # 构建Agent重点参数解析 agent initialize_agent( toolstools, llmllm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, # 必须用此类型 verboseTrue, # 开发期必开看推理链 handle_parsing_errorsTrue, # 自动处理LLM输出格式错误 max_iterations15, # 防止无限循环重要 early_stopping_methodgenerate, # 到时间就停不硬等 return_intermediate_stepsTrue, # 返回中间步骤用于debug )为什么max_iterations15是黄金值我做过实验设5次复杂问题如“对比2023年中美AI芯片政策”常因工具调用不足而失败设20次模型会在无效工具间反复横跳比如连续3次用YouTube搜政策文件。15次是成功率和耗时的最优平衡点。4.4 生产级调用封装带日志和降级的执行器直接调agent.run()在生产环境是自杀行为。必须包装成健壮执行器import logging from datetime import datetime # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(browse_agent.log), logging.StreamHandler() ] ) def browse_executor(query: str, timeout: int 60) - dict: 生产级浏览执行器 返回结构化结果含原始响应、工具调用记录、耗时 start_time datetime.now() try: # 添加超时保护防止LLM卡死 import signal class TimeoutError(Exception): pass def timeout_handler(signum, frame): raise TimeoutError(Agent execution timed out) signal.signal(signal.SIGALRM, timeout_handler) signal.alarm(timeout) # 执行Agent result agent.run(query) # 取消超时 signal.alarm(0) end_time datetime.now() duration (end_time - start_time).total_seconds() # 记录日志 logging.info(fQUERY: {query} | RESULT: {result[:50]}... | TIME: {duration:.2f}s) return { success: True, result: result, query: query, duration: duration, timestamp: end_time.isoformat() } except TimeoutError as e: logging.error(fTIMEOUT on query {query}: {e}) return {success: False, error: timeout, query: query} except Exception as e: logging.error(fERROR on query {query}: {e}) # 降级返回工具列表说明 fallback I can search using Google, Wikipedia, DuckDuckGo, or YouTube. Please rephrase your question. return {success: False, error: str(e), fallback: fallback} finally: # 清理信号 signal.alarm(0) # 使用示例 if __name__ __main__: # 测试三个典型场景 test_queries [ What is the current price of Bitcoin?, Explain quantum entanglement like Im 10, Show me the TED Talk Your Body Language May Shape Who You Are ] for q in test_queries: print(f\n Testing: {q}) res browse_executor(q) if res[success]: print(f✅ Result: {res[result]}) else: print(f❌ Failed: {res[error]})这个执行器解决了生产环境四大痛点超时保护、错误归因、日志追踪、降级策略。特别是降级设计——当所有工具都失效时它不返回空而是告诉用户“我能用哪些工具”把故障转化为服务提示。5. 常见问题与排查技巧实录那些文档里不会写的真相在部署到公司内部知识库的两周里我记录了37个真实故障案例。这里精选最典型的5个附带根因分析和一行代码修复方案。5.1 问题模型疯狂调用同一工具陷入死循环现象用户问“马斯克最近在做什么”Agent连续5次调用Google Search每次返回不同新闻但始终不生成Final Answer。根因分析ReAct框架要求模型在Thought阶段明确写出“I now know the final answer”。但当Google返回的新闻摘要太长2000字符GPT-3.5-turbo的上下文窗口被占满模型没空间写Thought只能不断重复Action。解决方案在工具返回后强制截断Observation# 修改Agent的tool_chain添加截断逻辑 from langchain.agents.agent import AgentExecutor class TruncatedAgentExecutor(AgentExecutor): def _get_next_action(self, full_inputs: dict): # 在调用工具前截断输入 if input in full_inputs: full_inputs[input] full_inputs[input][:500] # 限制query长度 return super()._get_next_action(full_inputs) def _call_tool(self, tool_input: str): # 在接收Observation后截断 result super()._call_tool(tool_input) return result[:1500] # Observation不超过1500字符5.2 问题中文query触发英文工具返回乱码现象搜“杭州亚运会奖牌榜”Wikipedia返回英文页面摘要Google返回英文新闻。根因分析LangChain工具默认使用英文API端点未根据query语言动态切换。WikipediaAPIWrapper的lang参数需显式设置。解决方案写一个语言检测中间件from langdetect import detect def auto_language_tool(query: str): try: lang detect(query) if lang zh: return { wikipedia: WikipediaAPIWrapper(langzh), google: GoogleSerperAPIWrapper(glcn, hlzh), ddg: DuckDuckGoSearchRun() } else: return { wikipedia: WikipediaAPIWrapper(langen), google: GoogleSerperAPIWrapper(glus, hlen), ddg: DuckDuckGoSearchRun() } except: return {wikipedia: WikipediaAPIWrapper(langen), ...} # 在Agent初始化前调用 tools create_tools_for_language(auto_language_tool(user_query))5.3 问题YouTube工具返回空结果但实际有视频现象搜“Python装饰器教程”YouTubeSearchTool.run()返回空字符串。根因分析LangChain的YouTubeSearchTool使用过时的youtube-search-python库其API已失效。新版本返回JSON旧版期望XML。解决方案替换为原生YouTube Data API需申请keyimport requests def youtube_data_api_search(query: str, api_key: str): url https://www.googleapis.com/youtube/v3/search params { part: snippet, q: query, type: video, maxResults: 3, key: api_key, videoDuration: medium # 排除短视频 } response requests.get(url, paramsparams) if response.status_code 200: items response.json().get(items, []) videos [] for item in items: vid_id item[id][videoId] title item[snippet][title] videos.append(f{title} → https://youtu.be/{vid_id}) return \n.join(videos) return No videos found. # 注册为新工具 tools.append(Tool( nameYouTube Data API, funclambda q: youtube_data_api_search(q, YOUTUBE_API_KEY), descriptionReliable YouTube search using official API. Returns video titles and links. ))5.4 问题Google Serper返回403错误但key有效现象同一个API key在本地运行正常在服务器上返回403 Forbidden。根因分析Serper.dev会根据请求头中的User-Agent和Origin判断是否为爬虫。服务器默认User-Agent是python-requests/2.28.1被识别为自动化脚本。解决方案伪造浏览器请求头from langchain.utilities import GoogleSerperAPIWrapper class BrowserSerperWrapper(GoogleSerperAPIWrapper): def _make_request(self, url: str, payload: dict) - dict: headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Origin: https://serper.dev, Referer: https://serper.dev/ } response requests.post(url, jsonpayload, headersheaders) return response.json() # 使用自定义Wrapper google BrowserSerperWrapper(kSERPER_API_KEY)5.5 问题Agent在verboseFalse时返回空但verboseTrue时正常现象关闭verbose后agent.run()返回None或空字符串。根因分析LangChain 0.1.x的bug当verboseFalse时AgentExecutor的_call方法会跳过结果赋值逻辑直接返回None。解决方案强制覆盖返回逻辑from langchain.agents.agent import AgentExecutor original_call AgentExecutor._call def patched_call(self, inputs, callbacksNone, **kwargs): result original_call(self, inputs, callbacks, **kwargs) # 修复空返回 if result is None or result : return I couldnt find an answer. Please try rephrasing your question. return result AgentExecutor._call patched_call6. 进阶扩展从浏览到自主研究的跃迁路径做到这一步你已经有了一个可靠的“信息检索员”。但真正的价值在于让它进化成“自主研究员”。以下是三条已被验证的升级路径按实施难度排序6.1 路径一私有知识库接入1小时可上线把公司Wiki、Confluence或Notion数据库接入只需三步from langchain.document_loaders import NotionDirectoryLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma # 1. 加载私有文档 loader NotionDirectoryLoader(path/to/notion/pages) docs loader.load() # 2. 分块关键按语义切分不是固定长度 text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50, separators[\n\n, \n, 。, , , , , ] ) splits text_splitter.split_documents(docs) # 3. 构建向量库并注册为工具 vectorstore Chroma.from_documents(splits, OpenAIEmbeddings()) retriever vectorstore.as_retriever(search_kwargs{k: 3}) # 封装为工具 def private_knowledge_search(query: str): docs retriever.get_relevant_documents(query) return \n\n.join([fSource: {d.metadata.get(source, unknown)}\n{d.page_content[:200]}... for d in docs]) tools.append(Tool( nameInternal Knowledge Base, funcprivate_knowledge_search, descriptionSearch internal company documents, wikis, and handbooks. Use for policy, procedure, or product questions. ))6.2 路径二多跳推理Multi-hop Reasoning让模型能串联多个工具。例如“对比2023年特斯拉和比亚迪的电池技术路线”需先查特斯拉技术白皮书再查比亚迪专利最后对比。标准ReAct不支持需改用Plan-and-ExecuteAgentfrom langchain.agents import PlanAndExecute, load_chat_planner, load_step_executor planner load_chat_planner(llm) executor load_step_executor(llm, tools) agent PlanAndExecute(plannerplanner, executorexecutor, verboseTrue) # 现在可以处理复杂query agent.run(What are the top 3 differences between Teslas 4680 battery and BYDs Blade Battery?)6.3 路径三结果验证闭环Self-Verification最高阶能力模型对自身答案进行可信度验证。例如当它说“某政策2024年4月1日生效”自动调用Google查政府官网公告确认。这需要自定义Agentclass VerifyingAgent: def __init__(self, base_agent, verification_tools): self.base_agent base_agent self.verification_tools verification_tools def run(self,

相关文章:

用LangChain Tools打造会自主查资料的GPT模型

1. 项目概述:为什么你需要一个“会自己查资料”的GPT模型?我第一次在ChatGPT里输入“2024年巴黎奥运会新增了哪些比赛项目?”时,得到的回复是:“我的训练数据截止于2021年9月,无法提供2024年的最新信息。”…...

DIY红外热像仪进阶:手把手教你用C语言实现7种伪彩色编码(附完整代码)

DIY红外热像仪进阶:手把手教你用C语言实现7种伪彩色编码(附完整代码) 当32x24的温度矩阵在屏幕上呈现为单调的灰度图像时,你是否想过如何让它焕发生机?伪彩色编码技术正是打开这扇门的钥匙。本文将带你深入探索七种经…...

FPGA调试实录:我的SPI Master模块为什么读不到数据?常见问题排查指南

FPGA调试实录:SPI Master模块数据读取失败的深度排查指南 当你的SPI Master模块在调试过程中突然"罢工",示波器上的波形看似正常却始终无法读取数据时,那种挫败感每个硬件工程师都深有体会。本文将从实战角度出发,分享一…...

哪个降AI软件好?2026年4款主流降AI工具按场景对位横评!

哪个降AI软件好?2026年4款主流降AI工具按场景对位横评! 「哪个降 AI 软件好」没有标准答案。学生最常踩的坑是把这个问题简化成「哪款最便宜」或者「哪款最有效」——其实好不好用看你的场景。学校送知网严标准、送维普重灾区、自媒体被判 AI、本科双重问…...

如何在无GPU群晖设备上开启完整AI相册功能:Synology Photos面部识别终极指南

如何在无GPU群晖设备上开启完整AI相册功能:Synology Photos面部识别终极指南 【免费下载链接】Synology_Photos_Face_Patch Synology Photos Facial Recognition Patch 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_Photos_Face_Patch 还在为DS918…...

降AI提示词大全!10个prompt让AI输出人类味+嘎嘎降AI兜底!

降AI提示词大全!10个prompt让AI输出人类味嘎嘎降AI兜底! 用 ChatGPT、DeepSeek、Kimi、豆包写论文最大的痛是:写得快但被检测判 AI、改起来比自己写还累。其实在写作环节就能预防一部分 AI 痕迹,靠的是会写降 AI 提示词。 这篇先给…...

知网AI率80%降到15%教程,比话降AI知网算法专精+售后保障!

知网AI率80%降到15%教程,比话降AI知网算法专精售后保障! 如果你是硕博毕业生、学校送知网检测、答辩前查出 AI 率 80%——这篇文章直接给你完整操作教程。从「拿到 80% 报告」到「学校送审通过」的完整路径,每一步该做什么、花多少时间、花多…...

Android HWASan 详解:硬件标记原理、Clang 启用与排障实践

Android HWASan 详解:硬件标记原理、Clang 启用与排障实践 HWASan(Hardware-assisted AddressSanitizer)是面向 AArch64 的一类 Native(C/C)内存错误检测机制:利用指针与内存区域上的 短标签(T…...

Claude技能生态构建指南:从Awesome清单到实战开发

1. 项目概述:为什么我们需要一个“Claude技能”的Awesome清单?如果你最近也在深度使用Claude,尤其是Claude Desktop或者API,你可能会和我有一样的感受:这家伙的能力边界,似乎每天都在被开发者们用各种“技能…...

树莓派4B + MPU9250:从零到一搭建你的第一个姿态传感器(附完整代码与避坑指南)

树莓派4B与MPU9250实战:从硬件连接到姿态解算的全流程指南 1. 准备工作与环境搭建 1.1 硬件清单与连接指南 在开始之前,我们需要准备以下硬件组件: 树莓派4B(建议4GB内存版本)MPU9250九轴传感器模块杜邦线(…...

从零到一:联想小新Air14 2020锐龙版Windows 10重装实战指南

1. 为什么需要重装系统? 最近有不少朋友跟我吐槽,说用了两年的联想小新Air14 2020锐龙版越来越卡,开机要等半天,打开个文档都要转圈圈。这种情况我太熟悉了,作为一个帮朋友修过不下20台同款机型的老司机,我…...

从入门到精通:Systrace性能分析实战指南

1. Systrace入门:认识Android性能分析利器 第一次打开Systrace报告时,我完全被那些彩色线条和条形图搞懵了。这玩意儿看起来就像地铁线路图一样复杂,但别担心,它其实是Android开发者最得力的性能分析助手。Systrace是Android SDK自…...

5步掌握Betaflight 2025升级:从配置到飞行的完整解决方案

5步掌握Betaflight 2025升级:从配置到飞行的完整解决方案 【免费下载链接】betaflight Open Source Flight Controller Firmware 项目地址: https://gitcode.com/gh_mirrors/be/betaflight 还在为穿越机飞行抖动和信号不稳定而烦恼吗?Betaflight …...

从零到上手:用LDAP Browser连接和管理你的OpenLDAP服务器(Windows平台实战)

从零到上手:用LDAP Browser连接和管理你的OpenLDAP服务器(Windows平台实战) 在企业级身份认证体系中,LDAP(轻量级目录访问协议)扮演着核心角色。许多技术团队虽然已经部署了OpenLDAP服务端,却苦…...

保姆级教程:用EEGLAB搞定脑电数据预处理,从导入到ICA去伪迹全流程避坑

零基础EEGLAB脑电预处理全流程:从数据导入到ICA去伪迹实战指南 当你第一次打开EEGLAB界面,面对密密麻麻的菜单选项和看似复杂的参数设置,是否感到无从下手?作为脑电研究的第一步,数据预处理的质量直接决定后续分析的可…...

大模型长文档理解新拐点已至(2026年Claude专项能力解密):支持128K上下文+动态摘要锚点+引用溯源追踪

更多请点击: https://intelliparadigm.com 第一章:大模型长文档理解新拐点已至:Claude 2026能力演进全景图 随着长上下文窗口突破200万token、原生支持跨页语义锚定与结构化元数据感知,Claude 2026标志着大模型对长文档的理解正式…...

2026 年 Redis 面试题全解析:原理 + 实战 + 高频考点

Redis 高频面试题全解析(2026 最新版) Redis 作为后端开发高并发、高可用架构的核心组件,是面试中必问的核心考点。本文从基础入门、核心原理、高并发实战、高可用架构、进阶运维五大模块,整理大厂高频面试题与标准答案&#xff…...

AC鸭的训练分组

题目描述 AC鸭准备参加一次训练营,一共有 n 个训练项目,第 i 个项目需要花费 ai​ 分钟。 训练老师要求 AC鸭按顺序完成所有项目,并且可以把这些项目分成不超过 m 组。每一组必须是连续的一段项目,同一组项目在同一天完成。 AC…...

CANN/asc-devkit FreeAllEvent API文档

FreeAllEvent 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.c…...

AC鸭的温度墙

题目描述AC鸭在实验室里看到了一面很长的温度墙,这面墙从左到右一共有 n 个位置。一开始,每个位置的温度都是 0。接下来 AC鸭会进行 m 次加热操作。每次操作给出 l,r,v表示把第l个位置到第r个位置的温度都加上上v。所有操作结束后,AC鸭想知道…...

【Portal实战指南】STEP 7 Basic许可证丢失排查与一键修复

1. 问题现象与紧急处理 当你满心欢喜地打开TIA Portal准备开始一天的工作,突然弹出一个令人窒息的提示框:"找不到许可证STEP 7 Basic"。这种情况我遇到过不下十次,每次都能让工程师血压瞬间飙升。别慌,我们先来快速判断…...

AI Agent自动化修复GitHub Issue:从问题定位到PR提交全流程解析

1. 项目概述:一个能自动修复GitHub Issue并提交PR的AI技能 最近在折腾AI编程助手的时候,发现了一个挺有意思的东西,叫 issue-to-pr 。简单来说,这玩意儿是一个AI Agent的“技能包”,你把它装在你的AI编程工具&#…...

Zotero Duplicates Merger:5分钟搞定文献库重复问题

Zotero Duplicates Merger:5分钟搞定文献库重复问题 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 还在为Zotero文献库中堆积如山…...

Topit:突破macOS窗口层级限制,打造极致高效的多任务工作流

Topit:突破macOS窗口层级限制,打造极致高效的多任务工作流 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 想象一下这样的场景&#xff…...

如果你的消费观和价值观不一致,就会产生“花钱买后悔“的内耗:你的钱花对了吗?

消费观与价值观 目录 消费观与价值观 一、核心定义与层级关系 1. 价值观:人生的"底层操作系统" 2. 消费观:价值观在金钱领域的"应用程序" 二、底层原理逻辑:从进化到社会 1. 价值观的形成原理:三重塑造 2. 消费观的运行原理:价值兑换模型 3. 为什么会…...

3分钟快速解锁网易云音乐NCM格式:ncmdump音频解密工具完全指南

3分钟快速解锁网易云音乐NCM格式:ncmdump音频解密工具完全指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲,却发现只能在特定客户端播放,无法在其他设…...

CANN/ge 图引擎资源释放

aclgrphBuildFinalize 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Tens…...

可口可乐AI印相私密工作流首次公开(含内部CMYK预置包、罐体反光建模提示词库与印刷出血校准表)

更多请点击: https://intelliparadigm.com 第一章:可口可乐AI印相私密工作流的起源与战略价值 可口可乐AI印相私密工作流并非源于通用大模型的简单套用,而是其全球数字创新实验室在2022年启动的“Project Chroma”中孵化出的端到端隐私增强…...

CANN/asc-devkit矢量取倒数API

asc_rcp 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/ca…...

pcb设计-器件:二极管

一、二极管的介绍 伏安特性曲线 二、二极管的整流功能 由于二极管存在导通压降以及反向截止的特性,对于交流电压,反向电压全部被截止,正向电压的最大值会距离峰值会有0.7v的压降。 在交流电路中,二极管限制了电容不能放电&#xf…...