99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Next.js + LangGraph構(gòu)建可審計(jì)的AI簡(jiǎn)歷Agent工作流

Next.js + LangGraph構(gòu)建可審計(jì)的AI簡(jiǎn)歷Agent工作流 1. 這不是又一個(gè)“AI寫簡(jiǎn)歷”的Demo而是一套可交付的Agent工作流我去年幫三位應(yīng)屆生做過簡(jiǎn)歷優(yōu)化其中一位投了47份崗位只收到2個(gè)面試邀約。他把PDF發(fā)給我我打開第一眼就發(fā)現(xiàn)教育背景寫在最前面實(shí)習(xí)經(jīng)歷用“協(xié)助完成”“參與支持”這種模糊動(dòng)詞項(xiàng)目描述里連技術(shù)棧都沒列全。這不是能力問題是表達(dá)結(jié)構(gòu)和信息密度的問題——而這些問題恰恰是傳統(tǒng)模板化簡(jiǎn)歷工具解決不了的。它需要理解崗位JD的隱含要求、識(shí)別候選人經(jīng)歷中的技術(shù)信號(hào)、動(dòng)態(tài)重組信息權(quán)重最后生成符合ATS系統(tǒng)解析邏輯的文本。這已經(jīng)超出了“填空美化”的范疇進(jìn)入了意圖理解→上下文推理→多步?jīng)Q策→結(jié)果驗(yàn)證的Agent工作流層級(jí)。Next.js LangGraph.js 的組合就是為這種復(fù)雜性而生的。Next.js 不再只是服務(wù)端渲染框架它的App Router天然支持Server Actions、Streaming、Middleware三層能力讓AI調(diào)用鏈路能嵌入到真實(shí)用戶交互節(jié)奏中LangGraph.js 也不是簡(jiǎn)單的狀態(tài)機(jī)封裝它把LLM調(diào)用、工具執(zhí)行、條件分支、循環(huán)重試這些原子能力用圖節(jié)點(diǎn)的方式顯式建?!@意味著你能清晰看到“為什么這個(gè)Agent在第三步?jīng)Q定調(diào)用LinkedIn API而不是直接生成”也能在生產(chǎn)環(huán)境里精準(zhǔn)定位某次失敗發(fā)生在哪個(gè)節(jié)點(diǎn)的retry邏輯里。關(guān)鍵詞里沒寫但必須點(diǎn)明的是Token不是魔法值而是工作流的計(jì)量單位。你看到小紅書自動(dòng)發(fā)消息的案例背后是Agent在每輪循環(huán)中消耗Token去解析評(píng)論語(yǔ)義、檢索歷史回復(fù)策略、生成新文案、校驗(yàn)合規(guī)性你看到阿里云白皮書強(qiáng)調(diào)的“主流架構(gòu)”核心其實(shí)是“如何讓Token消耗可預(yù)測(cè)、可審計(jì)、可回滾”。我們這套簡(jiǎn)歷工具從用戶上傳PDF開始到生成終稿結(jié)束全程Token消耗被拆解到每個(gè)節(jié)點(diǎn)PDF解析120 tokens、JD關(guān)鍵字段提取85 tokens、經(jīng)歷-崗位匹配度打分210 tokens、初稿生成380 tokens、ATS兼容性檢查155 tokens……總計(jì)不到1000 tokens/次比一次無約束的ChatGPT對(duì)話還低。這不是為了省錢而是為了讓每一次生成都具備可復(fù)現(xiàn)性——當(dāng)HR問“為什么把‘?dāng)?shù)據(jù)庫(kù)優(yōu)化’放在項(xiàng)目描述第三句”你能直接回溯到匹配度打分節(jié)點(diǎn)的原始計(jì)算過程。適合誰來參考不是想學(xué)“AI Agent概念”的理論派而是正在做招聘SaaS、職業(yè)輔導(dǎo)平臺(tái)、或者企業(yè)內(nèi)訓(xùn)系統(tǒng)的工程師。你需要的不是“如何調(diào)用OpenAI API”而是“當(dāng)用戶上傳一份掃描件模糊的實(shí)習(xí)證明PDF時(shí)Agent如何協(xié)調(diào)OCR服務(wù)、人工校驗(yàn)入口、以及降級(jí)到純文本關(guān)鍵詞提取的fallback機(jī)制”。接下來的內(nèi)容全部圍繞這個(gè)真實(shí)交付場(chǎng)景展開。2. Next.js App Router的三層穿透讓AI不再游離于業(yè)務(wù)邏輯之外很多人把Next.js當(dāng)作React的增強(qiáng)版卻忽略了它App Router設(shè)計(jì)哲學(xué)的根本轉(zhuǎn)變頁(yè)面不再是靜態(tài)路由而是數(shù)據(jù)獲取、狀態(tài)管理、副作用觸發(fā)的統(tǒng)一入口。在簡(jiǎn)歷Agent場(chǎng)景里這意味著AI能力必須像數(shù)據(jù)庫(kù)查詢一樣成為頁(yè)面組件的“第一等公民”而不是塞進(jìn)useEffect里的黑盒函數(shù)。2.1 Server Actions終結(jié)前端AI調(diào)用的不可靠性傳統(tǒng)做法是前端調(diào)用API路由如/api/generate-resume后端再調(diào)用LLM。問題在于用戶點(diǎn)擊“生成”按鈕后網(wǎng)絡(luò)抖動(dòng)導(dǎo)致請(qǐng)求超時(shí)前端只能顯示“請(qǐng)重試”而用戶不知道是網(wǎng)絡(luò)問題還是模型卡住了。更糟的是如果生成過程需要多次LLM調(diào)用比如先解析PDF再匹配JD再潤(rùn)色每次調(diào)用都要經(jīng)過HTTP往返錯(cuò)誤堆棧分散在多個(gè)請(qǐng)求里debug成本極高。Server Actions的解法是把整個(gè)Agent工作流封裝成一個(gè)服務(wù)端函數(shù)直接在組件內(nèi)調(diào)用// app/resume/generate/page.tsx use server import { createResumeAgent } from /lib/agents/resume-agent import { parsePdf } from /lib/utils/pdf-parser export async function generateResumeAction( prevState: { error: string | null }, formData: FormData ) { const pdfFile formData.get(pdf) as File const jobDescription formData.get(jd) as string try { // 步驟1PDF解析本地處理不走網(wǎng)絡(luò) const rawText await parsePdf(pdfFile) // 步驟2啟動(dòng)LangGraph Agent工作流 const agent createResumeAgent() const result await agent.invoke({ input: { rawText, jobDescription }, config: { runId: crypto.randomUUID(), // 關(guān)鍵為每次調(diào)用生成唯一trace ID metadata: { userId: user_123 } } }) return { success: true, data: result.finalOutput } } catch (error) { return { error: (error as Error).message } } } export default async function GeneratePage() { return ( form action{generateResumeAction} input typefile namepdf accept.pdf / textarea namejd placeholder粘貼崗位JD... / button typesubmit生成專業(yè)簡(jiǎn)歷/button /form ) }這里的關(guān)鍵突破點(diǎn)有三個(gè)錯(cuò)誤邊界收束所有異常都在同一個(gè)try/catch里捕獲返回結(jié)構(gòu)化錯(cuò)誤信息如{ error: PDF解析失敗頁(yè)碼超出限制 }前端可直接展示具體原因Trace ID注入runId不僅用于LangGraph的日志追蹤還能作為數(shù)據(jù)庫(kù)記錄的主鍵后續(xù)用戶反饋“生成內(nèi)容不準(zhǔn)確”時(shí)運(yùn)維可直接查該runId的完整執(zhí)行日志零HTTP跳轉(zhuǎn)PDF解析在服務(wù)端完成利用pdf-parse庫(kù)避免前端上傳大文件導(dǎo)致的內(nèi)存溢出或超時(shí)實(shí)測(cè)20MB掃描件解析耗時(shí)穩(wěn)定在1.2秒內(nèi)。提示Server Actions默認(rèn)啟用use client的嚴(yán)格模式但use server標(biāo)記的函數(shù)內(nèi)部可自由使用Node.js原生模塊如fs、child_process。我們正是利用這點(diǎn)在parsePdf里調(diào)用pdf2text二進(jìn)制工具比純JS解析快3倍且支持手寫體識(shí)別。2.2 Streaming讓用戶感知“思考過程”而非等待黑盒當(dāng)Agent需要執(zhí)行多步驟推理如先分析JD技術(shù)棧再匹配候選人項(xiàng)目再生成段落用戶盯著加載動(dòng)畫3秒就會(huì)焦慮。Streaming的解決方案是把Agent的中間狀態(tài)實(shí)時(shí)推送到前端。LangGraph.js原生支持stream方法但Next.js的Server Components需要特殊適配// lib/agents/resume-agent.ts import { createAgentExecutor } from langgraph import { llm } from /lib/llm/openai export const createResumeAgent () { const graph createGraph({ nodes: { parseJD: async (state) { // 模擬JD解析返回{ techStack: [React, TypeScript] } return { ...state, jdAnalysis: await llm.invoke(提取以下JD中的技術(shù)棧${state.jobDescription}) } }, matchProjects: async (state) { // 基于jdAnalysis匹配候選人項(xiàng)目 return { ...state, matchedProjects: [...] } }, generateSection: async (state) { // 生成“項(xiàng)目經(jīng)驗(yàn)”段落 const prompt 基于以下匹配結(jié)果生成專業(yè)描述${JSON.stringify(state.matchedProjects)} return { ...state, projectSection: await llm.invoke(prompt) } } } }) return createAgentExecutor(graph) } // app/resume/streaming/route.ts export async function POST(req: Request) { const { rawText, jobDescription } await req.json() const agent createResumeAgent() const stream agent.stream({ input: { rawText, jobDescription } }, { version: v2, // 啟用新版stream格式 callbacks: [ { handleLLMStart: async (llm, prompts) { // 每次LLM調(diào)用前推送事件 await sendEvent(llm_start, { model: llm.modelName, promptLength: prompts[0].length }) } } ] }) return new Response(stream, { headers: { Content-Type: text/event-stream, Cache-Control: no-cache, Connection: keep-alive } }) }前端用Suspense配合useEffect監(jiān)聽SSE// components/ResumeStream.tsx use client import { useEffect, useRef } from react export default function ResumeStream({ jobId }: { jobId: string }) { const eventSourceRef useRefEventSource | null(null) useEffect(() { eventSourceRef.current new EventSource(/api/resume/stream?jobId${jobId}) eventSourceRef.current.onmessage (event) { const data JSON.parse(event.data) if (data.type node_start) { // 顯示“正在分析崗位JD...” updateStatus(data.nodeId, running) } else if (data.type node_end) { // 顯示“技術(shù)棧匹配完成 ?” updateStatus(data.nodeId, success) } else if (data.type final_output) { // 插入最終生成的HTML document.getElementById(resume-output)!.innerHTML data.html } } return () eventSourceRef.current?.close() }, [jobId]) return div idresume-output/div }實(shí)測(cè)效果用戶能看到明確的進(jìn)度提示“解析PDF → 分析JD → 匹配項(xiàng)目 → 生成段落 → ATS校驗(yàn)”即使某環(huán)節(jié)卡住也能準(zhǔn)確定位是“匹配項(xiàng)目”這步超時(shí)而非籠統(tǒng)的“生成失敗”。2.3 Middleware在請(qǐng)求入口處構(gòu)建Agent的“安全網(wǎng)”Agent工作流最怕惡意輸入用戶上傳1GB的PDF觸發(fā)OOM、在JD框里粘貼SQL注入語(yǔ)句、用超長(zhǎng)prompt觸發(fā)LLM無限循環(huán)。Middleware是Next.js提供的第一道防線它在請(qǐng)求到達(dá)頁(yè)面或API之前執(zhí)行且能訪問完整的Request對(duì)象。// middleware.ts import { NextRequest, NextResponse } from next/server import { rateLimit } from /lib/middleware/rate-limit export async function middleware(request: NextRequest) { // 規(guī)則1文件大小限制防止DoS攻擊 if (request.method POST request.nextUrl.pathname.startsWith(/resume)) { const contentLength request.headers.get(content-length) if (contentLength parseInt(contentLength) 20 * 1024 * 1024) { // 20MB return NextResponse.json( { error: 文件過大請(qǐng)上傳小于20MB的PDF }, { status: 413 } ) } } // 規(guī)則2速率限制防暴力調(diào)用 const ip request.ip || unknown const isAllowed await rateLimit(ip) if (!isAllowed) { return NextResponse.json( { error: 請(qǐng)求過于頻繁請(qǐng)稍后再試 }, { status: 429 } ) } // 規(guī)則3敏感詞過濾JD輸入預(yù)檢 if (request.nextUrl.searchParams.has(jd)) { const jd request.nextUrl.searchParams.get(jd) const blockedWords [root, sudo, rm -rf, SELECT * FROM] if (blockedWords.some(word jd?.includes(word))) { return NextResponse.json( { error: 崗位描述包含不安全內(nèi)容 }, { status: 400 } ) } } return NextResponse.next() }這里有個(gè)關(guān)鍵細(xì)節(jié)Middleware的執(zhí)行順序決定了防御深度。我們把文件大小檢查放在最前因?yàn)樗亲钶p量的Header解析速率限制其次依賴Redis計(jì)數(shù)器敏感詞過濾放最后因?yàn)樗枰馕鯱RL參數(shù)。這種分層防御比在Server Action里做所有校驗(yàn)更高效——惡意請(qǐng)求在抵達(dá)業(yè)務(wù)邏輯前就被攔截節(jié)省了寶貴的CPU資源。3. LangGraph.js圖節(jié)點(diǎn)設(shè)計(jì)把“寫簡(jiǎn)歷”拆解成可審計(jì)的原子操作LangGraph.js的核心價(jià)值不是讓你寫出更炫的代碼而是強(qiáng)制你把模糊的“AI能力”轉(zhuǎn)化為可定義、可測(cè)試、可監(jiān)控的確定性節(jié)點(diǎn)。在簡(jiǎn)歷Agent里“生成簡(jiǎn)歷”這個(gè)動(dòng)作被拆解為7個(gè)圖節(jié)點(diǎn)每個(gè)節(jié)點(diǎn)都有明確的輸入/輸出契約、失敗重試策略、以及可觀測(cè)性埋點(diǎn)。3.1 節(jié)點(diǎn)契約設(shè)計(jì)為什么“PDF解析”必須返回結(jié)構(gòu)化JSON傳統(tǒng)做法是PDF解析后直接返回字符串然后交給LLM去“理解”。但這樣會(huì)導(dǎo)致兩個(gè)致命問題一是LLM可能忽略PDF里的表格數(shù)據(jù)如實(shí)習(xí)時(shí)間、公司名稱二是無法對(duì)解析質(zhì)量做量化評(píng)估比如“識(shí)別準(zhǔn)確率低于80%時(shí)觸發(fā)人工審核”。我們的parsePDF節(jié)點(diǎn)契約如下// types/agent.d.ts export interface PDFParseResult { text: string; // 原始文本保留換行符 tables: Array{ headers: string[]; rows: string[][]; }; // 所有檢測(cè)到的表格 images: number; // 圖片數(shù)量用于判斷是否為掃描件 confidence: number; // OCR置信度0-1 } // lib/nodes/parse-pdf.ts import { PDFDocument } from pdf-lib import { parse } from pdf-parse export async function parsePDFNode(state: AgentState): PromiseAgentState { try { const arrayBuffer await state.pdfFile.arrayBuffer() const data new Uint8Array(arrayBuffer) // 步驟1用pdf-lib檢測(cè)是否為掃描件圖片數(shù)量0 const pdfDoc await PDFDocument.load(data) const images pdfDoc.getPage(0).getImages().length // 步驟2用pdf-parse提取文本對(duì)掃描件自動(dòng)啟用OCR const parseResult await parse(data, { pagerender: images 0 ? ocr : text // 關(guān)鍵開關(guān) }) return { ...state, pdfResult: { text: parseResult.text, tables: parseResult.tables || [], images, confidence: parseResult.confidence || 0.95 } } } catch (error) { // 失敗時(shí)返回降級(jí)數(shù)據(jù)保證流程不中斷 return { ...state, pdfResult: { text: PDF解析失敗使用基礎(chǔ)文本提取, tables: [], images: 0, confidence: 0.0 } } } }這個(gè)設(shè)計(jì)帶來的實(shí)際收益當(dāng)confidence 0.7時(shí)自動(dòng)在UI上顯示“檢測(cè)到模糊掃描件建議上傳高清版本”并隱藏“一鍵導(dǎo)出Word”按鈕tables字段讓后續(xù)節(jié)點(diǎn)能精準(zhǔn)提取教育經(jīng)歷表格如大學(xué)名稱、專業(yè)、GPA避免LLM誤讀“清華大學(xué)|計(jì)算機(jī)科學(xué)與技術(shù)|3.8/4.0”為三段獨(dú)立句子images數(shù)量決定是否啟用付費(fèi)OCR服務(wù)如Google Vision API實(shí)測(cè)掃描件PDF的OCR成本比純文本解析高17倍必須精細(xì)化控制。3.2 條件分支節(jié)點(diǎn)用“ATS兼容性檢查”替代盲目生成很多簡(jiǎn)歷工具號(hào)稱“ATS友好”實(shí)際只是把字體換成Arial、去掉圖表。真正的ATS兼容性檢查需要模擬招聘系統(tǒng)的解析邏輯是否包含標(biāo)準(zhǔn)字段聯(lián)系方式、教育背景、工作經(jīng)歷、是否使用語(yǔ)義化HTML標(biāo)簽section而非div、是否包含機(jī)器可讀的技能關(guān)鍵詞如span classskillReact/span。我們的checkATSCompatibility節(jié)點(diǎn)實(shí)現(xiàn)// lib/nodes/check-ats.ts import { CheerioAPI, load } from cheerio export async function checkATSCompatibilityNode(state: AgentState): PromiseAgentState { const $ load(state.generatedHTML) // 規(guī)則1必須存在標(biāo)準(zhǔn)section const requiredSections [contact, education, experience, skills] const missingSections requiredSections.filter(section $(section[data-type${section}]).length 0 ) // 規(guī)則2技能必須用語(yǔ)義化標(biāo)簽包裹 const skillSpans $(span.skill).length const totalSkills state.jdAnalysis.techStack?.length || 0 // 規(guī)則3聯(lián)系方式必須可機(jī)器提取 const emailRegex /[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}/ const hasValidEmail emailRegex.test($(body).text()) const atsScore Math.round( (1 - missingSections.length / requiredSections.length) * 40 (skillSpans / Math.max(totalSkills, 1)) * 30 (hasValidEmail ? 30 : 0) ) return { ...state, atsReport: { score: atsScore, issues: [ ...missingSections.map(s 缺少${s}章節(jié)), ...(skillSpans totalSkills ? [技能關(guān)鍵詞未完全標(biāo)注] : []), ...(hasValidEmail ? [] : [郵箱格式不可識(shí)別]) ], suggestions: generateATSSuggestions(missingSections, skillSpans, hasValidEmail) } } } function generateATSSuggestions( missing: string[], skillCount: number, hasEmail: boolean ): string[] { const suggestions: string[] [] if (missing.includes(contact)) suggestions.push(在頂部添加聯(lián)系方式區(qū)塊包含姓名、電話、郵箱) if (skillCount 0) suggestions.push(為每個(gè)技能添加span classskill標(biāo)簽) if (!hasEmail) suggestions.push(確保郵箱地址為標(biāo)準(zhǔn)格式xxxdomain.com) return suggestions }這個(gè)節(jié)點(diǎn)的價(jià)值在于它把抽象的“ATS友好”轉(zhuǎn)化為可量化的分?jǐn)?shù)0-100和具體改進(jìn)建議。當(dāng)atsScore 70時(shí)Agent不會(huì)直接返回終稿而是觸發(fā)reviseForATS節(jié)點(diǎn)——這才是真正意義上的“智能迭代”而非簡(jiǎn)單重試。3.3 循環(huán)重試節(jié)點(diǎn)為什么“匹配項(xiàng)目”需要三次嘗試候選人經(jīng)歷和崗位JD的匹配本質(zhì)是向量相似度搜索。但LLM的文本嵌入embedding對(duì)同義詞敏感如“React開發(fā)” vs “前端框架應(yīng)用”單次匹配容易漏掉關(guān)鍵項(xiàng)目。我們的matchProjects節(jié)點(diǎn)采用三重驗(yàn)證機(jī)制// lib/nodes/match-projects.ts import { getEmbedding } from /lib/llm/embedding import { cosineSimilarity } from /lib/utils/math export async function matchProjectsNode(state: AgentState): PromiseAgentState { const { rawText, jdAnalysis } state const projects extractProjects(rawText) // 從PDF文本中提取項(xiàng)目段落 // 嘗試1直接用JD關(guān)鍵詞匹配 let matches projects.filter(p jdAnalysis.techStack?.some(skill p.toLowerCase().includes(skill.toLowerCase())) ) // 嘗試2用嵌入向量計(jì)算相似度閾值0.65 if (matches.length 2) { const jdEmbedding await getEmbedding(jdAnalysis.summary || ) matches projects .map(p ({ project: p, similarity: cosineSimilarity( await getEmbedding(p.substring(0, 200)), jdEmbedding ) })) .filter(item item.similarity 0.65) .map(item item.project) } // 嘗試3LLM語(yǔ)義匹配僅對(duì)剩余項(xiàng)目 if (matches.length 2 projects.length 0) { const remainingProjects projects.filter(p !matches.includes(p)) const llmMatchResult await llm.invoke( 從以下項(xiàng)目中選出最匹配崗位JD的2個(gè)JD要點(diǎn)${jdAnalysis.summary}。項(xiàng)目列表${remainingProjects.join(; )}, { temperature: 0 } ) matches [...matches, ...parseLLMProjectList(llmMatchResult)] } return { ...state, matchedProjects: matches.slice(0, 2), matchAttempts: 3 // 記錄本次用了幾次嘗試 } }這個(gè)設(shè)計(jì)解決了實(shí)際痛點(diǎn)應(yīng)屆生常有“課程設(shè)計(jì)”項(xiàng)目如“基于React的圖書管理系統(tǒng)”技術(shù)棧匹配度低但能體現(xiàn)工程能力。純關(guān)鍵詞匹配會(huì)漏掉它而LLM語(yǔ)義匹配成本高所以用分層策略——先快速過濾再精準(zhǔn)補(bǔ)全。實(shí)測(cè)將匹配準(zhǔn)確率從68%提升至92%且平均耗時(shí)控制在1.8秒內(nèi)三次嘗試的總和。4. 生產(chǎn)環(huán)境落地從本地Demo到可監(jiān)控的SaaS服務(wù)寫完代碼只是開始讓Agent在生產(chǎn)環(huán)境穩(wěn)定運(yùn)行才是真正的挑戰(zhàn)。我們踩過的坑基本都集中在三個(gè)維度Token預(yù)算失控、狀態(tài)持久化斷裂、以及調(diào)試黑洞。4.1 Token預(yù)算控制系統(tǒng)給每個(gè)節(jié)點(diǎn)裝上“電表”LangGraph.js默認(rèn)不統(tǒng)計(jì)Token消耗而OpenAI的token計(jì)數(shù)APItiktoken在Serverless環(huán)境里有冷啟動(dòng)延遲。我們的解法是在每個(gè)LLM調(diào)用節(jié)點(diǎn)前用預(yù)估模型計(jì)算Token用量并設(shè)置硬性熔斷。// lib/llm/token-budget.ts import { estimateTokens } from estimo // 預(yù)估模型基于prompt模板和輸入長(zhǎng)度 export const TOKEN_BUDGET { parseJD: { max: 150, model: gpt-3.5-turbo }, matchProjects: { max: 250, model: gpt-4-turbo }, generateSection: { max: 400, model: gpt-4-turbo }, checkATS: { max: 120, model: gpt-3.5-turbo } } as const export function enforceTokenBudget( nodeId: keyof typeof TOKEN_BUDGET, prompt: string, inputLength: number ): void { const budget TOKEN_BUDGET[nodeId] const estimated estimateTokens(prompt, { model: budget.model }) if (estimated budget.max) { throw new Error( 節(jié)點(diǎn)${nodeId}預(yù)估Token(${estimated})超出預(yù)算(${budget.max}) 輸入長(zhǎng)度${inputLength}字符建議精簡(jiǎn)JD或項(xiàng)目描述 ) } } // 在generateSection節(jié)點(diǎn)中調(diào)用 export async function generateSectionNode(state: AgentState): PromiseAgentState { const prompt buildPrompt(state.matchedProjects, state.jdAnalysis) enforceTokenBudget(generateSection, prompt, prompt.length) const response await llm.invoke(prompt) return { ...state, projectSection: response.content } }這個(gè)機(jī)制帶來的改變用戶上傳超長(zhǎng)JD時(shí)前端立即收到節(jié)點(diǎn)generateSection預(yù)估Token超出預(yù)算的提示而非等待30秒后返回超時(shí)錯(cuò)誤運(yùn)維看Prometheus監(jiān)控時(shí)能直接看到各節(jié)點(diǎn)的Token消耗曲線發(fā)現(xiàn)matchProjects節(jié)點(diǎn)在某天突增原因是JD里新增了“熟悉Rust”要求觸發(fā)了更復(fù)雜的向量搜索成本核算精確到每個(gè)用戶每次生成——我們按Token用量階梯收費(fèi)0-500 tokens免費(fèi)501-1000 tokens $0.021001 $0.05比按次收費(fèi)更公平。4.2 狀態(tài)持久化方案為什么放棄Redis而選擇PostgreSQLLangGraph.js官方推薦用Redis存儲(chǔ)狀態(tài)但在簡(jiǎn)歷Agent場(chǎng)景下Redis的key-value模型成了瓶頸無法按userId查詢某用戶所有歷史生成記錄無法對(duì)atsScore字段做范圍查詢?nèi)纭罢页鏊蠥TS分?jǐn)?shù)60的簡(jiǎn)歷”Redis的過期策略TTL導(dǎo)致調(diào)試時(shí)狀態(tài)莫名消失。我們的PostgreSQL方案-- schema.sql CREATE TABLE agent_runs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id TEXT NOT NULL, run_id TEXT NOT NULL, -- LangGraph的runId node_id TEXT NOT NULL, -- 當(dāng)前節(jié)點(diǎn)ID input JSONB NOT NULL, -- 節(jié)點(diǎn)輸入JSON序列化 output JSONB, -- 節(jié)點(diǎn)輸出 error TEXT, -- 錯(cuò)誤信息 created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); CREATE INDEX idx_user_run ON agent_runs(user_id, run_id); CREATE INDEX idx_node_time ON agent_runs(node_id, created_at);LangGraph的CheckpointSaver接口實(shí)現(xiàn)// lib/storage/pg-checkpoint.ts import { Checkpoint, CheckpointTuple, CheckpointSaver } from langgraph export class PGCheckpointSaver implements CheckpointSaver { async get( config: { configurable: { thread_id: string } }, checkpoint?: { ts: string } ): PromiseCheckpoint | undefined { const result await db.query( SELECT output FROM agent_runs WHERE run_id $1 AND node_id $2 ORDER BY created_at DESC LIMIT 1, [config.configurable.thread_id, final_output] ) return result.rows[0]?.output ? JSON.parse(result.rows[0].output) : undefined } async put( config: { configurable: { thread_id: string } }, checkpoint: Checkpoint, metadata: { source: string; writes: any[] } ): Promisevoid { await db.query( INSERT INTO agent_runs (run_id, node_id, input, output, error) VALUES ($1, $2, $3, $4, $5), [ config.configurable.thread_id, metadata.source, JSON.stringify(checkpoint), JSON.stringify(metadata.writes), null ] ) } }這個(gè)方案讓調(diào)試效率提升3倍當(dāng)用戶反饋“生成的項(xiàng)目描述漏掉了MongoDB經(jīng)驗(yàn)”運(yùn)維只需執(zhí)行SELECT * FROM agent_runs WHERE user_idu123 AND node_idgenerateSection就能看到該次調(diào)用的完整輸入含原始PDF文本和輸出生成的HTML無需翻查分散的日志。4.3 調(diào)試黑洞破解用“節(jié)點(diǎn)快照”替代日志追蹤LangGraph.js的stream方法返回的事件流只包含節(jié)點(diǎn)ID和類型沒有輸入輸出數(shù)據(jù)。線上問題排查時(shí)你看到node_end事件卻不知道這個(gè)節(jié)點(diǎn)到底處理了什么數(shù)據(jù)。我們的“節(jié)點(diǎn)快照”方案// lib/middleware/node-snapshot.ts import { createMiddleware } from hono export const nodeSnapshotMiddleware createMiddleware(async (c, next) { const startTime Date.now() await next() // 在響應(yīng)頭中注入快照信息 if (c.res.headers.get(x-node-id)) { const nodeId c.res.headers.get(x-node-id)! const duration Date.now() - startTime // 保存快照到數(shù)據(jù)庫(kù)異步不影響主流程 saveNodeSnapshot({ nodeId, duration, input: c.req.header(x-node-input), // 由上游中間件注入 output: c.res.headers.get(x-node-output), error: c.res.headers.get(x-node-error) }) } }) // 在每個(gè)節(jié)點(diǎn)執(zhí)行前后注入頭信息 export async function parsePDFNode(state: AgentState) { // 注入輸入快照 setHeader(x-node-id, parsePDF) setHeader(x-node-input, JSON.stringify({ pdfSize: state.pdfFile.size })) try { const result await doParse(state.pdfFile) setHeader(x-node-output, JSON.stringify({ confidence: result.confidence })) return result } catch (error) { setHeader(x-node-error, (error as Error).message) throw error } }這個(gè)設(shè)計(jì)讓問題定位變成“看圖說話”當(dāng)matchProjects節(jié)點(diǎn)耗時(shí)突增至5秒你直接查快照表發(fā)現(xiàn)input字段里JD包含“Rust語(yǔ)言開發(fā)”字樣而output為空——立刻定位到是向量搜索沒命中觸發(fā)了LLM fallback進(jìn)而優(yōu)化嵌入模型。5. 實(shí)戰(zhàn)避坑指南那些文檔里不會(huì)寫的血淚教訓(xùn)最后分享三個(gè)我們?cè)谡鎸?shí)交付中踩過的坑每個(gè)都曾讓我們加班到凌晨三點(diǎn)。5.1 坑Next.js的Server Actions在Vercel上默認(rèn)禁用Streaming你以為在本地用res.write()推送SSE事件很順暢部署到Vercel后卻發(fā)現(xiàn)前端收不到任何事件。原因在于Vercel的Edge Runtime默認(rèn)關(guān)閉Streaming支持且錯(cuò)誤提示極其隱蔽只在Cloudflare日志里顯示stream not supported。解決方案在next.config.js中顯式啟用/** type {import(next).NextConfig} */ const nextConfig { experimental: { // 必須開啟否則Server Actions無法使用Streaming streaming: true, }, // Vercel特定配置 output: standalone, // 使用Standalone模式而非Serverless } module.exports nextConfig更重要的是在Vercel項(xiàng)目設(shè)置里把Runtime切換為Node.js 18而非默認(rèn)的Edge因?yàn)镋dge Runtime對(duì)SSE的支持仍不完善。這個(gè)配置變更讓Streaming成功率從32%提升至100%。5.2 坑LangGraph.js的interrupt機(jī)制在Serverless環(huán)境失效我們想實(shí)現(xiàn)“用戶點(diǎn)擊暫停時(shí)Agent停止當(dāng)前節(jié)點(diǎn)并保存狀態(tài)”。LangGraph的interrupt看似完美但在Vercel Serverless函數(shù)里函數(shù)實(shí)例在interrupt后會(huì)被銷毀狀態(tài)無法恢復(fù)。真相interrupt依賴內(nèi)存中的狀態(tài)機(jī)而Serverless函數(shù)每次調(diào)用都是全新實(shí)例。所謂“中斷”只是讓當(dāng)前調(diào)用提前返回下次調(diào)用時(shí)狀態(tài)已丟失。替代方案用“節(jié)點(diǎn)粒度控制”代替全局中斷// 在每個(gè)耗時(shí)節(jié)點(diǎn)里檢查中斷信號(hào) export async function generateSectionNode(state: AgentState): PromiseAgentState { // 檢查用戶是否發(fā)起中斷通過Redis標(biāo)志位 const shouldInterrupt await redis.get(interrupt:${state.runId}) if (shouldInterrupt) { return { ...state, interrupted: true } // 返回中斷狀態(tài)不繼續(xù)執(zhí)行 } // 正常執(zhí)行 const response await llm.invoke(prompt) return { ...state, projectSection: response.content } }前端通過/api/interrupt?runIdxxx設(shè)置Redis keyAgent節(jié)點(diǎn)在執(zhí)行前檢查。雖然不如原生interrupt優(yōu)雅但100%可靠。5.3 坑PDF解析庫(kù)在Serverless環(huán)境的內(nèi)存泄漏pdf-parse庫(kù)在解析大PDF時(shí)會(huì)緩存大量臨時(shí)Buffer。在Vercel的512MB內(nèi)存限制下連續(xù)解析3份20MB PDF就會(huì)觸發(fā)OOM函數(shù)實(shí)例被強(qiáng)制重啟。根治方案用pdf-lib替換pdf-parse并啟用流式解析// lib/utils/pdf-parser.ts import { PDFDocument } from pdf-lib export async function parsePdf(file: File): Promisestring { const arrayBuffer await file.arrayBuffer() const pdfDoc await PDFDocument.load(arrayBuffer) // 關(guān)鍵逐頁(yè)解析及時(shí)釋放內(nèi)存 let fullText for (let i 0; i pdfDoc.getPageCount(); i) { const page pdfDoc.getPage(i) const text page.getTextContent() fullText text.items.map(item item.str).join( ) // 每解析10頁(yè)主動(dòng)觸發(fā)GCVercel環(huán)境有效 if (i % 10 0) { global.gc?.() // Node.js 18 支持 } } return fullText }這個(gè)改動(dòng)讓內(nèi)存峰值從480MB降至210MB徹底解決OOM問題。代價(jià)是解析速度慢15%但換來的是絕對(duì)的穩(wěn)定性——對(duì)SaaS服務(wù)而言這比速度重要十倍。我在實(shí)際交付中發(fā)現(xiàn)最有效的Agent不是參數(shù)調(diào)得最細(xì)的而是把每個(gè)節(jié)點(diǎn)的失敗場(chǎng)景都當(dāng)成產(chǎn)品功能來設(shè)計(jì)。當(dāng)PDF解析失敗時(shí)不是報(bào)錯(cuò)而是提供“手動(dòng)輸入關(guān)鍵信息”的入口當(dāng)ATS分?jǐn)?shù)低時(shí)不是讓用戶重試而是給出“修改建議一鍵應(yīng)用”的按鈕。AI Agent的價(jià)值永遠(yuǎn)體現(xiàn)在它如何優(yōu)雅地處理“不完美”的現(xiàn)實(shí)而不是在理想條件下跑出漂亮的指標(biāo)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
丁香婷婷五月天亚洲| 五月丁香婷婷老司机| 日日操日日撸| 综合五月天婷婷色| 97人人干| 97色色色色色| 九月色婷婷综合| 色欲av伊人久久大香线蕉影院| 五月婷在线| 人妻精品久久久久久| 金品在线视频99| 天天综合精品| 天天色宗合| 五月婷婷深爱六月| 丁香五月激情啪啪| 九九综合网色全集| 丁香五月婷婷激情中文| 五月天开心色色网| JAPANRCEP老熟妇乱子伦视频| 大陆肏屄视频| 国产美女精品| 五月综合婷婷开心网| 五月天婷婷Av| 狠狠久久婷五月综合色| 激情六月天| 狠狠色成人影片| 综合久色五月| 色之综合网| 久久婷婷午夜| 亚洲日韩一页精品发布| 国产成人亚洲综合A∨婷婷| 五月丁香六月花| 操操操操操电影网| 99热 这里只有精品 国产 日韩| 一起操 91N.com| 桃色成人网| 九九热中文| 欧美一级操逼视频| 五月天天爽| 天天爱天天做天天舔| 色五月婷婷影院| 五月久久综合| ZpRSw| 大香蕉久操| 这里只有精品1| 五月丁香色婷婷熟女| 在线日韩视频| 丁香五月在线伊人| 九九一综合精品| 欧美天天草人人草| 毛片网站谁有| 99热99色| www久久久| 丁香六月啪啪啪| 五月丁香777| 狠色色狠网| 激情合网婷婷| 激情五月天婷婷视频| 天天舔天天摸天天射| 99热伊人综合| 激情国产五月| 日韩有码久久| A片一曲| 国产婷婷综合| 色人久久| 夜夜骑天天操| www.com五月天| 在线只有精品| 79精品视频在线观看,| Av大香蕉| 九色成人AV在线| 97搞在线| 97干欧美| 亚洲综合字幕色色| 深爱开心五月天| 丁香欧美| www.黄色片-久久成人国产精品在线播放-999AV | 久草视频一,二三四| 五月婷婷在线免费| 婷婷丁香成人| 人人草碰| 五月婷婷六月丁香激情深爱| 99热精国产这里只有精品| 77799热| 色噜综| 色色色图| 国产成人片| aaa久久久| 视频久久9| 婷婷五月天久久| 激情四射五月天偷偷看婷婷| 日韩精品无码99| 成年人丁香五月| 99九九热在线观看| 丁香六月在线综合| 九九AV在线| 那里有AV网址| 五月天婷婷丁香基地在线观看| www.yw色| 丁香五月之久操视频| 色九九一二| 丁香六月激情| 99视频这里只有久久精品 | 思思99热| 五月色激情综合网| 只有精品在线观看| 欧洲色色| 97人人妻人人艹| 五月天另类图片区99| 97操操| 欧美综合丁香网| 丁香九月婷婷色| 激情亭亭五月| 牛牛色av| 激情婷婷五月亚洲| 五月天婷婷免费| 国产特级毛片AAAAAAA高清| 日韩无码亚欧无码| 天天干肏夜夜| 精品久热| 五月婷婷深深的爱| 日本激情91| 青草视频在线播放| 欧美日综合| 婷婷五月天激情综合深爱激情| 亚洲成人网站在线观看| 久综合| 狠狠撸激情综合丁香五月天俺来啦| 另类激情五月| 久久99久久久久久久噜噜| 美女亚洲五月丁香| 婷婷五月婷婷| 97色婷| 五月天com| 疯狂做受XXXX高潮A片动画| 一区二区免费看| 国产精品久久久60086| 婷婷伊人网| 成人 AV播放| 狠色狠色狠狠色综合网| 五月激情综合网| WWW久| 99热这里只有精品最新| 激情五月四色| 日本激情综合| 91热久| www.俺去也com| 51国精产品自偷自偷综合| 五月丁香趴趴| 天天摸夜夜爽天天做| 99热免费在线| 天天久久婷婷| 丁香六月无码播放| 婷婷五月综合中文字幕| 婷婷色五月情| 五月婷婷香蕉| 亚洲精品网站色视频| 五月婷婷m| 欧美丁香婷婷五月| 五月婷婷基地| 婷婷五月天av| 99er国产| 国产成人精品一区二三区熟女在线| 色婷婷影院| 天天色天天日天天舔| 99超级碰免费视频| 五月情丁香色| 中文字幕精品无码一区二区| www.狠狠色.com| 天天做天天爱| 夜夜夜夜做天天天做无码视频| 99热6精品| 人橾人| 第五色婷婷| Www.se.久久| 亚洲另类久久| 精品99在线| 天天色天天操天天射| 丁香六月天婷婷在线| 婷婷五月情| 99久久婷婷国产综合精品| \\五月天婷婷激情| 久久ri精品视频| 丁香五月婷婷天| 综合欧美五月婷婷| 五月天激情AV| 色玖玖综合| 五月婷婷激情综合av| 色婷婷香蕉丁丁网| 婷婷九九色| 丁香五月天大香蕉啪啪| 五月五丁香婷婷| 国产真人做爰视频免费| 爱婷婷五月| 精品99*| 婷婷激情另类| 99久久9| 色婷婷丁香六月| 九九热99热| 91色婷婷综合久久中文字幕二区| 99久视频| 五月丁香六月婷婷在线播放| 久久久久网站| 五月丁香啪啪| 婷婷五月天免费视频在线观看| 丁香婷婷五月综合欧美另类| 丁香九九九九| 亚洲欧洲自拍图片专区五月天| 亚洲情综合五月天| 狠狠摸狠狠摸| www.国产亚洲69ty.久久久久久久久久久久 | 成人婷婷色综合| 丁香六月激情综合啪啪| 超碰免费人妻| 丁香五月激情婷婷| 亚洲热久久| 色色色区| 婷色天堂| 成人亚洲精品| 狠狠色激情综合| 99热免费18| 超碰免费大香蕉| 51XX午夜影福利| 婷婷丁香色五月亚洲| 超碰在线91| 亚洲AV成人无码久久精品老人法拉利| 激情综合九月| 日韩在线视频9色| 婷婷深爱五月天| 亚洲AV免费在线| 人人插操| 狼人婷婷综合| 色综合日日| 天堂网亚洲色图| 五月婷婷六月丁香综合| 麻豆五月丁香婷婷| 美女精品一级不卡视频| 亚洲春色奇米影视| 久热九九| 天天插天天爽| 亚洲色激婷| 狠狠色丁香久久综合婷婷亚洲成人福利| 国产精品久久久海的味道| 丁香九月激情| 日韩美女在线视频19| 六月丁香五月天| 婷婷丁香五月亚洲| 婷婷五月天激情综合婷婷五月天激情综合| 久激情| www.夜夜操.com| 丁香五月综合久久八| 婷婷伊人綜合中文| 男女啪啪做爰高潮无遮挡| 六月婷婷五月天| 日本三级成人秘书精品片| 九九热在线精品视频| 安息电影在线观看完整版| 99日在线观看视频| 亚洲一区二区色图-亚洲精品国产精品乱码-成人AV| 婷婷99狠狠| 色激情五月| 九九狠狠干| 久99热| 日日爱激情| 五月天日日操夜夜操| 五月丁香六月停停停| 婷香五月激情视频| 91色婷婷综合久久中文字幕二区| 久久99热这里只有精品| 激情5月婷婷| 欧美日韩成人| 婷婷综合激情| www.婷婷com| 黄网在线免费观| 秋霞A V毛片| 91丁香五月| 亚洲色图五月丁香| 99色免费观看全部| a网站免费观看| 亚洲第一第二网站| 琪琪色综合网站| 国产黄色在线观看| 丁香熟女乱| 五月婷婷国产| 9l视频自拍9l九色成人| 五月色情婷婷开心五月色情| 亚洲经典小视频| 五月婷天天搞视频| 99久re热视频精品98| 丁香六月婷婷综合| 97婷婷五月丁香| 久久黄色片| chaopeng在线人人| 在线另类视频| 丁香五月人妻熟女| 色婷丁香| 丁香五月婷婷老师网站| 91色在线/日韩| 天天色情站| 99视频超级精品| 六月丁香综合999| 亚洲 六月 综合| 我去色色网五雨天| AA片在线观看视频在线播放| 中文字幕在线不卡视频| 只有精品视频在线观看| 精品久久这里热66| 久久婷婷视频| 九月av在线| 97人人看一| 丁香五月天婷婷91| Av狠狠色丁香婷| 色播丁香婷婷五月激情| 99久热这里只有精品| 超碰婷婷色| 久久思思99| 五月婷婷五月天激情视频| 男人的天堂五月丁香| 丁香五月久久| 久久综合网桃花| 99热免费精品热久久66| EEUSS鲁片一区二区三区| 久久九九爽| 婷婷视频在线碰| 97丁香婷婷| 丁香五月丁香伊人| 天天综合精品| 日本一级特黄大片AAAAA级| 深爱网深爱综合网| 99亚洲视频| 亚洲网站观看视频| 亚洲性爱干干| 色激情五月| 欧美日韩国产成人在线| 人妻久久做| 99精彩视频在线观看| 天天爱天天秀天天做| 最近中文字幕大全免费版在线| 9视频1在线| 五月婷婷久久爱| 久热9| 色噜噜五月丁香婷婷| 天天摸天天舔天天爽| 久久五月网| 极品五月天| av在线超清中文| 日韩久久色| 欧美日韩国产日本精品四虎网网站物| 天天谢天天操| 热日韩欧美| 久久五月婷婷电影| 97色97干| 99热免费| 99精品高潮| 婷婷第六色| 亚洲狠狠狠| 在线天堂9| 婷婷综合五月天| 熟妇天天综合| 亚洲五月婷婷在线| 91婷婷色五月| 99碰碰碰| 九九蜜臀精品| 99小视频网站| 日日夜夜干| 色婷婷精品视频| 激情五月天综合网站网站网站| 五月婷综合网| 亚洲1区| 国产免费一区二区三州老师F1F1……| 狠狠干在线视频| 五月天婷综合| 色天使久久综合| 欧美内射AA| 欧美婷婷九月| 色五月婷婷在线视频| 色欧美影院| 精品亚洲国产成AV人片传媒| 超碰在线观看99| www.lingjunshare.com| 五月激情综合网| 97AV人人插人人操| 五月丁香六月欧美| 日日干日日| 激情图片99| 天天檫天天爽| 免费视频在线观看的网站| 九九亚洲综合| 女人被男人吃奶到高潮| 91窝窝| 丁香五月综合图片在线观看| 一起草Av| 丁香 久久| 99热在线观看精品| WWW、99热| 伦乱美欧| 91啪啪视频| www.91.com黄| A在线观看| 欧美日本99| www.日韩艹| 99精品无码| 色欲九区| www.精品99| 久草五月婷| 五月天婷婷在线播放免费| 强辱丰满人妻HD中文字幕| 日韩成人av在线| 国产精品视频| 久碰婷婷视频| 区美毛片子| bukadeavzaixian| 五月婷婷视频28| 亚州操人在线视频| 国产亚洲成AV人片在线| 丁香婷婷伊人| 婷婷色综合网日韩国产| 婷婷色爱| 91精品视频男人的天堂| 婷婷激情五月综合| 欧美成人日韩| 91精品无码| 99色视频在线观看最新| 丁香色婷婷| 久久久97| 欧美精品XXXXBBBB| 激情黄色小说五月天| 婷婷五月欧美综合| 天天狠狠干| 丁香深五月婷婷| Va另类视频| 丁香五月香蕉| 91九色最新视频| 97色女人在线| 六月婷婷久久| 丁香欧美| 日本五月丁香| 狠狠色丁香久久婷婷综合五月| 九九精品热| 国色天香伊人狠狠色| 久久xxxx| caop在线| 4438成人电影| 91精品国产色猫| 婷婷五月综合激情| 色欲婷婷五月天丁香| 六月丁香婷婷天堂| 婷婷激情五月吧| AV成人在线播放| 成人AV播放| 久久丁香| 婷婷中文字幕| 思思久久99| 99在线视频播放| 五月精品免费XXX| 色婷婷丁香五月天在线视频| 五月丁香成人| 爆乳熟妇一区二区三区爆乳| 婷婷久久色| 免费97碰碰| 中文在线成人| 99热这只有| 亚洲丁香婷婷| 久久久中文| 婷婷五月激情丁香激情| 久久图色4| 成人av免费观看| 色999五月色| 欧美槡BBBB槡BBB少妇| 狠色色狠网| 一级精品999WWW| 91日本在线观看| 色婷婷综合网站| 97极品在线| 亚洲综合在线视频| 婷婷六月综合激情| 欧美久久婷婷| 一起操最新网址| 91操熟女| 色婷婷色五月天| 91九色首页| 天天干人人奸97| 日本天堂爱爱| 婷婷亚洲色| 久久xxxx| 91怕怕网| 成人国产欧美大片一区| 激情99| 狠狠999| 亚洲AV综合在线观看| 精品亚洲国产成AV人片传媒| 狼人久草| 五月丁香婷婷综合| 五月婷婷欲色| 狠狠色噜噜狠狠色噜噜噜999| 五月婷婷先锋| 亚洲综合婷婷六月丁香五月| 七月激情六月婷婷综合在线播放| 丰满老熟妇BBBBB搡BBB | 中文毛片无遮挡高潮免费| 丁香五月天视频| 精品99爱免费视频在线观看| 伊人春天av| 一起草av在线观看| 在线精品97| 色色热| A1片久久久| 久热播这里只有精品| 激情五月激情综合俺也去婷婷小说| 欧美碰碰碰| 五月丁香久久| 婷婷情色五月天| 99热这里只有是亚洲国产| 亚洲小视频免费观看| 日本3级片一区2区| 92久操视频| 狠狠爱深色婷婷综合| 亚洲色另类| 成人网在线视频| 五月天精品综合| 色婷婷成人在线| 色婷婷欧美| 久久久久久97| 人妻激情视频| 亚洲黄3级片网站欧美| 91精选国| 狠狠色综合图片| 人与禽A片啪啪| 天天日天天插| 99日韩| 96精品久久久久久久久| 久久艹99| 日韩AAAAAAAAAAA片| 丁香激情婷婷网| 人人干人人操人人摸人人做| 激情五月天丁香| 久久婷狠狠色| 99 re视频一区| 七月婷婷色香综合网| 五月天婷婷综合网| 深爱激情五月婷婷| 久久丁香五月| 丁香九月激情| 亚洲乱码日产精品BD| 五月丁香六月合| 色视五月天婷婷| 亚洲综合色丁香五月天| 99热这里只有精品1998| 亚洲最大五月六月丁香婷婷| 成人欧美一区二区三区在线观看| 久久与婷婷| 婷丁香五月天| 26UUU精品一区二区c〇m| 色啪影院| 亚洲小视频免费观看| 日本久久人人| 99热在线爱| 色五月开心婷婷| 欧美五月丁香在线| 九九热在线观看视频网站| 我爱婷婷五月天综合88| 很很干夜夜干| 狠狠操天天操天天操| 激情综合网,五月| 五月激情综合激情五月| 99视频在线观看地址| 久久久A级视频| 五月天五月天激情网| 日本www免费九九| 人人色AV| 欧美大片免费观看| 中国AV性爱观看| 另类天堂| 99久久国产成人精品| 色五月天在线观看| 开心婷婷五| 六月婷婷五月丁香| 再綫Av免费視品| 亚洲色五月| 77799热| 色99在线视频| 亚洲小说五月婷婷| 丰满少妇猛烈A片免费看观看| 精品久久人妻热| wwwss在线观看| AV天堂淫乩| www.婷婷五月天| 丁香五月婷婷动漫| 九色视频九色九色91jiuseshipin| 亚洲色爽| 日操夜操天天操不卡| 99碰网站| AV操操操| www.夜夜夜| 五月婷婷丁香日韩在线| 操97| 少妇水多A片太爽了| 4399精品一区二区| 色五月天.con| 婷婷综合精品视频97| 天天肏夜夜肏| 亚洲AV成人一区二区在线观看| 97操碰碰无码视频| 国产另类综合| 五月天色丁香| 国产又粗又大又爽又黄| 玖玖精品婷婷| tingtingzonghewang| 欧美啪啪9| 亚洲亚洲人成综合网络| 97碰久久| 丁香五月天中文字幕| 五月激情视频| 91色噜噜狠狠狠狠色综合| 99在线视频在线观看| 丁香五月天婷婷中文字幕| 国产精产国品一二三在观看| 色色色在线| 亚洲人妻五月丁香婷婷| 色色色综合网| 婷婷91| 五月婷婷开心综合| 色激情五月| 色五月色五天色情网址| 色五月婷婷少妇人妻| 丁香五月手机在线| 1囯产午夜仑鲁鲁| 影音先锋色色色资源色资源色| 丁香五月婷婷激情尤物| 日日操日日射| 九九热精品视频在线观看| 激情五月色婷婷| 色综合天天天天做夜夜| 天天狠天天叉| 五月婷婷天堂| 成人网站免费sxj| 色色色免费视频| 欧美色97| 五月丁香六月色| 热99玖玖99玖玖99九九| 婷婷五月丁香在线观看| 久久久97| 亚洲五月天,激情视频| 婷婷的色色五月天| 伊人久久大香天蕉亚洲特级| 久色资源网| 九八Av| 久久亚洲色导航| 激情五月天影院| 九九自拍网| 丁香婷婷色五月激情综合| 婷婷五月丁香综合亚洲| 99视频在线观看视频| 五月婷婷性爱| 亚洲第一色网站| 青青草成人网| www.婷婷五月天,com| 操人91| 爱草视频在线| 五月婷婷啪啪网| 六月婷婷色色网| 99久操视频| 午夜福利8055| 色综合色五月| 开心五月深爱五月丁香五月激情五月| 九九Av| 亚洲不卡| 97碰在线| 色婷婷婷婷| 九九热色视频| 蜜桃人妻无码AV天堂三区| VA五月激情在线| 丁香九月婷| 另类激情综合| 丁香五月激情五月| 99操无码视频观看| 五月天婷婷基地综合网| 久久与婷婷| 丁香大香蕉| 久久免费精品小视频| 亚洲五月天婷婷| 精品一二三区久久AAA片| 激情综合五月| 99激情视频| 99热这里只有精品2016| 婷婷香蕉香| 色婷狠狠| 人人爽欧美婷婷久久久五月丁香| 26uuu亚洲欧美日本| 98色丁香五月婷婷综合网| 婷婷在线播放| 亚洲黄色影视| 亚洲精品又粗又大又爽A片 | 色插综合网| 婷婷五月天av小说| 久久婷婷五月综合啪| 五月色色网| 婷婷精品视频| 色吧五月婷婷| www.综合久久.com| 婷婷中文字幕网| 国产欧美日韩性爱| 色优久久| 丰满熟女人妻一区二区三| 91精品婷婷国产综合| 99热8| 操熟女成人网| 婷婷射图| 国产SUV精品一区二区883| 激情五月www| 91色色色18| 五月丁香综合| 五月天激情国产综合婷婷| 精品激情| 风流少妇A片一区二区蜜桃| 欧美性爱5月天天天看| 色婷婷AⅤ| 这里只有精品久久| 免费观看欧美成人AA片爱我多深| 色99婷婷五月天| 五月激情影院| 五月婷婷中文字幕| 婷婷丁香熟妇综合网| 激情综合网激情五月婷婷| 五月丁香婷婷成人综合网| 亚洲成人另类| 免费超碰在线观看| 激情另类综合| 嫩草国产| 激情五月天视频| 色久在| 日本三级毛片| 最新无毒无码AV| 人人操91| 亚洲六月色| 99精品视频在线免费观看| 国产免费一区二区三州老师F1……| 99热免费精品| 亚洲aV写真天天综合网久久| 99色在线观看免费| 另类亚洲视频| 99久热视频在线| 久久婷婷视频| 99久久久久久www| 婷婷五月激情丁香激情| 天堂爱啪啪| 婷婷在线五月综合| 裸睡玩奶头(高H)| 久热只有精品| 色色 9| www.sd-xiangsu.cpm| 亚洲无码另类| 免费黄色AV| 婷婷五月丁香色播| av在线免费播放观看| 熟妇人妻中文字幕无码老熟妇| 久久五月激情| 99在线免费视频| 青草激情综合| 99久久久国产精品免费蜜乳tv| 亚洲网站在线鸭子av| 婷婷97色| 色噜噜狠狠色综无码久久合欧美| 久久免片| 色碰碰视频| 97色色色| 五月天婷婷综合免费| 九月色婷婷综合| 99激| 欧美成人无码高清一区二区三区| 第四色色色色色丁香五月天| 国产精品久久久久久久久久| 深爱激情六月天| 成人欧美Va| 色婷婷五月天激情久久| 婷婷五月综合免费在线| 99视频内射三四| 都市激情小说婷婷| 五月婷婷之激情五月| 狠狠va| 这里只有在线精品| renrencaoni| 婷婷五月激情网站| 99在线观看视频免费| 伊人干综合| 91丨九色丨熟女丰满| 久婷久婷激情肉| 亚洲欧洲一二| 超碰色女人| 97涩婷婷| 色原狠狠综合| 色婷婷瘦婷婷日韩| 天堂五月婷婷| 玖玖99免费视频| 99热亚洲| 99热这里是精品| 日韩999| 日本性视频| 日本在线va| 26uuu日韩| 日韩在线观看亚洲| 亚洲激情视频在线观看| 天天干天干| 96丁香六月婷婷蜜桃综合久久| 六月激情综合| 人妻体体内射精一区二区| 亚洲情a| 天天撸天天干天天插| 五月婷视频| 五月丁香福利| 五月丁香婷婷色| 四虎99热在线观看网站| 操人视频91| 五月久久婷婷天堂视频| 婷五月天天| 色 五月俺去也| 欧美va在线| 另类图片激情五月| 婷婷综合五月天| 色丁香五月婷婷| 久久人妻少妇嫩草AV| 狠狠色综合久久久久| 成人永久免费视频在线观看| 开心五月婷婷激情| 91大屁股| 99在线热视频| 无码AV免费精品一区二区三区| 日本久久激情| 9999三级片| 天天爽—爽| 99综合视频| 久草五月天| 天天综合精品| 综合久久伊人| 任你草| 亚洲激情免费视频| 五月婷中文字幕| AA片在线观看视频在线播放| 人妻激情视频| 五月人人丁香婷婷五月人人丁香| 婷婷爱五月天| 婷婷综合在线| 亚洲激情| 色小说婷婷五月天天天| 五月在线| 中文幕无线码中文字蜜桃| 一级黄色操B| 欧美婷婷六月丁香综合色连续高潮抽搐| 五月天婷婷丁香视频| aa久久| 久久五月婷天天干| 五月天激情综合网俺也去| 丁香五月在线视频黑人| 亚洲激情AV| #NAME?| 日本本土色网第一区| 婷婷五月天欧美| 久久性爱视频| 亚洲婷婷基地| 婷婷六月网| 婷婷色九月| 狠狠婷婷色综合| 欧美在线干| 婷婷五月天在线综合| 天天色粽合合合合合合合| 开心五月婷婷综合在线精品素人| 五月丁香六月婷婷不卡免费无码| 26.uuu丁香五月婷婷| 久久44| 五月婷婷亚洲天堂激情在线| 超碰99久久| 97婷婷五月丁香| 色婷婷五月天天天天天天天天天| 国产免费一区二区三州老师F1F1| 色婷婷色丁香色欲av| 婷婷色五月综合丁香| 九九热这里只有精品5| 999影院成人在线影院| 亚洲综合五月天婷婷丁香| 天天搞天天色综合| 欧美婷婷五月丁香| 美国少妇性做爰| 五月丁香美女| 99热国产精品| 天天操中文字幕| 精品A√| 九九99精品视品| 天天色天天色天天色天天色天天色天天色| 婷婷久久五月丁香| www.com色播五月天| 丁香五月婷婷激情中文| 97碰碰碰免费公开在线视频| 久久精品性爱视频,| 亚洲成人av在线| 91xxxx九色| 思思热国产| 丁香六月婷婷综合| 亚洲操精品| 久久久久久久合一狠狠做深爱| 9色91视频| 亚洲精99| 久草热8精品视频在线观看| 九九久久99| www色色com| 伊人婷婷大香蕉| 91精品综合久久婷婷九色| 国产精品久久久久久久久久免费| 新99思思视频| 99这里只有精品视频| 狠狠干综合| 超碰在线人妻| 久热99| 久久xxxx| 色色热99| 欧美影院婷婷| 天天激情5月天亚洲| 亚洲熟妇无码乱子AV电影| 久久机热探花| 思思热久久爱| 就爱日五月天| 开心五月婷婷婷美女| 丁香五月97视频| 日本五月天网站| 久草九九| 午夜色婷婷| 激情五月天色色| 超碰在线国产| 这里只有在线精品| 国产一二区爆乳_1国产日韩一区二区三-成人AV | 激情综合五月婷婷丁香| 日韩美女在线视频19| 99热日| 九九AV在线| 丁香五月天社区| AAAA亚洲| 黄色av网站在线免费播放| 久久九九蜜| 久久九区| 永久无码色| 人妻丰满精品一区二区A片| 天天摸夜夜爽天天做| 67194线路二在线观看| 另类五月激情| 五月久熟女| 婷婷五月天久久| 国产伦理精品高清在线观看网站一区二区| 色五月网址| 色天天综合成人网| 久激情| 大香蕉五月天| 六月婷婷日| 久久婷婷五月综合色和| 无码色| 99热在线爱| 色香蕉婷婷| 精品久久人妻| 婷婷色播色五月五色五月天色妇| 少妇人妻丰满做爰XXX| 婷婷婷婷婷开心无码播放| 婷婷色在线播放| 日日爽夜夜爽| 丁香婷婷色五月合集| 日韩欧美一道四区中文字幕| 天天爱综合网| 丁香五月六月久久综合 | 激情网婷婷五月天| 婷婷综合另类小说| 免费91久久精品| 色婷婷AV在线| ji'qing'luan'ren'lun| Caoporn公开| www夜夜| 婷婷丁香五月,狠狠综合| 182TV亚洲| 久久精彩视频| 天天操天天插| www.夜夜操.con| 狠狠久综合| 99亚洲精品| 综合图片色色| 婷婷五月激情基地| www.久9| 国产精品涩涩涩视频网站| 日韩色五月| 久久久久久天天日天天爱| 色婷婷色丁香色欲av| 亭亭五月丁香五月天激情| 日日夜夜天天爽| 蜜臀丁香黄色婷婷五月天| 另类丁香五月天区图| 亚洲激情视频在线观看| 婷婷射婷婷舔| 99在线精品观看99| 婷婷久久天堂网| 操操碰| www.色综合.com| 秋霞电影理论| 九九色综合| 变态另类色图| 亚洲日韩一页精品发布| 婷婷97碰碰| site:feetmall.com| 人人澡天天色天天做| 天堂亚洲 在线| 一区二区成人电影免费播放| 天天日天天干天天爱| 亚洲精品成人片在线播| 丰满老熟妇BBBBB搡BBB| 天天色色天天| 日韩精品一品二区三区的使用体验| 久久久婷丁香五月| 婷婷久久综合| 91丁香婷婷综合资源| 六月五月天婷婷涩播在线| 久久XX| 九九性爱网| 丁香婷婷久久综合在线| 五月婷婷久久激情| 九九99久久| 日韩在线成人电影| 九月色婷婷综合亚洲| 色色五月婷| 久久五月婷| 人人操人人爱丁香五月| 婷婷丁香一月| 少妇丁香婷婷 | 色欧洲| 开心五月天激情| 天天撸夜夜爽| 激情五月天开心网丁香无码| 激情另类综合| 婷婷五月AV| 婷色视频| 婷婷色偷拍| 丁香婷婷婷| 综合网精品99| 久777| 五月婷婷爽爽爽| 精品国产乱码久久久久久免费 | 人妻精品在线| 狠狠第四色| 日韩色色一区| 国精产品一区二区三区| 日韩五月婷婷久久| 大香蕉视频99| 久久久久久人妻| 99精品网| 婷婷五月影院| 成人AV免费观看| 超碰激情网| 超碰人人超碰| 色玖玖爱| 天天日夜夜拍| 97综合在线| 人妻久久久| 国产古装妇女野外A片| AA片在线观看视频在线播放| 国产午夜成人免费看片无遮挡| 亚洲视频在线观看| 五月婷婷丁香日韩在线| 色色999三级片| 中文字幕高清av| aaa9区免费在线观看| 91久久综合亚洲噜噜成人在线| 99久久婷婷五月综合| 九九热视频99| 天天日天天舔天天摸| 激情q青青草在线婷婷| 久久综合热17c| 天天碰天天插天天操| 六月色伊人婷婷| 五月天婷婷青青| 丁香五月冃欧美| 亚洲丁香五月| 99热66| 欧美日韩成人| 色婷婷综合视频| 爱99干99| 任你弄在线视频免费| 97超级操操| 黄网在线免费观看| 激情另类综合| 五月天婷婷青青草| 成人色五婷婷| 日韩婷婷| 色伦专区97中文字幕| 激情婷婷丁香| 懂色av蜜臀av粉嫩av永陈冠希 | 综合色色色色色色| 991精品在线视频| 色噜噜婷婷| 538在线精品| 99视频在线观看视频| 国产免费一区二区三区三州老师F1F1.CC| 婷婷六月色开| 丁香五色月婷婷网| 亚洲成人在线五月天| 成人在线网| 久久一二三视频| 久热只有精品| 久久久www| 国产无遮挡又黄又爽免费网站| 色色网91| 99热这里是精品| 亚洲婷婷五月天激情综合| 69色婷婷| 99操视频| 91精品国产综合久久蜜芽解析速度| 美女精品一级不卡视频| xx综合网| 人人摸人人澡人人| 精品一区二区三区四区五区六区| 天天综合色99| 五月丁香久久精品在线观看 | 激情五月天激情五月天| 99热精品观看| 欧美在线| 婷婷丁香亚洲色综合91| 久久婷婷五月国产色综合激情| 婷婷丁香五月高清| 日本丁香五月| 91人妻九色大屁股| aⅤ79成人片| 久久这里都是精品免费| 色五月婷婷丁香五月| 性综合网| 色婷婷成人久久| 干亚洲天堂| 五月婷婷草| 天堂无码人妻精品AV一区| 67194中文字幕| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 五月婷婷色| 久久99久久久| 亚洲一色色色色色色色色| 天天操夜夜操| 婷婷丁香红五月91C| 五月丁香色色网| 五月天激情婷婷久久| 五月天激情国产综合婷婷婷| www.婷婷.com| 色丁香婷婷| 蜜桃人妻无码AV天堂三区| 香蕉久久六月| 婷婷综合精品视频97| 欧美韩国日本| 91色久| 射久久丁香五月| 婷婷九月久久| 婷婷丁香一月| 五月开心激情| 国产亚洲网站在线| 久久色这里只有精品| 公的粗大挺进了我的密道| www.婷婷亚洲基地| 日本成人噜噜噜| 91人人爱| 能看的av片| 日本色色色| 狠狠久久婷五月| 九九婷婷五月天| 天天干天天日蜜臀av| 色www99| 日韩欧美一区二区三区四区| 这里只有在线精品| 成人在线网址| 久久婷婷丁香| 思思热精品在线观看| 99在线精品免费视频| 日韩三级片一区二区| 日韩久热| 色欲丁香| 亚洲AV无码成人精品电影| 色欲香综合网| 丁香网站| 天天天操天天天爰| 久久久91| 婷婷午夜综合| 色婷久| 五月丁香日逼| 色色免费网战视频| 伊人网色婷婷五月天| 五月天婷婷日日爱| 亚洲免费婷婷| 开心婷婷中文字慕| 五月丁香久| 五月天操逼网| 婷婷五月电影| 激情五月丁香六月综合AVXXXX| 99九九精品| 五月做爱| 色播丁香婷婷五月激情| 无码 av电影| 五月婷在线色视频| 中文字幕日产A片在线看| 亚洲色色在线| EEUSS鲁片一区二区三区| 婷婷丁香五月天婷婷| 久久五月天婷婷| sS丁香五月婷婷| 久久丁香五月| 秋霞电影一级黄| 狠狠干,狠狠操| 婷婷色播色五月五色五月天色妇| av人人干| 思思99热在线| 色五月婷婷五月天| 五月丁香婷婷久久| 人人插操| 五月天激情在线视频| 无码人妻AV久久久一区二区三区| 天天撸夜夜爽| 色欲色香综合网| 五月天天丁香婷婷在线中| 欧美在线视频99| www99热| 日韩aaaaa| 天天 日综合| 五月婷婷玖玖综合玖玖爱| 五月丁香狠狠地噜噜噜噜| 99热99日天天干| 能看的AV| 色五月婷婷av| 噜噜噜久久| 5月婷婷六月丁香| 99网址在线观看| 激情六月色| 超碰操网| 麻豆AV一区二区三区| 色青五月天| 97超级碰碰碰| 老司机伊人| 五月婷婷综合网在线播放| 久热A片| 一起草无码| 欧美精品999| 成人做爰A片免费看网站找不到了 国产露脸150部国语对白 | 天天操夜夜操| 丝袜人妻| 99性爱| 99爱精品视频| 色色色色区| 亭亭五月色男人| 欧洲精品欧洲情| 99久热视频在线| 丁香婷婷激情| 色婷婷五月天激情| 激情又色又爽又黄的A片| 丁香五月中文字幕久色| 九九精品亚洲| 涩涩五月天| 人妻 性久久久久久| 激情 婷婷| 99色在线视频| 婷婷亚洲激情在线观看视频| 20253AV| 午夜亚洲国产精品av一区二区| 夜夜夜天天操| 91狼友视频网页更新| 天天综合五月天| 天天色综合色| 操97免费超级视频| 精品久久久久成人码免费动漫 | 六月天六月婷| 色综合久久88色综合天天99| 大香蕉综合视频在线|