langchain 入门指南 - 链式请求

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: langchain 入门指南 - 链式请求

langchain 中,我们可以将一个任务拆分为多个更简单的子任务,不同的子任务使用不同的 LLM 来处理。

正如在软件工程中,将复杂系统分解为一组模块化组件是一种良好实践一样,对于提交给 GPT 的任务也是如此。

复杂任务的错误率往往高于简单任务。此外,复杂任务通常可以重新定义为简单任务的工作流程,

其中较早任务的输出用于构建较晚任务的输入。

再有一种场景是,有些简单的任务,我们可以交给一些效率更高、更廉价的 LLM 进行处理。

而对于复杂一点的任务,我们可以交给一些能力更强的 LLM 进行处理(同时可能更加昂贵)。

这就等同于一个团队中,有些任务可以交给实习生,有些任务可以交给初级工程师,有些任务可以交给高级工程师。

如果一些简单的任务交给高级工程师,可能会浪费资源,而一些复杂的任务交给实习生,可能会导致任务无法完成。

又或者,不同的 LLM 的能力是不一样的(比如一些模型能处理图像,一些模型只能处理文本),我们拆分任务,让不同的 LLM 分别处理,最后将结果整合。

实例一

在下面这个例子中,我们使用了两个 LLM:零一万物的 yi-large 和 OpenAI 的 gpt-3.5-turbo

要处理的任务是,根据用户输入的内容:

  1. 总结其内容。
  2. 将总结的内容翻译成英文。
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
# 使用 OpenAI 的 LLM 处理总结的任务
openai_llm = ChatOpenAI(
    model_name="gpt-3.5-turbo",
    temperature=0,
    max_tokens=200,
    api_key="your key",
    base_url="https://api.openai-hk.com/v1",
)
summarizing_prompt_template = """
总结以下文本为一个 20 字以内的句子:
---
{content}
"""
prompt = PromptTemplate.from_template(summarizing_prompt_template)
summarizing_chain = prompt | openai_llm | StrOutputParser()
# 使用零一万物的 LLM 处理翻译的任务
yi_llm = ChatOpenAI(
    model_name="yi-large",
    temperature=0,
    max_tokens=200,
    api_key="your key",
    base_url="https://api.lingyiwanwu.com/v1",
)
translating_prompt_template = """将{summary}翻译成英文"""
prompt = PromptTemplate.from_template(translating_prompt_template)
translating_chain = prompt | yi_llm | StrOutputParser()
overall_chain = summarizing_chain | translating_chain
response = overall_chain.invoke({"content": "这是一个测试。"})
print(response)

输出:

This is a test.

在这个例子中,我们依然是使用了管道操作的方式,将两个 LLM 连接在一起,最终得到了我们想要的结果。

实例二

在上面例子的基础上,再调用一个新的模型,并且显示 langchain 的实际处理过程。

下面使用了 LLMChain,因为上面的 prompt | openai_llm 返回的结果并不能作为 SequentialChain 的参数。

同时也加上了 verbose=True 参数,以便查看处理过程。

from langchain.chains.llm import LLMChain
from langchain.chains.sequential import SequentialChain
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
# 使用 OpenAI 的 LLM 处理总结的任务
openai_llm = ChatOpenAI(
    model_name="gpt-3.5-turbo",
    temperature=0,
    max_tokens=200,
    api_key="your key",
    base_url="https://api.openai-hk.com/v1",
)
summarizing_prompt_template = """
总结以下文本为一个 20 字以内的句子:
---
{content}
"""
prompt = PromptTemplate.from_template(summarizing_prompt_template)
summarizing_chain = LLMChain(llm=openai_llm, prompt=prompt, output_key="summary", verbose=True)
# 使用零一万物的 LLM 处理翻译的任务
yi_llm = ChatOpenAI(
    model_name="yi-large",
    temperature=0,
    max_tokens=200,
    api_key="your key",
    base_url="https://api.lingyiwanwu.com/v1",
)
translating_prompt_template = """将{summary}翻译成英文"""
prompt = PromptTemplate.from_template(translating_prompt_template)
translating_chain = LLMChain(llm=yi_llm, prompt=prompt, output_key="translated", verbose=True)
# 智谱清言 LLM 统计翻译后句子的长度
zhipu_llm = ChatOpenAI(
    model_name="glm-4",
    temperature=0,
    max_tokens=200,
    api_key="your key",
    base_url="https://open.bigmodel.cn/api/paas/v4/",
)
translating_prompt_template = """统计{translated}的长度"""
prompt = PromptTemplate.from_template(translating_prompt_template)
stat_chain = LLMChain(llm=zhipu_llm, prompt=prompt, output_key="result", verbose=True)
overall_chain = SequentialChain(
    chains=[summarizing_chain, translating_chain, stat_chain],
    input_variables=["content"],
    output_variables=["result"],
    verbose=True
)
response = overall_chain.invoke({"content": "这是一个测试。"})
print(response)

输出:

> Entering new SequentialChain chain...
> Entering new LLMChain chain...
Prompt after formatting:
总结以下文本为一个 20 字以内的句子:
---
这是一个测试。
> Finished chain.
> Entering new LLMChain chain...
Prompt after formatting:
将这是一个测试。翻译成英文
> Finished chain.
> Entering new LLMChain chain...
Prompt after formatting:
统计This is a test.的长度
> Finished chain.
> Finished chain.
{'content': '这是一个测试。', 'result': '字符串"This is a test."的长度是14个字符。这里包括了空格和句号。'}

输出的模式为:每使用一个 chain,都会输出一行 Entering new LLMChain chain...,在处理完成后,会输出处理结果,接着输出 Finished chain.

总结

langchain 中,我们可以将多个 LLM 连接在一起,形成一个链式请求,以便处理更复杂的任务。

将不同的任务交给不同的 LLM 处理,可以提高效率,降低成本。


相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
1月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
267 2
|
3月前
langchain 入门指南 - 使用 Agent
langchain 入门指南 - 使用 Agent
156 0
|
3月前
|
安全 API 数据库
langchain 入门指南 - 函数调用
langchain 入门指南 - 函数调用
124 1
|
3月前
|
机器学习/深度学习
langchain 入门指南 - In-context Learning
langchain 入门指南 - In-context Learning
96 0
|
1月前
|
人工智能 前端开发 JavaScript
前端大模型入门(二):掌握langchain的核心Runnable接口
Langchain.js 是 Langchain 框架的 JavaScript 版本,专为前端和后端 JavaScript 环境设计。最新 v0.3 版本引入了强大的 Runnable 接口,支持灵活的执行方式和异步操作,方便与不同模型和逻辑集成。本文将详细介绍 Runnable 接口,并通过实现自定义 Runnable 来帮助前端人员快速上手。
|
3月前
|
存储 机器学习/深度学习 传感器
langchain 入门指南 - 实现一个多模态 chatbot
langchain 入门指南 - 实现一个多模态 chatbot
115 0
|
3月前
|
前端开发 人机交互
langchain 入门指南 - ReAct 模式
langchain 入门指南 - ReAct 模式
93 1
|
3月前
|
存储 人工智能 缓存
langchain 入门指南 - 让 AI 记住你说过的话
langchain 入门指南 - 让 AI 记住你说过的话
117 1
|
3月前
|
人工智能 搜索推荐 API
langchain 入门指南 - 让 AI 从互联网获取信息
langchain 入门指南 - 让 AI 从互联网获取信息
84 1
|
3月前
|
Linux
langchain 入门指南 - 使用提示词模板
langchain 入门指南 - 使用提示词模板
176 1