哈尔滨营销型网站建设公司wordpress用思源黑体
哈尔滨营销型网站建设公司,wordpress用思源黑体,自定义wordpress背景图,三维建筑设计软件LangChain 深入 这里需要装什么包什么依赖 我就不再一一赘述了 大家可以先看上一篇 《Langchain 浅出》 那么如果出现缺失的依赖怎么办 #xff1f;简单 缺什么装什么 作者#xff1a;吴佳浩
最后更新#xff1a;2025-12-2
适用版本#xff1a;LangChain v1.0
目录
1、…LangChain 深入这里需要装什么包什么依赖 我就不再一一赘述了 大家可以先看上一篇 《Langchain 浅出》那么如果出现缺失的依赖怎么办 简单 缺什么装什么作者吴佳浩最后更新2025-12-2适用版本LangChain v1.0目录1、Python 依赖安装2、词工程最佳实践3、性能优化技巧4、常见问题与解决方案5、调试和错误处理6、生产环境最佳实践想了想还是给补一份基础的依赖吧 至于为什么我也不知道 但是我还是补上了另外本章篇幅比较密的代码示例需要个人花点时间理解和消化有问题可以在评论区交流Python 依赖安装全套覆盖核心依赖所有 demo 都需要pipinstall--upgrade pip setuptools wheel pipinstallpython-dotenv# 环境变量管理pipinstalllangchain1.0.*# LangChain 1.x 核心pipinstalllangchain-ollama# Ollama LLM 支持pipinstallollama# Ollama 官方客户端模型自检/拉取向量数据库与文档检索文档助手/检索 demopipinstalllangchain-chroma# Chroma 向量数据库pipinstalllangchain-community# 社区扩展功能额外工具、插件pipinstallchromadb# Chroma 官方依赖文档加载PDF / Word / 通用文档pipinstallunstructured# 文本/结构化文档加载pipinstallpypdf# PDF 文档解析pipinstallpython-docx# Word 文档解析Embeddings / NLP可选替代 Ollama Embeddingpipinstallsentence-transformers# 文本向量生成可选词工程最佳实践是否开始定义示例数据examples创建PromptTemplateexample_prompt设置LengthBasedExampleSelectorselector构建FewShotPromptTemplatefew_shot初始化ChatOllama模型遍历输入情绪列表格式化提示词few_shot.format()调用模型生成回复llm.invoke()打印回复结果还有更多情绪?END创建文件advanced_prompting.py 高级提示词技巧基于 LangChain 1.0 LangGraph fromlangchain_ollamaimportChatOllamafromlangchain_core.promptsimport(ChatPromptTemplate,# 提示词模板SystemMessagePromptTemplate,# 系统消息模板HumanMessagePromptTemplate,# 角色消息模板PromptTemplate,# 单个示例格式FewShotPromptTemplate# 少样本学习示例)fromlangchain_core.example_selectorsimportLengthBasedExampleSelector# from dotenv import load_dotenv 还是和之前一样 因为我们本地使用的ollama基本都是默认的配置所以暂时不加载配置文件# load_dotenv()deffew_shot_learning():少样本学习通过示例教模型执行任务LangChain 1.0 风格examples[{input:开心,output: 今天心情真好},{input:难过,output: 有些失落不过会慢慢好起来。},{input:兴奋,output: 太棒了令人振奋的消息}]# 单个示例格式example_promptPromptTemplate(template情绪{input}\n回复{output},input_variables[input,output],)# 示例选择器自动选择合适数量selectorLengthBasedExampleSelector(examplesexamples,example_promptexample_prompt,max_length100)few_shotFewShotPromptTemplate(example_selectorselector,example_promptexample_prompt,prefix你是一个情感友好的 AI 助手会用 emoji 回复\n\n示例,suffix\n情绪{input}\n回复,input_variables[input])llmChatOllama(modelqwen3-coder:30b,temperature0.7)emotions[激动,焦虑,感动]print(\n 少样本学习示例 )foremotioninemotions:promptfew_shot.format(inputemotion)resllm.invoke(prompt)print(f\n情绪{emotion})print(fAI 回复{res.content})defrole_based_prompting():基于角色的提示词新版 lc3 PromptTemplatesystem_template 你是一名{role}。 特点{characteristics} 回答风格{style} system_msgSystemMessagePromptTemplate.from_template(system_template)human_msgHumanMessagePromptTemplate.from_template({question})promptChatPromptTemplate.from_messages([system_msg,human_msg])llmChatOllama(modelqwen3-coder:30b,temperature0.6)roles[{role:资深软件架构师,characteristics:熟悉微服务、性能优化、分布式架构,style:严谨、专业、会给出架构图示建议,question:如何设计一个高并发的电商系统},{role:耐心的编程老师,characteristics:善于用比喻解释复杂概念,style:温和、逐步讲解、举例子,question:什么是类和对象}]print(\n 基于角色的提示词示例 )forconfiginroles:msgsprompt.format_messages(**config)resllm.invoke(msgs)print(f\n角色{config[role]})print(f回答{res.content})defchain_of_thought_prompting():思维链提示手动 CoTllmChatOllama(modelqwen3-coder:30b,temperature0)normal商店有23个苹果卖出17个又进了30个现在有多少cot 商店有23个苹果卖出17个又进30个。 请按照步骤推理 1. 卖出后剩余多少 2. 再加上进货数量 3. 计算最终结果 print(\n 思维链对比 )print(\n【普通提示】)print(llm.invoke(normal).content)print(\n【思维链 CoT】)print(llm.invoke(cot).content)if__name____main__:few_shot_learning()role_based_prompting()chain_of_thought_prompting()输出结果太长这里就放个截图示意吧性能优化技巧开始程序功能选择缓存示例批处理示例流式输出示例创建缓存初始化LLM第一次调用模型推理存入缓存第二次调用缓存命中缓存完成准备问题列表循环调用记录耗时1批量调用记录耗时2批处理完成初始化LLM流调用流方法接收分块流处理完成结束创建文件optimization_tips.py LangChain 1.x 性能优化技巧示例 —— 最新写法2025 importtimefromdotenvimportload_dotenv load_dotenv()# LangChain 1.x 最新模块fromlangchain_core.cachesimportInMemoryCache# Ollama LLMfromlangchain_ollamaimportChatOllamadefcaching_example():使用缓存减少重复调用print(*50)print(缓存优化示例LangChain 1.x)print(*50)# 设置全局缓存官方推荐方式cacheInMemoryCache()llmChatOllama(modelqwen3-coder:30b,temperature0.7,cachecache)question什么是机器学习# 第一次调用非缓存print(f\n问题{question})print(第一次调用未缓存...)starttime.time()response1llm.invoke(question)time1time.time()-startprint(f耗时{time1:.2f}秒)print(f答案{response1.content[:100]}...)# 第二次调用缓存命中print(\n第二次调用已缓存...)starttime.time()response2llm.invoke(question)time2time.time()-startprint(f耗时{time2:.2f}秒)iftime20:print( 速度提升∞缓存命中耗时约 0 秒)else:print(f 速度提升{time1/time2:.1f}倍)defbatch_processing():批量处理以减少网络调用print(\n*50)print(批量处理示例LangChain 1.x)print(*50)llmChatOllama(modelqwen3-coder:30b,temperature0.7)questions[Python 是什么,Java 是什么,JavaScript 是什么]# 方式1逐个处理print(\n方式1逐个调用 invoke())starttime.time()forqinquestions:llm.invoke(q)time1time.time()-startprint(f总耗时{time1:.2f}秒)# 方式2批量处理LangChain 1.x 推荐print(\n方式2使用 llm.batch())starttime.time()responsesllm.batch(questions)time2time.time()-startiftime20:print( 速度提升∞缓存命中耗时约 0 秒)else:print(f 速度提升{time1/time2:.1f}倍)defstreaming_output():流式输出提升用户体验print(\n*50)print(流式输出示例LangChain 1.x)print(*50)# 流式输出无需 streamingTruellmChatOllama(modelqwen3-coder:30b,temperature0.7,)print(\n生成中,end,flushTrue)# LangChain 1.x 官方写法llm.stream()forchunkinllm.stream(请用100字介绍人工智能的发展历史):print(chunk.content,end,flushTrue)print(\n)if__name____main__:caching_example()batch_processing()streaming_output()输出结果:缓存优化示例LangChain1.x问题什么是机器学习 第一次调用未缓存... 耗时1.35 秒 答案机器学习是人工智能的一个重要分支它让计算机能够在不被明确编程的情况下通过分析大量数据来自动学习和改进。## 核心概念机器学习让计算机从经验中学习规律并利用这些规律对新的、未见过的数据进行预... 第二次调用已缓存... 耗时0.00 秒 速度提升∞缓存命中耗时约0秒批量处理示例LangChain1.x方式1逐个调用 invoke()总耗时4.56 秒 方式2使用 llm.batch() 速度提升1.0 倍流式输出示例LangChain1.x生成中人工智能发展可追溯至1950年代。1956年达特茅斯会议正式确立AI概念。经历了多次起伏1970年代专家系统兴起1980年代遭遇AI寒冬1990年代机器学习兴起。21世纪后大数据、深度学习技术突破AI迎来快速发展期在图像识 别、自然语言处理等领域取得重大进展正深刻改变着人类生活。(venv)PS D:\softwares\langchin_learning常见问题与解决方案1.0 版本1. 模型初始化与 API Key问题模型无法调用或报错解决方案对OpenAI检查 API Key 是否正确确保环境变量已加载importosfromdotenvimportload_dotenv load_dotenv()api_keyos.getenv(OPENAI_API_KEY)对ChatOllama / 本地 Ollama 模型无需网络 API只要 Ollama Server 已启动即可ollama list# 检查模型是否可用确保虚拟环境正确激活并安装最新依赖pipinstall-U langchain langchain-ollama python-dotenv2. 依赖包版本冲突问题ImportError或模块版本不兼容解决方案使用虚拟环境隔离项目依赖venv / conda / poetry升级至最新版本pipinstall--upgrade langchain langchain-ollama python-dotenv确保 Python 版本3.9 以上3. 网络与本地服务连接问题问题模型无法访问解决方案OpenAI确保网络可用必要时配置代理ChatOllama本地模型Ollama Server 必须启动使用命令检查模型列表ollama list测试本地端口curlhttp://localhost:114344. Token 限制或显存问题问题模型响应超时或显存不足解决方案OpenAI注意速率限制RateLimit可降低请求频率或批量调用本地 Ollama没有调用次数限制但受显卡显存影响可选择小模型如Qwen2.5:3B Qwen2.5:7B Qwen3-coder:30B对于超长 Prompt建议分段或使用llm.batch()批量调用5. 流式输出与回调问题问题流式输出不生效或回调不触发解决方案流式输出最新 LangChain 1.x 不再使用streamingTrue参数正确方法forchunkinllm.stream(你的 Prompt):print(chunk.content,end)回调使用langchain_core.callbacks.BaseCallbackHandler编写自定义回调确保在 LLM 或 Runnable 初始化时传入fromlangchain_core.callbacksimportCallbackManager,BaseCallbackHandlerclassMyHandler(BaseCallbackHandler):defon_llm_new_token(self,token):print(token,end)callback_managerCallbackManager([MyHandler()])llmChatOllama(modelQwen2.5:7b,callback_managercallback_manager)6. 其他常见问题缓存未生效确保使用最新InMemoryCache或PersistentCache并传入 LLMfromlangchain_core.cachesimportInMemoryCache llmChatOllama(modelQwen2.5:7b,cacheInMemoryCache())批量调用报错检查输入是list[str]使用.batch()方法超长输出截断可使用max_tokens参数或分段请求调试和错误处理创建文件debugging_guide.py LangChain 1.x 调试与错误处理示例 —— 最新写法2025 importloggingfromdotenvimportload_dotenv load_dotenv()# 最新 LangChain 1.x 模块fromlangchain_ollamaimportChatOllamafromlangchain_core.callbacksimportStdOutCallbackHandler# 配置日志logging.basicConfig(levellogging.INFO)loggerlogging.getLogger(__name__)defverbose_mode_example():使用回调追踪详细执行过程替代旧的 LLMChain verboseprint(*50)print(Verbose 模式示例)print(*50)# 初始化 Ollama LLMllmChatOllama(modelqwen3-coder:30b,temperature0.7)# 回调处理器打印详细信息handlerStdOutCallbackHandler()# 直接调用 LLM 并传入回调responsellm.invoke(请用一句话介绍量子计算,config{callbacks:[handler]})print(f\n最终结果{response.content})defcallback_example():使用回调处理器追踪 LLM 调用print(\n*50)print(回调处理器示例)print(*50)llmChatOllama(modelqwen3-coder:30b,temperature0.7)handlerStdOutCallbackHandler()responsellm.invoke(什么是区块链,config{callbacks:[handler]})print(f\n答案{response.content})deferror_handling_example():错误处理最佳实践print(\n*50)print(错误处理示例)print(*50)llmChatOllama(modelqwen3-coder:30b,temperature0.7)try:responsellm.invoke(测试问题)print(f成功{response.content})exceptExceptionase:logger.error(f调用 LLM 出错:{type(e).__name__})logger.error(f错误详情:{str(e)})err_msgstr(e).lower()ifrate_limitinerr_msg:print(触发速率限制请稍后重试)elifauthenticationinerr_msg:print(API 密钥错误请检查配置)eliftimeoutinerr_msg:print(请求超时请检查网络)else:print(f未知错误{e})deftoken_counting():Token 计数示例仅适用于 OpenAI APIprint(\n*50)print(Token 计数示例)print(*50)llmChatOllama(modelqwen3-coder:30b,temperature0.7)# Ollama 本地模型无法使用 get_openai_callbackprint(⚠ Ollama 本地模型不支持 OpenAI Token 计数此示例仅供 OpenAI API 使用)# OpenAI 可用写法保留示例 from langchain_core.callbacks import get_openai_callback with get_openai_callback() as cb: response llm.invoke(请详细介绍 Python 编程语言的特点和应用场景) print(f答案{response.content}) print(f总 Token{cb.total_tokens}, 提示词 Token{cb.prompt_tokens}, 响应 Token{cb.completion_tokens}) print(f总成本${cb.total_cost:.4f}) if__name____main__:verbose_mode_example()callback_example()error_handling_example()token_counting()输出结果:Verbose 模式示例INFO:httpx:HTTP Request: POST http://127.0.0.1:11434/api/chatHTTP/1.1 200 OK最终结果量子计算是一种利用量子比特的叠加和纠缠特性进行并行计算的新型计算方式能够在某些特定问题上实现指数级的计算速度提升。回调处理器示例INFO:httpx:HTTP Request: POST http://127.0.0.1:11434/api/chatHTTP/1.1 200 OK答案区块链是一种**分布式数据库技术**它将数据存储在按时间顺序链接的区块中每个区块都包含前一个区块的加密哈希值形成一个不可篡改的链式结构。## 核心特征**1. 去中心化** - 没有单一控制者 - 多个节点共同维护网络 **2. 不可篡改** - 一旦数据写入就很难修改 - 修改需要网络中大多数节点同意 **3. 透明可追溯** - 所有交易记录公开可见 - 可以追踪数据的完整历史## 工作原理1. **区块创建**新数据被打包成区块2. **加密验证**通过密码学算法验证区块3. **网络共识**多个节点确认区块有效性4. **链式连接**新区块链接到现有链上## 主要应用- **加密货币**比特币、以太坊等 - **智能合约**自动执行的合约协议 - **供应链管理**商品溯源追踪 - **数字身份**身份认证和管理 - **医疗记录**安全存储和共享 区块链技术正在多个领域发挥重要作用为数据安全和信任建立提供了新的解决方案。错误处理示例INFO:httpx:HTTP Request: POST http://127.0.0.1:11434/api/chatHTTP/1.1 200 OK成功您好我注意到您提到了测试问题但我没有看到具体需要测试的内容。为了更好地帮助您能否请您1. **说明具体需要测试什么** - 是技术问题、逻辑问题、还是其他类型的测试 - 请提供详细的问题描述2. **告知测试的背景** - 这是关于什么领域的测试 - 有什么特殊要求吗3. **提供相关材料** - 如果有代码、数据或其他资料请一并提供 请补充这些信息我就能为您提供更准确和有用的测试帮助了。期待您的详细说明Token 计数示例⚠ Ollama 本地模型不支持 OpenAI Token 计数此示例仅供 OpenAI API 使用生产环境最佳实践用户日志系统限流器LLM客户端Ollama模型发送请求 问题 X1记录收到的请求2检查请求是否允许3允许4调用 safe_generate()5validate_input()6retry_on_failure7invoke(prompt)8返回生成内容9响应生成成功10返回响应内容11输入验证失败12返回错误信息13alt[输入有效][输入无效]超过速率限制14返回限制提示15alt[请求被允许][请求被限制]用户日志系统限流器LLM客户端Ollama模型创建文件production_best_practices.py 生产环境部署最佳实践LangChain 1.0 Ollama fromlangchain_ollamaimportChatOllamafromdotenvimportload_dotenvimportosimporttimefromfunctoolsimportwrapsfromcollectionsimportdequeimportlogging load_dotenv()# # 重试装饰器# defretry_on_failure(max_retries3,delay1):自动重试失败的请求defdecorator(func):wraps(func)defwrapper(*args,**kwargs):forattemptinrange(max_retries):try:returnfunc(*args,**kwargs)exceptExceptionase:ifattemptmax_retries-1:print(f尝试{attempt1}失败:{e})print(f等待{delay}秒后重试...)time.sleep(delay*(attempt1))else:print(f所有{max_retries}次尝试均失败)raisereturnwrapperreturndecorator# # 生产环境 LLM 客户端# classProductionLLMClient:生产环境 LLM 客户端封装Ollamadef__init__(self):# 从环境变量读取配置self.modelos.getenv(LLM_MODEL,Qwen2.5:7b)self.temperaturefloat(os.getenv(LLM_TEMPERATURE,0.7))self.max_tokensint(os.getenv(LLM_MAX_TOKENS,500))# 初始化 Ollama LLMself.llmChatOllama(modelself.model,temperatureself.temperature,max_tokensself.max_tokens,streamingFalse)print(f✓ LLM 客户端初始化完成)print(f 模型:{self.model})print(f 温度:{self.temperature})print(f 最大 Token:{self.max_tokens})retry_on_failure(max_retries3,delay2)defgenerate(self,prompt):生成响应带重试机制try:responseself.llm.invoke(prompt)returnresponse.contentexceptExceptionase:print(f生成失败:{e})raisedefvalidate_input(self,text,max_length1000):验证输入合法性ifnottextornotisinstance(text,str):returnFalseiflen(text)max_length:returnFalsereturnTruedefsafe_generate(self,user_input):安全生成响应ifnotself.validate_input(user_input):return{success:False,error:输入无效或过长}try:responseself.generate(user_input)return{success:True,response:response}exceptExceptionase:return{success:False,error:str(e)}# # 日志示例# deflogging_example():logging.basicConfig(levellogging.INFO,format%(asctime)s - %(name)s - %(levelname)s - %(message)s,handlers[logging.FileHandler(langchain_app.log),logging.StreamHandler()])loggerlogging.getLogger(__name__)print(*50)print(日志记录示例)print(*50)clientProductionLLMClient()user_input什么是机器学习logger.info(f收到用户请求:{user_input})resultclient.safe_generate(user_input)ifresult[success]:logger.info(响应生成成功)print(f\n响应:{result[response]})else:logger.error(f响应生成失败:{result[error]})print(f\n错误:{result[error]})# # 速率限制示例# defrate_limiting_example():classRateLimiter:简单速率限制器def__init__(self,max_calls,time_window):self.max_callsmax_calls self.time_windowtime_window self.callsdeque()defallow_request(self):nowtime.time()whileself.callsandself.calls[0]now-self.time_window:self.calls.popleft()iflen(self.calls)self.max_calls:self.calls.append(now)returnTruereturnFalseprint(\n*50)print(速率限制示例)print(*50)limiterRateLimiter(max_calls5,time_window60)clientProductionLLMClient()foriinrange(7):iflimiter.allow_request():print(f\n请求{i1}: 允许)resultclient.safe_generate(f问题{i1})print(f响应:{result.get(response,result.get(error))[:50]}...)else:print(f\n请求{i1}: 被限制超过速率限制)# # 主函数# if__name____main__:logging_example()rate_limiting_example()输出结果:日志记录示例✓ LLM 客户端初始化完成 模型: qwen3-coder:30b 温度:0.7最大 Token:5002025-12-02 01:20:12,445 - __main__ - INFO - 收到用户请求: 什么是机器学习2025-12-02 01:20:12,649 - httpx - INFO - HTTP Request: POST http://127.0.0.1:11434/api/chatHTTP/1.1 200 OK2025-12-02 01:20:14,011 - __main__ - INFO - 响应生成成功 响应: 机器学习是人工智能的一个重要分支它让计算机能够在不被明确编程的情况下通过分析大量数据来自动学习和改进。## 核心概念机器学习让计算机从数据中学习规律和模式然后利用这些知识对新的、未见过的数据进行预测或决策。## 工作原理1. **输入数据** - 提供大量带有标签或无标签的数据2. **算法学习** - 机器学习算法分析数据中的模式3. **建立模型** - 构建能够识别模式的数学模型4. **预测应用** - 对新数据进行预测或分类## 主要类型- **监督学习** - 使用带标签的数据训练 - **无监督学习** - 从未标记数据中发现隐藏模式 - **强化学习** - 通过与环境交互来学习最优行为## 常见应用- 图像识别和人脸识别 - 语音助手如Siri、Alexa - 推荐系统如抖音、淘宝推荐 - 自动驾驶汽车 - 医疗诊断辅助 - 金融风险评估 机器学习正在深刻改变我们的生活让许多以前需要人类智能才能完成的任务变得自动化。速率限制示例✓ LLM 客户端初始化完成 模型: qwen3-coder:30b 温度:0.7最大 Token:500请求1: 允许2025-12-02 01:20:14,109 - httpx - INFO - HTTP Request: POST http://127.0.0.1:11434/api/chatHTTP/1.1 200 OK响应: 您好我注意到您提到了问题 1但我没有看到具体的问题内容。请您提供需要解决的问题我会很乐意帮... 请求2: 允许2025-12-02 01:20:14,529 - httpx - INFO - HTTP Request: POST http://127.0.0.1:11434/api/chatHTTP/1.1 200 OK响应: 我注意到您提到了问题 2但我没有看到具体的问题内容。请您提供需要解答的具体问题我会很乐意帮助... 请求3: 允许2025-12-02 01:20:14,948 - httpx - INFO - HTTP Request: POST http://127.0.0.1:11434/api/chatHTTP/1.1 200 OK响应: 我需要更多信息来帮助您解决问题 3。您能提供以下信息吗1. **具体问题内容** - 您想... 请求4: 允许2025-12-02 01:20:15,564 - httpx - INFO - HTTP Request: POST http://127.0.0.1:11434/api/chatHTTP/1.1 200 OK响应: 我需要更多信息来帮助您解决问题4。您能提供1. **具体的问题内容** - 您想解决什么问... 请求5: 允许2025-12-02 01:20:16,073 - httpx - INFO - HTTP Request: POST http://127.0.0.1:11434/api/chatHTTP/1.1 200 OK响应: 我需要更多信息来帮助您解决问题 5。您能提供1. **具体的问题内容** - 您想解决什么... 请求6: 被限制超过速率限制 请求7: 被限制超过速率限制常见应用场景场景 1智能客服机器人 流程说明用户输入→ 机器人接收机器人拼接系统提示 最近 N 轮对话→ 形成完整 prompt窗口记忆→ 保留最近几轮对话避免 prompt 过长调用 Ollama LLM→ 生成回答更新历史→ 将用户消息和模型回答都记录进窗口记忆返回给用户→ 输出响应用户客服机器人LLM模型输入消息 问题 X1拼接系统提示和历史对话2保留最近 N 轮对话窗口记忆3invoke(prompt)4返回生成内容5更新窗口记忆 (user assistant)6返回响应内容7用户客服机器人LLM模型 智能客服机器人示例LangChain 1.x Ollama fromlangchain_ollamaimportChatOllamafromlangchain_core.cachesimportInMemoryCachefromdotenvimportload_dotenv load_dotenv()classCustomerServiceBot:客服机器人类新写法def__init__(self,window_size:int5):# 窗口记忆只保留最近 window_size 轮对话self.window_sizewindow_size self.history[]# [(role, content)]role: user 或 assistant# 系统提示词self.system_prompt你是一名专业的客服代表具有以下特点 1. 友好、耐心、专业 2. 能够快速理解客户问题 3. 提供清晰、准确的答案 4. 对于不确定的问题会坦诚告知并提供进一步帮助的途径 客户服务原则 - 始终保持礼貌和专业 - 快速响应客户问题 - 提供具体的解决方案 - 必要时询问更多细节 # 初始化 Ollama LLMself.llmChatOllama(modelqwen3-coder:30b,temperature0.7,streamingFalse,cacheInMemoryCache()# 可选缓存)def_build_prompt(self,user_message:str)-str:根据系统提示和窗口记忆生成完整 promptprompt_parts[self.system_prompt]# 添加最近的对话历史forrole,contentinself.history[-self.window_size:]:prefix客户ifroleuserelse客服prompt_parts.append(f{prefix}{content})# 添加当前用户问题prompt_parts.append(f客户{user_message}\n客服)return\n.join(prompt_parts)defrespond(self,user_message:str)-str:生成响应并更新窗口记忆promptself._build_prompt(user_message)responseself.llm.invoke(prompt).content.strip()# 更新窗口记忆self.history.append((user,user_message))self.history.append((assistant,response))returnresponsedefreset(self):清空对话历史self.history.clear()# # 使用示例# if__name____main__:botCustomerServiceBot()print(客服机器人已启动输入 quit 退出\n)whileTrue:user_inputinput(客户: )ifuser_input.lower()quit:print(已退出对话。)breakresponsebot.respond(user_input)print(f客服:{response}\n)输出结果(输出结果中的客户是我自己输入的内容模拟客户和客服对话的过程)客服机器人已启动输入quit退出 客户: 我的东西什么时候发货 客服: 您好很抱歉为您查询订单发货信息。为了更好地帮助您我需要一些详细信息1. 您能提供订单号码吗通常在订单确认邮件或您的账户订单历史中2. 您购买的是什么商品3. 大概是什么时候下的订单 有了这些信息我就能为您准确查询发货状态了。 另外一般来说 - 普通订单通常在1-3个工作日内发货 - 特殊商品可能需要更长时间 - 促销活动期间可能会有延迟 请提供您的订单信息我会立即为您查询具体的发货时间 客户: 这样啊 那好吧 客服: 您好感谢您的耐心等待。 为了能准确告诉您具体的发货时间我需要您提供以下信息1. **订单号码**在订单确认邮件或账户订单历史中可以找到2. **商品名称**您购买了什么产品3. **下单时间**大概什么时候买的 有了这些信息我就能立即为您查询准确的发货状态了。 如果您暂时找不到订单信息也可以告诉我您的手机号或邮箱我可以帮您查找相关订单。 请问您现在方便提供这些信息吗我会尽快为您查询 客户: 没了谢谢 客服: 您好感谢您的回复。 如果您暂时无法提供订单信息我完全理解。不过为了能帮您查询具体的发货时间还是需要一些基本信息才能继续为您服务。 如果您后续找到了订单号码或其他相关信息欢迎随时联系我们我会第一时间为您查询。 另外如果您是通过我们的官方渠道下单的也可以 - 查看手机短信中的订单确认信息 - 登录账户查看订单历史记录 - 检查邮箱中的订单确认邮件 如果您有任何其他问题或需要进一步帮助请随时告诉我。祝您生活愉快 --- *此回复符合客服专业标准保持友好、提供帮助、不强求、给予选择、礼貌结束对话*场景 2代码生成助手流程说明用户输入编程语言和任务描述CodeGenerator使用PromptTemplate将输入格式化为完整 Prompt调用ChatOllama生成代码可以同步invoke()或流式stream()对返回内容进行异常处理返回最终代码或错误信息给用户用户CodeGeneratorPromptTemplateChatOllama响应处理输入语言和任务1根据输入生成完整 Prompt2返回格式化 Prompt3调用 invoke() 或 stream() 生成代码4返回生成内容流式或完整5异常检查与处理6输出最终代码或错误信息7用户CodeGeneratorPromptTemplateChatOllama响应处理 代码生成助手LangChain 1.0 Ollama 零警告、带异常处理、支持流式 from__future__importannotationsimportsysfromtypingimportOptionalfromlangchain_ollamaimportChatOllamafromlangchain.promptsimportPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromollamaimportClientasOllamaClient# 轻量检查模型是否存在OLLAMA_HOSThttp://localhost:11434# 按需修改classCodeGenerator:代码生成器兼容 LangChain 1.0def__init__(self,model:strqwen2.5:7b,temperature:float0.3,streaming:boolFalse,)-None:self.modelmodel self._validate_model()# 启动前自检self.llmChatOllama(base_urlOLLAMA_HOST,modelmodel,temperaturetemperature,streamingstreaming,)self.promptPromptTemplate(input_variables[language,task],template你是一名经验丰富的 {language} 开发者。 任务{task} 要求 1. 代码清晰、简洁 2. 添加必要注释 3. 遵循最佳实践 4. 包含错误处理 请生成完整可运行代码,)# 1.0 管道语法prompt | llm | parserself.chainself.prompt|self.llm|StrOutputParser()self.streamingstreaming# ---------- 工具 ----------def_validate_model(self)-None:本地不存在则自动拉取失败抛 RuntimeErrortry:clientOllamaClient(hostOLLAMA_HOST)models{m[model]forminclient.list()[models]}ifself.modelnotinmodels:print(f[Info] 本地未检测到{self.model}正在拉取...)client.pull(self.model)exceptExceptionase:raiseRuntimeError(fOllama 连接/拉取失败{e})frome# ---------- 主要 API ----------defgenerate(self,language:str,task:str)-str:同步生成返回字符串try:returnself.chain.invoke({language:language,task:task})exceptExceptionase:returnf[Error] 生成失败{e}defgenerate_stream(self,language:str,task:str):流式生成生成器逐段 yieldifnotself.streaming:yield[Warn] streamingFalse已强制返回完整文本\nyieldself.generate(language,task)returntry:forchunkinself.chain.stream({language:language,task:task}):yieldchunkexceptExceptionase:yieldf[Error] 流式生成失败{e}# # CLI 体验入口# if__name____main__:tasks[(Python,创建一个函数计算列表中所有数字的平均值包含异常处理),(JavaScript,写一个函数实现防抖debounce功能含注释),]genCodeGenerator(streamingTrue)# False 则一次性输出forlang,taskintasks:print(\n*70)print(f语言{lang}| 任务{task})print(*70\n)# 流式打印forpieceingen.generate_stream(lang,task):print(piece,end,flushTrue)print()输出结果:语言Python|任务创建一个函数计算列表中所有数字的平均值包含异常处理python def calculate_average(numbers): 计算列表中所有数字的平均值 参数: numbers(list): 包含数字的列表 返回: float: 数字的平均值 异常: TypeError: 当输入不是列表或列表中包含非数字元素时抛出 ValueError: 当列表为空时抛出# 检查输入是否为列表ifnot isinstance(numbers, list): raise TypeError(输入必须是一个列表)# 检查列表是否为空iflen(numbers)0: raise ValueError(列表不能为空)# 检查列表中的每个元素是否为数字fori, iteminenumerate(numbers):ifnot isinstance(item,(int, float)): raise TypeError(f列表中第 {i1} 个元素 {item} 不是数字)# 计算平均值totalsum(numbers)averagetotal / len(numbers)returnaverage def main(): 主函数用于测试 calculate_average 函数# 测试用例test_cases[[1,2,3,4,5],# 正常情况[10.5,20.3,30.2],# 浮点数[100],# 单个元素[1,2,3,4,5,6,7,8,9,10],# 多个元素]print( 正常测试用例 )fori, test_listinenumerate(test_cases,1): try: resultcalculate_average(test_list)print(f测试 {i}: {test_list} - 平均值: {result})except(TypeError, ValueError)as e: print(f测试 {i} 出错: {e})print(\n 异常处理测试 )# 异常测试用例error_test_cases[[],# 空列表[1,2,3,4],# 包含字符串[1,2, None,4],# 包含 Nonenot a list,# 非列表输入[1,2,3.5,hello,4],# 混合类型]fori, test_caseinenumerate(error_test_cases,1): try: resultcalculate_average(test_case)print(f异常测试 {i}: {test_case} - 平均值: {result})except(TypeError, ValueError)as e: print(f异常测试 {i}: {test_case} - 错误: {e})# 额外提供一个更简洁的版本如果需要def calculate_average_simple(numbers): 计算列表中所有数字的平均值简化版本 参数: numbers(list): 包含数字的列表 返回: float: 数字的平均值 异常: TypeError: 当输入不是列表或列表中包含非数字元素时抛出 ValueError: 当列表为空时抛出ifnot isinstance(numbers, list): raise TypeError(输入必须是一个列表)ifnot numbers: raise ValueError(列表不能为空)# 使用列表推导式检查所有元素是否为数字ifnot all(isinstance(x,(int, float))forxinnumbers): raise TypeError(列表中必须全部是数字)returnsum(numbers)/ len(numbers)if__name____main__:main()print(\n 简化版本测试 )try: resultcalculate_average_simple([1,2,3,4,5])print(f简化版本结果: {result})except(TypeError, ValueError)as e: print(f简化版本错误: {e})这个代码包含了以下特性## 主要功能1. **calculate_average()** - 主要函数计算平均值并包含完整的异常处理2. **main()** - 测试函数演示正常和异常情况3. **calculate_average_simple()** - 简化版本代码更简洁## 异常处理- 检查输入是否为列表 - 检查列表是否为空 - 检查列表中每个元素是否为数字int 或 float - 提供详细的错误信息## 最佳实践- 清晰的文档字符串 - 详细的注释 - 完整的测试用例 - 遵循 Python 编码规范 - 包含正常和异常情况的测试## 运行结果示例正常测试用例测试1:[1,2,3,4,5]-平均值:3.0测试2:[10.5,20.3,30.2]-平均值:20.333333333333332测试3:[100]-平均值:100.0测试4:[1,2,3,4,5,6,7,8,9,10]-平均值:5.5异常处理测试异常测试1:[]-错误: 列表不能为空 异常测试2:[1,2,3,4]-错误: 列表中第3个元素3不是数字 异常测试3:[1,2, None,4]-错误: 列表中第3个元素None不是数字 异常测试4: not a list -错误: 输入必须是一个列表 异常测试5:[1,2,3.5,hello,4]-错误: 列表中第4个元素hello不是数字语言JavaScript|任务写一个函数实现防抖debounce功能含注释javascript /** * 防抖函数 - 防止函数在短时间内被频繁调用 * param{Function}func - 需要防抖的函数 * param{number}delay - 延迟时间毫秒 * param{boolean}immediate - 是否立即执行可选默认false * returns{Function}返回防抖后的函数 * throws{Error}当参数类型不正确时抛出错误 */functiondebounce(func, delay, immediatefalse){// 参数类型检查if(typeof func!function){throw new Error(第一个参数必须是函数);}if(typeof delay!number||delay0){throw new Error(延迟时间必须是大于等于0的数字);}lettimeoutIdnull;// 存储定时器ID /** * 防抖后的函数 * param{...any}args - 原函数的参数 * returns{any}原函数的返回值 */returnfunction(...args){// 获取当前函数的上下文 const contextthis;// 清除之前的定时器if(timeoutId){clearTimeout(timeoutId);}// 如果设置为立即执行if(immediate){// 如果定时器不存在说明是第一次执行立即执行函数 const callNow!timeoutId;// 设置新的定时器用于下次触发时的延迟执行 timeoutIdsetTimeout((){timeoutIdnull;// 清空定时器ID允许下次立即执行}, delay);// 如果是第一次执行立即调用函数if(callNow){returnfunc.apply(context, args);}}else{// 普通防抖延迟执行 timeoutIdsetTimeout((){func.apply(context, args);}, delay);}};}// 使用示例 console.log( 防抖函数使用示例 );// 示例1普通防抖 const debouncedSearchdebounce(function(query){console.log(搜索:, query);// 模拟搜索请求return搜索结果:${query};},500);// 模拟频繁调用 debouncedSearch(a);debouncedSearch(ab);debouncedSearch(abc);// 只有最后一次会执行延迟500ms // 示例2立即执行防抖 const debouncedClickdebounce(function(event){console.log(点击事件:, event.target.id);return点击处理完成;},300,true);// 模拟点击事件 debouncedClick({target:{id:btn1}});debouncedClick({target:{id:btn2}});// 第一次会立即执行后续调用会被防抖 // 示例3错误处理演示 try{// 错误的参数类型 debounce(not a function,100);}catch(error){console.log(捕获错误:, error.message);}try{debounce(function(){}, -100);}catch(error){console.log(捕获错误:, error.message);}// 高级用法取消防抖functioncreateDebouncedFunction(func, delay){const debounceddebounce(func, delay);// 添加取消方法 debounced.cancelfunction(){if(timeoutId){clearTimeout(timeoutId);timeoutIdnull;}};returndebounced;}// 使用取消功能 const cancellableDebouncecreateDebouncedFunction(function(data){console.log(处理数据:, data);},1000);cancellableDebounce(test1);cancellableDebounce.cancel();// 取消执行 cancellableDebounce(test2);// 会正常执行 console.log(防抖函数演示完成); 这个防抖函数实现包含以下特性## 主要功能1. **普通防抖** - 在最后一次调用后延迟执行2. **立即执行防抖** - 第一次立即执行后续调用防抖3. **完整的参数验证** - 类型检查和错误处理4. **上下文保持** - 保持原函数的this指向5. **参数传递** - 支持传递任意参数给原函数## 特色功能- **错误处理** - 对参数类型进行严格检查 - **可取消** - 提供取消执行的功能 - **详细注释** - 每个部分都有清晰的注释说明 - **使用示例** - 包含多种使用场景的演示## 使用场景- 搜索框输入监听 - 窗口大小调整事件 - 按钮点击防抖 - 滚动事件处理 - 表单验证等需要防抖的场景总结Langchain的部分我们差不多就讲到这里接下来我们下一篇我们讲LangGraph学 LangChain 打造智能链式推理学 LangGraph 则是在此基础上构建复杂多节点知识与逻辑的可视化智能图使系统架构更直观、高效且易于管理。进阶学习资源官方资源LangChain 官方文档https://python.langchain.com/LangChain GitHubhttps://github.com/langchain-ai/langchainLangChain 教程https://python.langchain.com/docs/tutorials/