LangChain实战:如何用LLMChain快速搭建一个AI笑话生成器(附完整代码)

发布时间:2026/5/28 1:50:42

LangChain实战:如何用LLMChain快速搭建一个AI笑话生成器(附完整代码) LangChain实战用LLMChain构建AI笑话生成器的完整指南在人工智能应用开发领域LangChain已经成为连接大型语言模型(LLM)与实际业务场景的重要桥梁。本文将带你从零开始通过构建一个完整的AI笑话生成器深入掌握LLMChain这一核心组件的实战应用技巧。1. 环境准备与基础配置在开始构建笑话生成器之前我们需要先搭建好开发环境。以下是所需的工具和库# 安装必要依赖 pip install langchain openai python-dotenv建议使用Python 3.8或更高版本并创建一个.env文件来管理API密钥OPENAI_API_KEY你的API密钥基础配置完成后我们可以初始化语言模型。对于笑话生成这种创意性任务适当提高temperature参数可以获得更有趣的输出from langchain.llms import OpenAI from dotenv import load_dotenv load_dotenv() llm OpenAI(temperature0.7) # 0.7的温度值平衡了创意与连贯性2. 构建笑话生成链的核心逻辑LLMChain的核心价值在于将提示模板与语言模型有机结合。我们先设计一个专门用于生成笑话的提示模板from langchain.prompts import PromptTemplate joke_template 你是一位专业的喜剧编剧擅长创作{category}类笑话。 请根据以下要求创作笑话 - 语言{language} - 长度{length} - 风格{style} 主题{topic} prompt PromptTemplate( input_variables[category, language, length, style, topic], templatejoke_template )这个模板设计了多个可控参数让我们可以生成不同类型和风格的笑话。接下来将其与LLM结合from langchain.chains import LLMChain joke_chain LLMChain( llmllm, promptprompt, verboseTrue # 开启详细日志便于调试 )3. 高级功能实现与参数优化基础笑话生成器已经可以工作但我们可以通过多种方式增强其功能。3.1 多参数控制生成通过调整输入参数我们可以获得不同风格的笑话输出# 生成一个简短的英语双关语笑话 response joke_chain.run({ category: 双关语, language: 英文, length: 简短, style: 冷幽默, topic: 程序员 }) print(response)3.2 批量生成与选择利用apply方法可以一次性生成多个笑话然后筛选最佳结果topics [医生, 工程师, 老师] inputs [{topic: t, category: 职业, language: 中文, length: 中等, style: 温馨} for t in topics] jokes joke_chain.apply(inputs) for i, joke in enumerate(jokes, 1): print(f笑话{i}: {joke[text]}\n)3.3 记忆功能实现为了让笑话生成器能记住之前的对话我们可以添加ConversationBufferMemoryfrom langchain.memory import ConversationBufferMemory memory ConversationBufferMemory() joke_chain_with_memory LLMChain( llmllm, promptprompt, memorymemory, verboseTrue ) # 第一次交互 response1 joke_chain_with_memory.run({ topic: 猫, category: 动物, language: 中文, length: 短, style: 搞笑 }) # 第二次交互会记住之前的上下文 response2 joke_chain_with_memory.run({ topic: 狗, category: 动物, language: 中文, length: 短, style: 搞笑 })4. 部署与性能优化完成开发后我们需要考虑如何将笑话生成器部署为可用服务。4.1 简单API封装使用FastAPI可以快速创建Web服务from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class JokeRequest(BaseModel): topic: str category: str 通用 language: str 中文 length: str 中等 style: str 幽默 app.post(/generate-joke) async def generate_joke(request: JokeRequest): response joke_chain.run(request.dict()) return {joke: response}4.2 性能优化技巧对于高频使用的笑话生成服务可以考虑以下优化策略缓存机制对相同参数的请求返回缓存结果批量处理使用generate替代run处理批量请求模型微调针对笑话生成任务微调专属模型# 缓存示例 from langchain.cache import InMemoryCache from langchain.llms import OpenAI llm OpenAI(temperature0.7) llm.cache InMemoryCache() # 第一次请求会调用API joke1 joke_chain.run({topic: 熊猫, language: 中文}) # 相同参数的第二次请求会直接从缓存读取 joke2 joke_chain.run({topic: 熊猫, language: 中文})4.3 错误处理与日志健壮的服务需要完善的错误处理机制import logging from openai.error import APIError logging.basicConfig(filenamejoke_generator.log, levellogging.INFO) def safe_generate_joke(params): try: response joke_chain.run(params) logging.info(f成功生成笑话主题{params[topic]}) return response except APIError as e: logging.error(fAPI错误{str(e)}) return 服务暂时不可用请稍后再试 except Exception as e: logging.error(f未知错误{str(e)}) return 生成笑话时出现错误5. 创意扩展与进阶应用基础功能实现后我们可以探索更有趣的扩展方向。5.1 多链组合创作使用SequentialChain将多个LLMChain串联实现更复杂的创作流程from langchain.chains import SequentialChain # 创建笑话生成链 joke_chain LLMChain( llmllm, promptPromptTemplate( input_variables[topic], template创作一个关于{topic}的笑话 ), output_keyjoke ) # 创建评分链 rating_chain LLMChain( llmllm, promptPromptTemplate( input_variables[joke], template给这个笑话的搞笑程度打分(1-10分):\n{joke} ), output_keyrating ) # 组合两个链 overall_chain SequentialChain( chains[joke_chain, rating_chain], input_variables[topic], output_variables[joke, rating], verboseTrue ) result overall_chain({topic: 程序员}) print(f笑话{result[joke]}) print(f评分{result[rating]})5.2 个性化风格学习通过Few-shot learning让模型学习特定的幽默风格from langchain.prompts import FewShotPromptTemplate examples [ { input: 程序员, output: 为什么程序员总是分不清万圣节和圣诞节\n因为Oct 31 Dec 25 }, { input: 数学家, output: 数学家为什么不喜欢喝酒\n因为他们已经有无数的证明了 } ] example_prompt PromptTemplate( input_variables[input, output], template主题{input}\n笑话{output} ) few_shot_prompt FewShotPromptTemplate( examplesexamples, example_promptexample_prompt, suffix主题{input}\n笑话, input_variables[input] ) style_joke_chain LLMChain(llmllm, promptfew_shot_prompt) print(style_joke_chain.run(物理学家))5.3 多模态扩展结合图像生成API创建带插图的幽默内容def generate_illustrated_joke(topic): # 生成笑话文本 joke joke_chain.run({topic: topic}) # 生成插图描述 illustration_prompt f为这个笑话创作一个插图的详细描述{joke} illustration_desc llm(illustration_prompt) return { joke: joke, illustration_desc: illustration_desc # 实际应用中可调用图像生成API }6. 实际应用中的经验分享在开发过程中有几个关键点值得注意温度参数调节对于笑话生成0.7-0.9的温度值通常效果最佳太低会导致输出过于保守太高则可能产生无厘头内容提示工程技巧在提示中加入确保笑话确实好笑等要求可以显著提高输出质量内容过滤实际应用中建议添加内容过滤机制避免生成不当内容# 内容安全过滤示例 def is_joke_appropriate(joke): safety_check llm( f判断以下笑话是否适合所有年龄段(只回答是或否):\n{joke} ) return 是 in safety_check.lower() safe_joke None attempts 0 while not safe_joke and attempts 3: temp_joke joke_chain.run({topic: 学校}) if is_joke_appropriate(temp_joke): safe_joke temp_joke attempts 1

相关新闻