加入我们,让大模型从“能聊天”变成“能干活”

发布时间:2026/7/8 13:09:50
加入我们,让大模型从“能聊天”变成“能干活” 01 一个尴尬的现实95%的大模型项目停在Demo阶段过去两年我面试了超过200位开发者看过不下500个AI项目Demo。一个令人唏嘘的规律是——95%的项目在PPT里无所不能在生产环境里一碰就碎。这些Demo有着惊人的相似之处打开一个漂亮的聊天界面输入问题模型流式输出一段逻辑清晰、引经据典的回答产品经理满意地点点头CTO拍板立项技术团队信心满满地开始开发然后噩梦开始了。当系统从Jupyter Notebook迁移到生产环境真实业务数据涌入的那一刻——幻觉层出不穷检索结果张冠李戴推理延迟从1秒飙升到15秒Token费用像水龙头没关紧一样哗哗流走。更糟糕的是业务方开始质疑“这东西连我们内部Wiki都查不明白怎么敢让它面对客户”大模型很聪明但聪明和有用之间隔着一整个工程世界的距离。02 “能聊天”和“能干活”之间差了什么让我们用一个真实的银行客服场景来拆解这个差距。场景信用卡盗刷投诉处理“能聊天”的版本用户输入“我的信用卡被盗刷了怎么办”大模型回答“非常抱歉听到这个消息。建议您立即致电银行客服热线400-xxx-xxxx进行挂失并前往就近派出所报案。银行会协助您处理后续事宜。”——回答专业、礼貌、正确。但仅此而已。“能干活”的版本大模型接收到这条消息后后台发生了一连串动作意图识别识别为“盗刷投诉”场景优先级P0身份核验自动调取用户绑定的信用卡信息比对姓名、身份证后四位风控联动调用风控系统接口标记该卡为“疑似盗刷”状态冻结所有非柜台交易工单创建在CRM系统中自动创建投诉工单关联用户ID和卡号证据保全将最近5笔交易记录打包附上时间戳水印话术生成根据该用户的历史偏好沟通记录显示该用户偏好简洁风格生成安抚话术转接策略如果用户情绪词如“投诉”“赔偿”“你们要负责”密度超过阈值自动转接人工高优先队列回答输出“王先生您好我已紧急冻结您尾号8848的信用卡防止进一步损失。您的投诉工单#T20260707已生成预计3分钟内专属客服经理将致电您。同时我已将您近5笔交易记录打包建议您在通话中与客服核对。请问还有其它需要帮助的吗”——这才叫“能干活”。两者的差距是被动应答与主动解决问题的差距是文本生成与业务闭环的差距是玩具与工具的差距。03 让大模型上班需要哪些“管教手段”让一个自由散漫的生成式模型变成企业里的“优秀员工”需要一套完整的“管教体系”。管教手段一RAG——给模型配一个“企业级外脑”大模型记不住你公司的内部信息除非你给它配一个随时可查的资料库。importhashlibimportjsonfromdatetimeimportdatetimefromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain_openaiimportOpenAIEmbeddingsfromlangchain_community.vectorstoresimportMilvusfromtypingimportList,DictclassEnterpriseRAGSystem: 企业级RAG系统 特点自带权限过滤、版本追踪、来源溯源 def__init__(self,collection_name:str):self.embeddingsOpenAIEmbeddings(modeltext-embedding-3-large)self.vector_storeMilvus(collection_namecollection_name,embedding_functionself.embeddings,connection_args{host:milvus-prod.internal,port:19530})self.text_splitterRecursiveCharacterTextSplitter(chunk_size512,chunk_overlap50,separators[\n\n,\n,。,,,,. ,! ,? ,; ])defingest_document(self,content:str,metadata:Dict)-str: 文档入库附带完整元数据 返回文档ID用于后续溯源 # 1. 切分chunksself.text_splitter.split_text(content)# 2. 为每个chunk生成唯一IDdoc_idfdoc_{hashlib.md5(content.encode()).hexdigest()[:12]}# 3. 构建带完整上下文的元数据enriched_metadata{**metadata,doc_id:doc_id,chunk_count:len(chunks),ingested_at:datetime.now().isoformat(),# 【关键】权限控制字段allowed_departments:metadata.get(allowed_departments,[]),allowed_user_roles:metadata.get(allowed_user_roles,[]),}# 4. 入库foridx,chunkinenumerate(chunks):self.vector_store.add_texts(texts[chunk],metadatas[{**enriched_metadata,chunk_index:idx,total_chunks:len(chunks)}])returndoc_iddefretrieve_with_permission(self,query:str,user_info:Dict,top_k:int5)-List[Dict]: 带权限的检索 用户只能看到自己有权访问的文档片段 # 【关键】用过滤条件实现数据隔离filter_expr(fallowed_departments contains {user_info.get(department)} OR fallowed_user_roles contains {user_info.get(role)} OR is_public true)resultsself.vector_store.similarity_search_with_score(queryquery,ktop_k,exprfilter_expr)# 返回结果并附上置信度return[{content:doc.page_content,source:doc.metadata.get(source,unknown),doc_id:doc.metadata.get(doc_id),score:score,confidence:self._calc_confidence(score)}fordoc,scoreinresults]def_calc_confidence(self,score:float)-str:根据相似度分数计算置信等级ifscore0.85:returnhighelifscore0.65:returnmediumelse:returnlow背后的工程智慧RAG系统最大的坑不是召回率低而是权限泄露——A部门的员工检索到了B部门的薪资数据。上面的代码通过filter_expr在向量检索层就完成了权限过滤而不是检索完再过滤性能和安全性都得到保障。管教手段二Agent编排——给大模型配上“手脚”大模型只会说话但企业需要它做事。Agent就是大模型的“手和脚”。fromtypingimportTypedDict,Annotatedfromlanggraph.graphimportStateGraph,ENDfromlanggraph.prebuiltimportToolExecutorimportjsonimportrequestsclassAgentState(TypedDict):Agent的状态管理user_query:struser_id:strsession_id:strcurrent_step:strtool_calls:listtool_results:listfinal_answer:strretry_count:int# 定义可用的工具TOOLS[{name:query_customer_info,description:根据用户ID查询客户信息包括姓名、会员等级、注册时间,parameters:{user_id:{type:string,description:用户唯一标识}}},{name:check_order_status,description:查询订单状态返回物流信息和预计送达时间,parameters:{order_id:{type:string,description:订单号}}},{name:create_ticket,description:在客服系统中创建工单需要工单类型和优先级,parameters:{ticket_type:{type:string,enum:[投诉,咨询,售后,建议]},priority:{type:string,enum:[P0,P1,P2,P3]},description:{type:string,description:工单描述}}},{name:send_sms,description:向用户手机发送短信通知,parameters:{phone:{type:string,description:手机号},content:{type:string,description:短信内容}}}]defbuild_agent_graph(): 构建Agent工作流图 这是一个ReAct模式的实现思考-行动-观察-再思考 graphStateGraph(AgentState)# 【节点1】意图理解与工具选择defdecide_tool(state:AgentState)-AgentState:promptf 你是企业服务助手。根据用户问题判断需要调用哪些工具。 用户问题{state[user_query]}可用工具{json.dumps(TOOLS,ensure_asciiFalse)}请返回JSON数组格式的工具调用列表每个元素包含tool_name和参数。 如果不需要工具返回空数组。 # 调用LLM决策此处简化展示逻辑# 实际项目中会调用大模型APItool_calls[{tool_name:query_customer_info,params:{user_id:state[user_id]}},{tool_name:check_order_status,params:{order_id:ORD-20260707-001}}]state[tool_calls]tool_calls state[current_step]executing_toolsreturnstate# 【节点2】执行工具defexecute_tools(state:AgentState)-AgentState:results[]forcallinstate[tool_calls]:try:# 实际项目中的工具调用会走真正的业务APIifcall[tool_name]query_customer_info:result{name:张三,level:钻石会员,register_at:2023-01-15}elifcall[tool_name]check_order_status:result{status:派送中,location:杭州市西湖区,eta:今日18:00前}else:result{error:未知工具}results.append({tool:call[tool_name],params:call[params],result:result,success:True})exceptExceptionase:results.append({tool:call[tool_name],error:str(e),success:False})state[tool_results]results state[current_step]generating_answerreturnstate# 【节点3】生成最终答案defgenerate_answer(state:AgentState)-AgentState:# 将工具执行结果和用户问题一起交给LLM生成最终回复contextf 用户问题{state[user_query]}工具执行结果{json.dumps(state[tool_results],ensure_asciiFalse,indent2)}请根据工具执行结果生成一段专业、简洁、有帮助的回复。 回复中要体现你使用了哪些信息来帮助用户。 # 调用LLM生成回复此处简化final张先生您好您是钻石会员。您尾号8848的信用卡已成功激活。state[final_answer]final state[current_step]donereturnstate# 【节点4】兜底-降级处理deffallback(state:AgentState)-AgentState:当工具调用失败时给出降级回复state[final_answer]系统暂时无法完成您的请求已为您转接人工客服请稍候。state[current_step]fallback_donereturnstate# 构建图graph.add_node(decide_tool,decide_tool)graph.add_node(execute_tools,execute_tools)graph.add_node(generate_answer,generate_answer)graph.add_node(fallback,fallback)graph.set_entry_point(decide_tool)graph.add_edge(decide_tool,execute_tools)# 【条件边】根据工具执行结果决定下一步defafter_execution(state:AgentState)-str:# 如果所有工具都执行成功ifall(r.get(success,False)forrinstate[tool_results]):returngenerate_answer# 如果有失败的进入降级else:returnfallbackgraph.add_conditional_edges(execute_tools,after_execution)graph.add_edge(generate_answer,END)graph.add_edge(fallback,END)returngraph.compile()Agent编排的核心价值不是让大模型“想说什么说什么”而是让大模型“按流程办事”。就像给一个天才员工配上SOP标准作业程序确保他每次都能稳定输出。管教手段三Prompt Engineering——给大模型写“员工手册”classSystemPromptFactory: Prompt工厂针对不同业务场景生成不同的System Prompt 相当于给大模型准备了不同岗位的入职培训手册 staticmethoddefget_customer_service_prompt()-str:return 【角色定位】 你是XX银行智能客服助手拥有3年以上客户服务经验专业、耐心、细致。 【行为准则】 1. 第一句话必须完成身份确认称呼用户姓氏先生/女士 2. 每段回复必须包含一个明确的可执行动作如请点击已为您即将发送 3. 涉及资金/账户操作时必须提醒用户确认身份 4. 当无法确认答案时主动引导至人工严禁编造信息 【风格要求】 语言简洁、信息密度高避免亲哦呢等过度亲昵用词 每段回复控制在3-5句话关键信息加【】强调 【禁止事项】 - 禁止承诺一定保证等绝对化表述 - 禁止询问用户身份证号、密码等敏感信息 - 禁止对未发生的交易做任何预测 【输出格式】 回复必须以JSON格式输出包含以下字段 { reply: 正式回复内容, action_required: 用户需要执行的操作无则填null, confidence: 0.0-1.0之间的小数表示对答案的把握程度 } staticmethoddefget_internal_qa_prompt()-str:return 【角色定位】 你是企业内部知识助手帮助员工快速查找公司制度、流程、技术文档。 【核心原则】 1. 必须基于提供的【背景知识】回答不得使用外部知识 2. 如果【背景知识】中找不到答案直接回复未在知识库中找到相关信息 3. 引用时必须标注来源文档名称和章节 【可信度分级】 - 高置信度背景知识中直接有明确答案 → 可直接回答 - 中置信度背景知识中有相关信息但需推断 → 回答时加根据现有资料推测 - 低置信度背景知识中无相关信息 → 明确告知未知 【输出格式】 回复中须附上引用来源格式[来源文档名-章节] Prompt工程的本质不是“写一段话让模型理解”而是给大模型制定一套可执行的规则系统。好的Prompt像一份详尽的员工手册告诉模型什么该做、什么不该做、怎么做、做到什么标准。04 现实世界的避坑实录坑一“上下文窗口无限大”是毒鸡汤某次上线团队天真地认为“反正模型有128K上下文把整个知识库都塞进去不就行了”。结果首Token延迟从800ms飙升到8.7秒用户等不及纷纷关掉页面月底收到云账单费用翻了17倍教训RAG不是上下文塞满而是精准检索。Top-k值不是越大越好3-5个片段通常是性价比最优解。坑二流式响应被“截胡”前端调接口等了10秒没反应排查发现Nginx默认开启了proxy_buffering把所有数据攒够才返回。用户看到的是“空白页→瞬间满屏文字”体验极差。解决方案location /api/ai/ { proxy_pass http://ai-backend/; proxy_buffering off; # 关键配置 proxy_cache off; # 关闭缓存 proxy_read_timeout 300s; # 大模型思考需要时间 chunked_transfer_encoding on; # 启用分块传输 }坑三数据权限“形同虚设”前端传来{project_id: proj_001}后端直接透传给Python引擎。某个懂技术的员工用Postman把project_id改成proj_002看到了不该看的竞品分析报告。红线原则任何来自前端的权限参数都必须在后端二次校验。永远不要把权限校验交给前端或AI层。05 从“能聊天”到“能干活”只差一个你我们正在做的就是把这套“管教体系”产品化、平台化——让大模型不只是会对话而是能真正接入企业的业务流、数据流、权限体系成为能独立完成任务的“数字员工”。如果你具备扎实的工程底子Java Python双修熟悉Spring Boot和FastAPI全栈视野前端React/Vue不陌生能理解从界面到数据库的完整链路AI应用经验RAG、Agent、Prompt Engineering至少有一个方向有实战产品思维懂业务、懂用户不为了炫技而堆砌技术那么欢迎加入我们。一起让大模型从“能聊天”变成“能干活”。简历投递recruitai-engineering.com标题请注明【AI全栈】 姓名我们会在24小时内回复