Model I/O | 豆包MarsCode AI刷题

115 阅读5分钟

前言

模型是langchain框架的最底层,是构成语言模型应用的核心元素,因为langchain应用开发就是以langchain作为框架,通过API调用大模型解决实际问题,整个langchian框架的逻辑都是由LLM(large language model)这个发动机来驱动,没有模型langchain就失去存在的意义。

使用过程

可以把模型使用过程分为三大类:输入提示,调用模型,输出解析,这三块形成一个整体,在langchain中被称为Model I/O

  1. 提示模板:使用模型的第一个环节是把提示信息输入到模型中,你可以创建LangChain模板,根据实际需求动态选择不同的输入,针对特定的任务和应用调整输入。
  2. 语言模型:LangChain允许你通过通用接口来调用语言模型。这意味着无论你要使用的是哪种语言模型,都可以通过同一种方式进行调用,这样就提高了灵活性和便利性。
  3. 输出解析:LangChain还提供了从模型输出中提取信息的功能。通过输出解析器,你可以精确地从模型的输出中获取需要的信息,而不需要处理冗余或不相关的数据,更重要的是还可以把大模型给回的非结构化文本,转换成程序可以处理的结构化数据。

提示模板具体原则:基于模型清晰清楚的提示,让模型慢慢思考。 如下

# 导入LangChain中的提示模板 
from langchain.prompts import PromptTemplate 
# 创建原始模板 
template = """您是一位专业的鲜花店文案撰写员。\n 
对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗? """ 
# 根据原始模板创建LangChain提示模板 
prompt = PromptTemplate.from_template(template) 
# 打印LangChain提示模板的内容 
print(prompt)

运用langchain中PromptTemplate的from_template将一个原始的模板字符串转化为一个更丰富、更方便操作的PromptTemplate对象。

语言模型

langchain支持的模型有三大类:大语言模型(LLM),聊天模型,文本嵌入模型(embedding Model)

使用langchain能更方便切换使用不同模型,不需要修改相关代码

关于huggingface

huggingface有许多开源模型使用(国内ban不太方便) langchain中huggingfacehub方法通过api访问huggingface.co从而获得你需要使用的模型,国内ban了huggingface,访问超时无法连接,没法直接通过API访问。

这么好的网站不能直接放弃(看到有老哥分享直接通过API调用,但是老哥省流还没发出来,哈哈哈)

  • 把模型手动下载云端空间内,本地加载模型的方式跑 (我比较菜没能成功下载到云端)
  • 通过镜像网站下载至本地,本地动用模型(hf-mirror.com
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

from transformers import pipeline

pipe = pipeline(model="google/flan-t5-large")
output = pipe("I have a problem with my iphone that needs to be resolved asap!")

print(output[0]['generated_text'])
  • 据传可以在unity里面加url(额,别人方法没试过,大概率可行)

emmm好像有点问题,只能输出简单的字符串相接,没搞明白是模型问题还是方法问题,初步估计是模型问题,具体还有待深究。

输出解析

LangChain提供的解析模型输出的功能,能更容易地从模型输出中获取结构化的信息。

langchain中的输出解释器可以将笼统的语言转成清晰的数据结构,通过StructuredOutputParser.from_response_schemas方法创建了一个输出解析器。

# 导入结构化输出解析器和ResponseSchema 
from langchain.output_parsers import StructuredOutputParser, ResponseSchema 
# 定义我们想要接收的响应模式 
response_schemas = [ ResponseSchema(name="description", description="鲜花的描述文案"),
                     ResponseSchema(name="reason", description="问什么要这样写这个文案") ] 
# 创建输出解析器 
output_parser = StructuredOutputParser.from_response_schemas(response_schemas) 
# 获取格式指示 
format_instructions = output_parser.get_format_instructions() 
# 根据原始模板创建提示,同时在提示中加入输出解析器的说明 
prompt = PromptTemplate.from_template(prompt_template, 
                                      partial_variables={"format_instructions": format_instructions})

根据原始字符串和输出解释器创建的新的提示模板,再通过新的模板生成模型的输入,得到的模型输出结构将尽最大可能遵循我们的指示,便于输出解析器进行解析。

总结时刻

LangChain提供了模块化的提示管理,使开发者能更灵活地构建复杂的提示,并轻松调整模型输出格式,提高开发效率。LangChain支持多种LLM和工具的无缝集成,使得开发者可以方便地在不同模型间切换或添加功能模块。

通过 format_instructions,模型生成的响应会遵循开发者定义的格式结构。可以通过打印 partial_variables 中加入的提示内容来验证,通常会看到提示中明确要求输出特定的结构化格式,例如指定为JSON对象的属性或键值结构。

使用了输出解析器和 format_instructions,仍然不能完全保证输出符合预期的格式。这是因为模型输出依赖于其训练数据和对提示的理解。可以精细化 format_instructions 的描述,提高模型理解提示的准确性。在LangChain中利用回调或循环,检测到格式错误时,自动重新调用模型。