当前位置: 首页 > article >正文

AIGC学习笔记(9)——AI大模型开发工程师

文章目录

  • AI大模型开发工程师
    • 008 LangChain之Chains模块
      • 1 Chain模块核心知识
      • 2 Chain模块代码实战
        • LLM
        • Sequential
        • Transformation
        • Router

AI大模型开发工程师

008 LangChain之Chains模块

1 Chain模块核心知识

image.png

组合常用的模块

  • LLM:最常见的链式操作类型
  • SequentialChain:串联式调用语言模型链
  • RouterChain:实现条件判断的大模型调用
  • Transformation:数据传递过程中进行数据处理

2 Chain模块代码实战

LLM
  • 在任何LLM应用中,最常见的链接方式是将提示模板与LLM和可选的输出解析器组合起来。
  • 推荐的方法是使用LangChain表达式语言来实现。我们也继续支持传统的LLMChain,这是一个用于组合这三个组件的单个类。
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema import StrOutputParserprompt = PromptTemplate.from_template("What is a good name for a company that makes {product}?"
)chat_model = ChatOpenAI(model="gpt-3.5-turbo")
## 链式调用
runnable = prompt | chat_model | StrOutputParser()result = runnable.invoke({"product": "colorful socks"})
print(result)

以前的 API(已不推荐使用)

from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
from langchain.chains import LLMChainprompt_template = "What is a good name for a company that makes {product}?"llm = ChatOpenAI(model_name="gpt-3.5-turbo")llm_chain = LLMChain(llm=llm, prompt=PromptTemplate.from_template(prompt_template))result = llm_chain("colorful socks")
print(result)
Sequential
  • 在调用语言模型之后,下一步是对语言模型进行一系列的调用。当您希望将一次调用的输出作为另一次调用的输入时,这是特别有用的。
  • 推荐的方法是使用LangChain表达语言。遗留的方法是使用SequentialChain,为了向后兼容性,我们在此继续记录它。

示例:假设我们想创建一个链,首先创建剧情简介,然后根据简介生成一篇剧评。

from langchain.prompts import PromptTemplatesynopsis_prompt = PromptTemplate.from_template("""你是一位剧作家。给定一个剧目的标题,你的任务是为这个标题写一个剧情简介。标题: {title}
剧作家: 这是上述剧目的剧情简介:"""
)review_prompt = PromptTemplate.from_template("""您是《纽约时报》的戏剧评论家。根据剧情简介,您的工作是为该剧撰写一篇评论。.剧情简介:
{synopsis}
上述剧目的《纽约时报》剧评家的评论:"""
)from langchain.chat_models import ChatOpenAI
from langchain.schema import StrOutputParserllm = ChatOpenAI(model="gpt-4")chain = ({"synopsis": synopsis_prompt | llm | StrOutputParser()}| review_prompt| llm| StrOutputParser()
)
result = chain.invoke({"title": "日落时的海滩悲剧"})
print(result)

image.png

Transformation
  • 通常在组件之间传递输入时,我们希望对其进行转换。

例如,我们将创建一个虚拟转换,它接收一个超长的文本,将文本筛选为前三段,然后将其传递到一个链中进行摘要。

from langchain.prompts import PromptTemplateprompt = PromptTemplate.from_template("""对下面内容进行总结摘要:
{output_text}
摘要:"""
)with open("消失的她.txt",'r', encoding='utf-8') as f:state_of_the_union = f.read()from langchain.chat_models import ChatOpenAI
from langchain.schema import StrOutputParserllm = ChatOpenAI(model_name="gpt-3.5-turbo")runnable = ({"output_text": lambda text: "\n\n".join(text.split("\n\n")[:3])}| prompt| llm| StrOutputParser()
)
result = runnable.invoke(state_of_the_union)
print(result)
Router
  • 路由允许您创建非确定性链,其中前一步的输出定义下一步。路由有助于在与LLMs的交互中提供结构和一致性。

举例:假设我们有两个针对不同类型问题进行优化的模板,并且我们希望根据用户输入选择模板。

from langchain.prompts import PromptTemplate## 物理学家的模板
physics_template = """You are a very smart physics professor. \
You are great at answering questions about physics in a concise and easy to understand manner. \
When you don't know the answer to a question you admit that you don't know.Here is a question:
{input}"""
physics_prompt = PromptTemplate.from_template(physics_template)## 数学家的模板
math_template = """You are a very good mathematician. You are great at answering math questions. \
You are so good because you are able to break down hard problems into their component parts, \
answer the component parts, and then put them together to answer the broader question.Here is a question:
{input}"""
math_prompt = PromptTemplate.from_template(math_template)from langchain.chat_models import ChatOpenAI
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnableBranch## 其他通用问题的模块
general_prompt = PromptTemplate.from_template("You are a helpful assistant. Answer the question as accurately as you can.\n\n{input}"
)##路由分支
prompt_branch = RunnableBranch((lambda x: x["topic"] == "math", math_prompt),(lambda x: x["topic"] == "physics", physics_prompt),general_prompt,
)from typing import Literal
from langchain.pydantic_v1 import BaseModel
from langchain.output_parsers.openai_functions import PydanticAttrOutputFunctionsParser
from langchain_core.utils.function_calling import convert_pydantic_to_openai_function## 对用户问题分类,定义函数
class TopicClassifier(BaseModel):"Classify the topic of the user question"topic: Literal["math", "physics", "general"]"The topic of the user question. One of 'math', 'physics' or 'general'."## 转化为OpenAI function函数
classifier_function = convert_pydantic_to_openai_function(TopicClassifier)## 创建大模型
llm = ChatOpenAI(model="gpt-3.5-turbo").bind(functions=[classifier_function], function_call={"name": "TopicClassifier"}
)
## 定义对输出进行解析
## 输出的对象的属性为 topic
parser = PydanticAttrOutputFunctionsParser(pydantic_schema=TopicClassifier, attr_name="topic"
)
## 基于大模型对输出进行解析
classifier_chain = llm | parserfrom operator import itemgetterfrom langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnablePassthroughfinal_chain = (RunnablePassthrough.assign(topic=itemgetter("input") | classifier_chain)| prompt_branch| ChatOpenAI(model_name="gpt-3.5-turbo")| StrOutputParser()
)## 什么是大于40的第一个质数,使得这个质数加一可被3整除?
result = final_chain.invoke({"input": "What is the first prime number greater than 40 such that one plus the prime number is divisible by 3?"}
)print(result)

http://www.lryc.cn/news/2398471.html

相关文章:

  • git管理github上的repository
  • STM32学习之WWDG(原理+实操)
  • Keil MDK5.37或更高版本不再预装ARM Compiler Version5导致编译错误的解决方法
  • 【iOS(swift)笔记-14】App版本不升级时本地数据库sqlite更新逻辑二
  • 前端性能优化:提升用户体验的关键策略
  • Unity-UI组件详解
  • 基于大模型的短暂性脑缺血发作(TIA)全流程预测与干预系统技术方案
  • 嵌入式学习 D31:系统编程--Framebuf帧缓冲
  • 黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐
  • Java 大视界 -- Java 大数据在智能安防视频监控中的异常事件快速响应与处理机制(273)
  • 【数据库】安全性
  • 【图像处理入门】4. 图像增强技术——对比度与亮度的魔法调节
  • D2-基于本地Ollama模型的多轮问答系统
  • HALCON 深度学习训练 3D 图像的几种方式优缺点
  • 123网盘SDK-npm包已发布
  • 强制卸载openssl-libs导致系统异常的修复方法
  • 乐播视频v4.0.0纯净版体验:高清流畅的视听盛宴
  • Linux 命令全讲解:从基础操作到高级运维的实战指南
  • FreeRTOS的简单介绍
  • DeepSeek模型安全部署与对抗防御全攻略
  • Docker容器使用手册
  • 深入解析C++引用:从别名机制到函数特性实践
  • Fuse.js:打造极致模糊搜索体验
  • MyBatis分页插件(以PageHelper为例)与MySQL分页语法的关系
  • CentOS 7.9 安装 宝塔面板
  • 使用Redis作为缓存优化ElasticSearch读写性能
  • 项目交付后缺乏回顾和改进,如何持续优化
  • 从0开始学习R语言--Day15--非参数检验
  • Linux或者Windows下PHP版本查看方法总结
  • EC2 实例详解:AWS 的云服务器怎么玩?☁️