网站 通管局 报备,网站建设免费建站免费源代码,台州网站策划台州网站策划,360全景图制作前序
之前了解了Models#xff0c;Prompt#xff0c;但有些资料又把这块与输出合称为模型输入输出#xff08;Model I/O#xff09;#xff1a;这是与各种大语言模型进行交互的基本组件。它允许开发者管理提示#xff08;prompt#xff09;#xff0c;通过通用接口调…前序
之前了解了ModelsPrompt但有些资料又把这块与输出合称为模型输入输出Model I/O这是与各种大语言模型进行交互的基本组件。它允许开发者管理提示prompt通过通用接口调用语言模型并从模型输出中提取信息。简单来说这个组件负责与大语言模型“对话”将请求传递给模型并接收回复。 这篇文章就补充一下这个Ooutput的内容。
输出解释器
Output Parsers输出解析器是langchain中提供给我们对模型响应内容进行格式化输出的。LLM的输出为文本但在程序中除了显示文本如果希望获得更多不同的结构化数据时就可以使用langchain提供的输出解析器Output Parsers来完成了。输出解析器Output Parsers实际上就是结构化语言模型提供的响应处理工具类其提供了如下两个方法给开发者使用也是这些响应类必须实现的两个方法
get_format_instructions() - str 返回一个包含语言模型如何格式化输出的指令字符串。
invoke()- Any接受一个结构化言模型的响应对象并将其解析为指定格式
Str输出解析器
import os
from langchain_deepseek import ChatDeepSeek
from langchain.prompts import PromptTemplate# 初始化模型
os.environ[DEEPSEEK_API_KEY] sk-e2xxx
chat_model ChatDeepSeek(modeldeepseek-chat,temperature0.4,max_tokensNone,timeoutNone,max_retries2,)# 创建提示模板
prompt_template PromptTemplate(input_variables[context],template基于给定的文案以幽默诙谐的风格生成一段回答文本{context},
)# 使用模型生成文本
context 成都今天出太阳了天气真好我们翘班出去玩吧。
prompt prompt_template.format(contextcontext)
result chat_model.invoke(prompt)
print(result) 回答内容很长但是我们需要的只有content那串。引入StrOutputParser把返回的结果经过解析就只有文本结果内容了
...
from langchain_core.output_parsers import StrOutputParser
res StrOutputParser().invoke(inputresult)
print(res)List输出解析器 import os
from langchain_deepseek import ChatDeepSeek# 初始化模型
os.environ[DEEPSEEK_API_KEY] sk-e24324xxx
chat_model ChatDeepSeek(modeldeepseek-chat,temperature0.4,max_tokensNone,timeoutNone,max_retries2,)
from langchain_core.output_parsers import CommaSeparatedListOutputParser
from langchain_core.prompts import PromptTemplateparser CommaSeparatedListOutputParser()prompt PromptTemplate.from_template(template请列出5个{item}的不同叫法.\n{format_instructions}\n,partial_variables{format_instructions: parser.get_format_instructions()},
)messages prompt.invoke({item: 土豆})
print(messages)result chat_model.invoke(messages)
res parser.invoke(result)
print(res)
text请列出5个土豆的不同叫法.\nYour response should be a list of comma separated values, eg: foo, bar, baz or foo,bar,baz\n
[马铃薯, 洋芋, 土豆, 薯仔, 地蛋]Json输出解释器
其他内容大差不差把 CommaSeparatedListOutputParser换成JsonOutputParser就行 from pydantic import BaseModel, Field
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplateclass JsonParser(BaseModel):question: str Field(description问题)answer: str Field(description答案)parser JsonOutputParser(pydantic_objectJsonParser)prompt PromptTemplate(template回答问题.\n{format_instructions}\n{query}\n,input_variables[query],partial_variables{format_instructions: parser.get_format_instructions()},
)# print(parser.get_format_instructions())messages prompt.invoke({query: 讲一个脑筋急转弯的问题和答案。})
response chat_model.invoke(messages)
content parser.invoke(response)
print(content)
{question: 什么东西越洗越脏, answer: 水}stream输出解析器
如果输出内容很长一直等处理完才返回结果也不大好比如我们正常使用在线大模型它都是几个字几个字往外吐的不是最后直接给答案。 这里就需要用到stream输出解析器
import os
from langchain_deepseek import ChatDeepSeek# 初始化模型
os.environ[DEEPSEEK_API_KEY] sk-e24xxx
chat_model ChatDeepSeek(modeldeepseek-chat,temperature0.4,max_tokensNone,timeoutNone,max_retries2,)from langchain_ollama.llms import OllamaLLM
from langchain_core.prompts import PromptTemplateprompt_template PromptTemplate.from_template(你是一名名经验丰富的{role}{ability}{prompt})
messages prompt_template.invoke({role: 修仙小说作家, ability: 熟悉各种神话传说和修仙小说,prompt: 请你写一部与牧神记类似的小说要求全书至少600章每一章字数在8000字以上剧情紧凑各个角色的个性分明})
print(messages)for chunk in chat_model.stream(messages):print(chunk, end, flushTrue)或者这样不好看也可以用上面的字符串输出解释器来处理一下输出内容 from langchain_core.output_parsers import StrOutputParser# 修改一下输出这里
for chunk in chat_model.stream(messages):print(StrOutputParser().invoke(chunk), end, flushTrue)到这里就就开始慢慢帮我们写小说了。
Cache
如果每次问同样的都调用大模型推理那么会比较耗可以把问题和答案记录下来以后遇到同样的问题则不必再使用大模型推理。
基于langchain提供的输出缓存让LLM在遇到同一prompt时直接调用缓存中的结果也可以达到加速的效果。
# -*- coding: utf-8 -*-
# Author : John
# Time : 2025/02/27
# File : langchain_cache.pyimport time
import redis
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
# from langchain_community.cache import InMemoryCache # 把输出缓存到内存中
from langchain_community.cache import RedisCache # 把输出缓存到Redis数据库中
from langchain.globals import set_llm_cacheimport os
from langchain_deepseek import ChatDeepSeek# 初始化模型
os.environ[DEEPSEEK_API_KEY] sk-e243xxxf
chat_model ChatDeepSeek(modeldeepseek-chat,temperature0.4, # temperature 温度值数值越趋向0回答越谨慎数值越趋向1回答则越脑洞大开主要控制大模型输出的创造力max_tokensNone,timeoutNone,max_retries2,)prompt_template PromptTemplate.from_template(你是一个产品顾问。请给公司刚生产出来的 {production}取一个好听的名字和广告语。)
messages prompt_template.invoke({production: 充电宝})# 开启缓存
redis redis.Redis(localhost, port6379, passwordqwe123, db2)
set_llm_cache(RedisCache(redis))timers []
for _ in range(5):t1 time.time()response chat_model.invoke(messages)t2 time.time()print(t2 - t1, response)timers.append(t2 - t1)print(timers) 可以看到输出结果都是一致的。只有第一次真正请求了deepseek花了65s获得了结果后面都是第一次结果保存到redis从redis获取的。