LangChain

使用Baidu Qianfan平台结合Langchain进行文本生成的实践 Baidu Qianfan是百度云提供的一站式大模型开发和服务运营平台,专为企业开发者设计。Qianfan不仅提供自研模型如文心一言(ERNIE-Bot)和第三方开源模型,还提供多种AI开发工具和完整的开发环境,方便用户开发大模型应用。该平台支持各种类型的模型,包括Embedding、Chat和Completion等。在本篇文章中,我们将介绍如何使用Langchain与Qianfan进行文本完成任务。 阅读详情

前言

  • LangChain 也是一套面向大模型的开发框架(SDK)
  • LangChain 是 AGI 时代软件工程的一个探索和原型
  • 学习 LangChain 要关注接口变更

LangChain 的核心组件

  1. 模型 I/O 封装
    • LLMs:大语言模型
    • Chat Models:一般基于 LLMs,但按对话结构重新封装
    • PromptTemple:提示词模板
    • OutputParser:解析输出
  2. 数据连接封装
    • Document Loaders:各种格式文件的加载器
    • Document Transformers:对文档的常用操作,如:split, filter, translate, extract metadata, etc
    • Text Embedding Models:文本向量化表示,用于检索等操作(啥意思?别急,后面详细讲)
    • Verctorstores: (面向检索的)向量的存储
    • Retrievers: 向量的检索
  3. 对话历史管理
    • 对话历史的存储、加载与剪裁
  4. 架构封装
    • Chain:实现一个功能或者一系列顺序功能组合
    • Agent:根据用户输入,自动规划执行步骤,自动选择每步需要的工具,最终完成用户指定的功能
      • Tools:调用外部功能的函数,例如:调 google 搜索、文件 I/O、Linux Shell 等等
      • Toolkits:操作某软件的一组工具集,例如:操作 DB、操作 Gmail 等等
  5. Callbacks

在这里插入图片描述

文档(以 Python 版为例)

  • 功能模块:https://python.langchain.com/docs/get_started/introduction
  • API 文档:https://api.python.langchain.com/en/latest/langchain_api_reference.html
  • 三方组件集成:https://python.langchain.com/docs/integrations/platforms/
  • 官方应用案例:https://python.langchain.com/docs/use_cases
  • 调试部署等指导:https://python.langchain.com/docs/guides/debugging

一、模型 I/O 封装

把不同的模型,统一封装成一个接口,方便更换模型而不用重构代码。

1.1 模型 API:LLM vs. ChatModel

# pip install --upgrade langchain
# pip install --upgrade langchain-openai
# pip install --upgrade langchain-community

1.1.1 OpenAI 模型封装

from langchain_openai import ChatOpenAI
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())

llm = ChatOpenAI(model="gpt-4o-mini")  # 默认是gpt-3.5-turbo
response = llm.invoke("你是谁")
print(response.content)
我是一个人工智能助手,旨在回答问题和提供信息。如果你有任何问题或需要帮助,请随时告诉我!

1.1.2 多轮对话 Session 封装

from langchain_openai import ChatOpenAI
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())

llm = ChatOpenAI(model="gpt-4o-mini")  # 默认是gpt-3.5-turbo

from langchain.schema import (
    AIMessage,  # 等价于OpenAI接口中的assistant role
    HumanMessage,  # 等价于OpenAI接口中的user role
    SystemMessage  # 等价于OpenAI接口中的system role
)

messages = [
    SystemMessage(content="你是大模型应用开发教程的专业老师。"),
    HumanMessage(content="我是学员,我叫Rivers。"),
    AIMessage(content="欢迎!"),
    HumanMessage(content="我是谁")
]

ret = llm.invoke(messages)

print(ret.content)
你是Rivers,想要学习大模型应用开发的学员。如果你有任何问题或者需要帮助的地方,请告诉我!
划重点:通过模型封装,实现不同模型的统一接口调用

1.1.3 换个国产模型

pip install qianfan

千帆AK和SK如何获取:

在这里插入图片描述

# 其它模型分装在 langchain_community 底包中
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.messages import HumanMessage

llm = QianfanChatEndpoint(
    qianfan_ak="xxx",
    qianfan_sk="xxx"
)

messages = [
    HumanMessage(content="介绍一下你自己")
]

ret = llm.invoke(messages)

print(ret.content)

当然现在新版千帆大模型官网提示:v2版本推理接口,兼容OpenAI协议基于API Key认证。如果需要继续创建旧版应用,也就是代码中将不能用ak和sk了,需要申请apikey:
在这里插入图片描述
代码可以改为:

from openai import OpenAI

client = OpenAI(
    api_key="bce-v3/ALTAK-xxx",  # 替换为控制台获取的API Key
    base_url="https://qianfan.baidubce.com/v2"  # V2接口统一域名
)

# 调用ERNIE-4.0模型
response = client.chat.completions.create(
    model="ernie-4.0-turbo-8k",  # V2支持的模型标识
    messages=[{
   
   "role": "user", "content": "介绍一下你自己"}]
)
print(response.choices[0].message.content)

1.2 模型的输入与输出

在这里插入图片描述

1.2.1 Prompt 模板封装

  1. PromptTemplate 可以在模板中自定义变量
from langchain.prompts import PromptTemplate

template = PromptTemplate.from_template("给我讲个关于{subject}的笑话")
print("===Template===")
print(template)
print("===Prompt===")
print(template.format(subject='小明'))
===Template===
input_variables=['subject'] template='给我讲个关于{subject}的笑话'
===Prompt===
给我讲个关于小明的笑话
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())
template = PromptTemplate.from_template("给我讲个关于{subject}的笑话")
print("===Template===")
print(template)
print("===Prompt===")
print(template.format(subject='小明'))
# 定义 LLM
llm = ChatOpenAI()
# 通过 Prompt 调用 LLM
ret = llm.invoke(template.format(subject='小明'))
# 打印输出
print(ret.content)
===Template===
input_variables=['subject'] input_types={} partial_variables={} template='给我讲个关于{subject}的笑话'
===Prompt===
给我讲个关于小明的笑话
好的,这有一个关于小明的笑话:

小明问爸爸:“爸爸,为什么房子会有窗户?”
爸爸答道:“因为房子要呼吸。”
小明说:“那为什么我看到的房子没有喘气呢?”
  1. ChatPromptTemplate 用模板表示的对话上下文
from langchain.prompts import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    SystemMessagePromptTemplate,
)

from langchain_openai import ChatOpenAI

from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())
template = ChatPromptTemplate.from_messages(
    [
        SystemMessagePromptTemplate.from_template(
            "你是{product}工程师。你的名字叫{name}"),
        HumanMessagePromptTemplate.from_template("{query}"),
    ]
)

llm = ChatOpenAI()
prompt = template.format_messages(
    product="大模型应用开发",
    name="Rivers",
    query="你是谁"
)

print(prompt)

ret = llm.invoke(prompt)

print(ret.content)
[SystemMessage(content='你是大模型应用开发工程师。你的名字叫Rivers', additional_kwargs={}, response_metadata={}), HumanMessage(content='你是谁', additional_kwargs={}, response_metadata={})]
你好,我是一个大模型应用开发工程师。如果你有任何关于应用开发或者大模型相关的问题,我很乐意为你提供帮助。有什么我可以帮你的吗?
  1. MessagesPlaceholder 把多轮对话变成模板
from langchain.prompts import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    MessagesPlaceholder,
)
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())
human_prompt = "Translate your answer to {language}."
human_message_template = HumanMessagePromptTemplate.from_template(human_prompt)

chat_prompt = ChatPromptTemplate.from_messages(
    # variable_name 是 message placeholder 在模板中的变量名
    # 用于在赋值时使用
    [MessagesPlaceholder("history"), human_message_template]
)

from langchain_core.messages import AIMessage, HumanMessage

human_message = HumanMessage(content="Who is Elon Musk?")
ai_message = AIMessage(
    content="Elon Musk is a billionaire entrepreneur, inventor, and industrial designer"
)

messages = chat_prompt.format_prompt(
    # 对 "history" 和 "language" 赋值
    history=[human_message, ai_message], language="中文"
)

print(messages.to_messages())
llm = ChatOpenAI()
result = llm.invoke(messages)
print(result.content)
[HumanMessage(content='Who is Elon Musk?', additional_kwargs={}, response_metadata={}), AIMessage(content='Elon Musk is a billionaire entrepreneur, inventor, and industrial designer', additional_kwargs={}, response_metadata={}), HumanMessage(content='Translate your answer to 中文.', additional_kwargs={}, response_metadata={})]
埃隆·马斯克是一位亿万富翁企业家、发明家和工业设计师。
划重点:把Prompt模板看作带有参数的函数

1.2.2、从文件加载 Prompt 模板

from langchain.prompts import PromptTemplate

template = PromptTemplate.from_file("../data/test1.csv",encoding='utf-8')
print("===Template===")
print(template)
print("===Prompt===")
print(template.format(topic='学生'))
===Template===
input_variables=[] input_types={} partial_variables={} template='姓名,年龄\n张三,23\n李四,24'
===Prompt===
姓名,年龄
张三,23
李四,24

1.3 结构化输出

1.3.1 直接输出 Pydantic 对象

from pydantic import BaseModel, Field
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI


# 定义你的输出对象
class Date(BaseModel):
    year: int = Field(description="Year")
    month: int = Field(description="Month")
    day: int = Field(description="Day")
    era: str = Field(description="BC or AD")


from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())

model_name = 'gpt-4o-mini'
temperature = 0
llm = ChatOpenAI(model_name=model_name, temperature=temperature)

# 定义结构化输出的模型
structured_llm = llm.with_structured_output(Date)

template = """提取用户输入中的日期。
用户输入:
{query}"""

prompt = PromptTemplate(
    template=template,
)

query = "2025年五月22日天气晴..."
input_prompt = prompt.format_prompt(query=query)

res = structured_llm.invoke(input_prompt)
print(res)
year=2025 month=5 day=22 era='AD'

1.3.2 输出指定格式的 JSON

from dotenv import load_dotenv, find_dotenv
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

_ = load_dotenv(find_dotenv())
json_schema 
【Langchain学习笔记(二)】Langchain安装及使用示例 本文中介绍 Langchain 安装方法, 什么是 LangSmith 及其作用, 如何调用国产大模型,并以简单案例进行展示。 阅读详情

相关推荐

使用Weaviate和LangChain进行RAG任务的最佳实践

结合Weaviate和LangChain能够简化你的RAG任务开发过程。通过正确的环境设置和工具使用,你可以快速构建出强大的应用程序。

dfitghjk的博客 1978

LangChain-Core、LangChain-Community、LangChain-Experimental核心组件详解与示例

的模块化仓库,涵盖大模型服务(如通义千问)、向量数据库(如Pinecone)、工具接口(如Google Search API)等,由社区维护并保持可选依赖。开发者应根据需求合理选择模块:核心业务逻辑使用Core,快速接入外部服务使用Community,前沿技术预研使用Experimental。(如LCEL表达式语言),是构建语言模型应用的基石。其设计目标是保持轻量级依赖,同时通过标准化的接口实现跨模型和工具的兼容性。,例如需要高权限访问的代理、未经验证的算法或前沿技术(如新型推理策略)。

qq_54655817的博客 2930

使用LangChain、LangGraph和LangSmith来创建AI Agent

使用LangChain、LangGraph和LangSmith来创建AI Agent

安静的软件工程师 2582

【LangChain入门篇】LangChain的安装和卸载

这张图是官方提供的LangChain组件的依赖关系,从图来看,langchain-core是最基础的组件,langgraph、langchain和integrations(集成包)都依赖langchain-core,而langchain-community又依赖langchain。执行完成后,从输出内容来看,会自动安装四个组件:langchain、langchain-core、langchain-text-splitter、langsmith。安装cli,会自动安装langserve。

zzu_dcx_zzu的专栏 1642

langchain的构成

langchain的构成其包含langchain-core,langchain-community,langchain,langgraph,langserve,langSmith。

yitang的博客 1704

langchain、langchain-core 和 langchain-community如何协作?

特性langchain内容接口、抽象基类、基础协议官方、高质量的集成和组件社区贡献、第三方集成稳定性高(变更会破坏所有其他包)高中/低(可能频繁变动)依赖关系无依赖(或极少依赖)依赖依赖,可选依赖langchain用户使用频率较少直接导入高(主要导入来源)按需导入(用于特定工具)给开发者的建议:大多数情况下,你只需要安装和导入langchain中的组件(例如现在趋向于它会帮你处理好一切。当你需要一个非常小众的、核心包没有的工具体(比如一个特殊的PDF解析器或一个冷门模型的API),才去。

ruanchao的专栏 672

使用LangSmith来快速学习LangChain

好风凭借力,送我上青云!总的来说,LangSmith还处于快速开发的阶段(LangChain本身也才0.0.348版),某些功能还比较简陋。从另一方面来说,我们可以和它一起成长,更快速掌握LangChain,打造自己的LLM应用。

dayzhongni的博客 1504

运放电路实战:5分钟搞定加法器与减法器的电路设计与调试(附避坑指南)

本文从实战角度出发,详细讲解了运算放大器加法器与减法器的电路设计与调试方法。针对加法器,重点分析了利用“虚地”特性简化设计和选型要点;对于减法器,则深入剖析了决定精度的核心——电阻匹配问题,并提供了使用电阻网络等提升共模抑制比的实用策略。文章还分享了从仿真到实物焊接的完整流程与常见避坑技巧,帮助电子爱好者快速掌握这两种基础运放电路。

weixin_28323057的博客 453

Prometheus常用配置介绍

除了 scrape_configs 外,上部还有 global 和 rule_files 部分, 其中 global 中 是 全 局 参 数 , scrape_interval 指 定 全 局 默 认 的 时 间 间 隔 , evaluation_interval 指定告警规则校验的时间间隔,rule_files 指定了告警规 则文件的位置名称。• annotations(注释):它们被用于存储更长的其他信息,例如警报描述 或者链接,注释值也可以被模板化。• alert:告警的名称。

weixin_42886699的博客 2257

【数据库】银行/信贷业务测试工作中涉及的数据库表格

银行/信贷业务测试工作中涉及的数据库表格,金融信贷测试人必看!

孤之鹜的博客 1161

DLPFC.h5ad格式数据简便获取方式+STAGATE论文复现问题

简便获取DLPFC.h5ad格式的数据方式

apple_74057836的博客 2248

CSIT883系统分析与项目管理——Lecture3重点概念

🎈本节课,介绍了项目集成管理当中,关于NPV这个概念相关的内容,以及介绍什么是系统需求,什么时候需要开始系统需求,如何进行调查系统需求等等相关的题目,这里供大家复习参考吧!还有还有最关键的是NPV的计算,我单独写一篇博文,需要的同学快去学习吧!

AI手套的博客 1085

IAR for ARM 搭建STM32F103C8T6工程模板(实战指南)

本文详细介绍了如何在IAR for ARM开发环境中为STM32F103C8T6微控制器搭建完整的工程模板。从环境准备、固件库获取、目录结构设计到工程配置与编译调试,提供了实战指南和常见问题解决方案,帮助开发者快速建立稳定的STM32开发环境。

fun88的博客 983

TIA Portal (博图) -两台不同网段S7-1200通信(上)

因为不同网段意味着它们默认不在同一个广播域,并且没有网关设备来处理路由,所以标准的 TCP/IP 通信(如 `TSEND_C`/`TRCV_C`)无法直接建立连接。S7 通信 (PUT/GET): 最简单,配置好连接后,在客户端 PLC 使用 `PUT` 指令发送数据到服务器 PLC,使用 `GET` 指令从服务器 PLC 读取数据。* 在地址详细信息中,确保 本地连接端点是客户端 PLC 的接口,远程连接端点是服务器 PLC 的接口和 IP (`192.168.2.20`)。

电工 2668

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: LlamaIndex
下一篇: 维护测试监控LLM应用
SunnyRivers
SunnyRivers 领域专家: 大数据技术领域 领域专家: 大数据技术领域
博客等级 码龄10年 2万+粉丝 598原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值