手把手教你使用LangChain开发多功能聊天机器人:二、模型的调用以及获取大模型的响应
一、模型调用前的核心准备
在正式调用大模型前,开发者需完成三项关键准备:
-
模型选择与兼容性验证
LangChain支持OpenAI GPT系列、HuggingFace Transformers、Anthropic Claude等主流模型。选择时需考虑:- 模型能力:文本生成、逻辑推理、多模态处理等
- 响应速度:实时交互场景需优先选择低延迟模型
- 成本预算:按需选择付费API或开源本地部署方案
示例代码(验证模型可用性):
from langchain.llms import OpenAI, HuggingFaceHubtry:llm = OpenAI(model_name="gpt-3.5-turbo", temperature=0.7)response = llm.predict("你好")print(f"模型响应成功:{response}")except Exception as e:print(f"模型初始化失败:{str(e)}")
-
API密钥安全配置
推荐使用环境变量存储敏感信息:import osfrom dotenv import load_dotenvload_dotenv()OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
-
响应格式预定义
通过response_format参数控制输出结构:llm = OpenAI(model_name="gpt-4",response_format={"type": "json_object"},max_tokens=500)
二、模型调用的四种核心方式
1. 直接调用(LLM Chain)
适用于简单问答场景:
from langchain.chains import LLMChainfrom langchain.prompts import PromptTemplatetemplate = """用户问题:{question}请用Markdown格式回答,包含步骤说明和示例代码"""prompt = PromptTemplate(template=template, input_variables=["question"])chain = LLMChain(llm=llm, prompt=prompt)response = chain.run("如何用Python实现文件下载?")
2. 结构化调用(Structured Output)
通过OutputParser解析JSON响应:
from langchain.output_parsers import PydanticOutputParserfrom pydantic import BaseModelclass Answer(BaseModel):text: strcode_example: strparser = PydanticOutputParser(pydantic_object=Answer)prompt = PromptTemplate(template="生成包含{text}和{code_example}的JSON回答",input_variables=[],partial_variables={"format_instructions": parser.get_format_instructions()})
3. 流式响应(Streaming)
实现实时打字效果:
from langchain.callbacks import StreamingStdOutCallbackHandlerstream_handler = StreamingStdOutCallbackHandler()llm = OpenAI(model_name="gpt-3.5-turbo",streaming=True,callbacks=[stream_handler])response = llm("生成一篇科技文章开头...")
4. 多模型协同(Router Chain)
根据问题类型动态选择模型:
from langchain.chains import RouterChainfrom langchain.chains.router import MultiPromptRouteroutes = {"math": MultiPromptRoute(destination_chain=MathLLMChain(),example_input="计算1+1="),"general": MultiPromptRoute(destination_chain=GeneralLLMChain(),example_input="今天天气如何?")}router = RouterChain(routes=routes)
三、响应处理与优化技巧
1. 响应质量提升策略
- 温度参数:
temperature=0.7(创意性) vstemperature=0.1(确定性) - Top-p采样:
top_p=0.9控制输出多样性 - 频率惩罚:
frequency_penalty=0.5减少重复
2. 错误处理机制
from langchain.callbacks import CallbackManagerfrom langchain.callbacks.base import BaseCallbackHandlerclass ErrorHandler(BaseCallbackHandler):def on_llm_error(self, error, **kwargs):print(f"模型错误:{str(error)}")# 降级策略:切换备用模型return OpenAI(model_name="gpt-3.5-turbo-16k")manager = CallbackManager([ErrorHandler()])llm = OpenAI(model_name="gpt-4", callback_manager=manager)
3. 响应缓存优化
from langchain.cache import SQLiteCachecache = SQLiteCache("llm_cache.db")llm = OpenAI(model_name="gpt-3.5-turbo", callbacks=[cache])# 相同问题第二次调用将从缓存获取
四、实战场景解析
场景1:电商客服机器人
from langchain.prompts import ChatPromptTemplatefrom langchain.schema import HumanMessagetemplate = """用户:{query}历史对话:{history}当前角色:电商客服必须:提供退换货政策链接"""prompt = ChatPromptTemplate.from_template(template)messages = [HumanMessage(content="我想退换刚买的手机"),# 添加历史对话...]response = llm.generate([prompt.format_prompt(**context)])
场景2:技术文档生成
from langchain.document_loaders import TextLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitterloader = TextLoader("api_docs.txt")documents = loader.load()text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000)texts = text_splitter.split_documents(documents)# 结合检索增强生成(RAG)from langchain.chains import RetrievalQAfrom langchain.vectorstores import FAISSfrom langchain.embeddings import OpenAIEmbeddingsembeddings = OpenAIEmbeddings()docsearch = FAISS.from_documents(texts, embeddings)qa_chain = RetrievalQA.from_chain_type(llm=llm,chain_type="stuff",retriever=docsearch.as_retriever())response = qa_chain.run("如何调用API?")
五、性能监控与调优
-
响应时间分析:
import timestart = time.time()response = llm.predict("复杂问题")latency = time.time() - startprint(f"响应耗时:{latency:.2f}秒")
-
令牌消耗统计:
from langchain.callbacks import TokenUsageRecorderrecorder = TokenUsageRecorder()llm = OpenAI(model_name="gpt-4", callbacks=[recorder])# 调用后可通过recorder.last_tokens_used获取数据
-
A/B测试框架:
def test_model_performance():models = ["gpt-3.5-turbo", "gpt-4", "claude-2"]results = {}for model in models:llm = OpenAI(model_name=model)start = time.time()response = llm.predict("测试问题")results[model] = {"time": time.time() - start,"length": len(response)}return results
六、常见问题解决方案
-
超时问题:
- 增加
timeout参数:llm = OpenAI(timeout=30) - 启用异步调用:
await llm.acall("问题")
- 增加
-
内容过滤:
from langchain.llms.openai import OpenAIllm = OpenAI(model_name="gpt-3.5-turbo",safety_settings=[{"category": "hate", "threshold": 0.5},{"category": "sexual", "threshold": 0.5}])
-
多语言支持:
llm = OpenAI(model_name="gpt-3.5-turbo",request_timeout=60,headers={"Accept-Language": "zh-CN"})
通过系统化的模型调用方法和响应处理策略,开发者可以构建出既稳定又高效的智能聊天机器人。实际开发中建议结合具体业务场景,通过持续监控和迭代优化达到最佳效果。