Article发布于 2026年7月12日

LangChain1

模型包装器(Model I/O) 主要包含三部分:提示词,调用模型,输出解析(Parse) Model I/O之模型包装器 LangChain 提供通用接口调用不同类型的语言模型,这个通用接口被称为模型包装器。LangChain支持的模型有...

站点作者18 次阅读最后更新 2026年7月25日
返回首页·Markdown 正文渲染

模型包装器(Model I/O)

主要包含三部分:提示词,调用模型,输出解析(Parse)

Model I/O之模型包装器

LangChain 提供通用接口调用不同类型的语言模型,这个通用接口被称为模型包装器。LangChain支持的模型有三大类:

  • 非对话模型(LLM)包装器

非对话模型CM)包装器;也叫文本补全模型,接收文本字符串作为输入,并返回一个补全字符串作为输出。安基于Transformer架构,通过大规模训练数据学习语言规律,适用于文本生成、摘要、翻译、代码生成等任务。

可以理解为只能一问一答。OpenAI的文本补全模型(如GPT-3、text-davinci003)是通用文本生成工具,而聊天模型(如GPT-3.5 Turbo)是对话专用模型

OpenAI的文本补全类型API在2023年7月进行了最后一次更新,该API现在只能

用于访问较旧的历史遗留模型。而且目前国内的大模型厂商普遍对该API也未提

供支持。所以该包装器我们不予学习和考虑。

  • 对话聊天模型(Chat Model)包装器

模型通常由语言模型支持,但它们的API更加结构化。

是专门为多轮对话设计的模型,其核心目标是模拟人与AI之间的自然交互。

它基于LLM构建,但通过特定优化(如对话历史管理、角色区分)来提升对话连贯性和上下文理解能力

聊天模型包装器 ChatOpenAI, BaseChatModel等

  • 文本嵌入模型,(Embedding Model),这些模型将文本作为输入并返回词向量。在后面RAG的课程会单独学习和使用

python
"hljs-keyword">from dotenv "hljs-keyword">import load_dotenv
"hljs-keyword">import os

"hljs-keyword">from langchain.chat_models "hljs-keyword">import init_chat_model
"hljs-keyword">from langchain_community.chat_models "hljs-keyword">import ChatTongyi
"hljs-keyword">from openai "hljs-keyword">import api_key

load_dotenv()
"hljs-keyword">from langchain_openai "hljs-keyword">import ChatOpenAI
#1.创建模型客户端,,访问基于openai规范的一类模型
# model = ChatOpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),
#                    model="qwen-max-latest",
#                    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")
#1.2 其他方式,不是openai 任意模型,都可以通过init_chat_model()方法创建
#model=init_chat_model(model="deepseek-chat",model_provider="deepseek")
#1.3 基于某个平台的创建模型客户端
model = ChatTongyi ()
prompt = "你是谁?"
result = model.invoke(prompt)
print(result.content)

提示词模板

常见提示词模板

  • LLM提示模板 PromptTemplate:常用的String提示模板

python
"hljs-keyword">from langchain_community.chat_models "hljs-keyword">import ChatTongyi
"hljs-keyword">from langchain_core.prompts "hljs-keyword">import PromptTemplate
"hljs-keyword">from dotenv "hljs-keyword">import load_dotenv

load_dotenv()
# 1.创建模型客户端
model = ChatTongyi()
# 2.构建提示词,访问模型
# prompt = "你是谁?"
# 字符串提示词模板 {text}  占位符,通过text变量动态设置提示词内容
prompt = PromptTemplate(template="你是一个翻译助手,请讲以下内容翻译成{language}:{text}")

# 输入参数内容,构建真正的提示词
fact_prompt = prompt.format(language="中文", text="I am a programmer")

print(fact_prompt)

result = model.invoke(fact_prompt)
# 3.获取打印结果
print(result.content)
  • 聊天提示模板 ChatPromptTemplate:常用的Chat提示模板,用于组合各种角色的消息模板,传入聊天模型。

python
"hljs-keyword">from langchain_community.chat_models "hljs-keyword">import ChatTongyi
"hljs-keyword">from langchain_core.prompts "hljs-keyword">import PromptTemplate, ChatPromptTemplate, SystemMessagePromptTemplate, \
    HumanMessagePromptTemplate, AIMessagePromptTemplate
"hljs-keyword">from dotenv "hljs-keyword">import load_dotenv
load_dotenv()
# 1.创建模型客户端
model = ChatTongyi()
#2.构建提示词,访问模型
# 设置对话提示词模板,设置角色
prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template("你是一个翻译助手,请将以下内容翻译成{language}"),
    # ("system", "你是一个翻译助手,请将以下内容翻译成{language}"),
    HumanMessagePromptTemplate.from_template("{text}"),
    # ("human", "{text}"),
    AIMessagePromptTemplate.from_template("{text}"),
    # ("ai", "{text}"), # ai 用来记录记忆
])
# 输入参数内容,构建真正的提示词
fact_prompt = prompt.format(language="中文", text="I am a programmer")

print(fact_prompt)

result = model.invoke(fact_prompt)
#3.获取打印结果
print(result.content)
  • 少样本提示模板 FewShotPromptTemplate、提示模板部分格式化、管道提示模板 PipelinePrompt等等。

python
#少样本提示模版的使用
# "hljs-keyword">from langchain.prompts "hljs-keyword">import PromptTemplate
# "hljs-keyword">from langchain.prompts.few_shot "hljs-keyword">import FewShotPromptTemplate
"hljs-keyword">from langchain_community.chat_models "hljs-keyword">import ChatTongyi
"hljs-keyword">from langchain_core.prompts "hljs-keyword">import PromptTemplate, FewShotPromptTemplate

"hljs-keyword">from models "hljs-keyword">import get_lc_model_client

#获得访问大模型客户端
client = ChatTongyi()

# 创建示例
examples = [
    {"sinput": "2+2", "soutput": "4", "sdescription": "加法运算"},
    {"sinput": "5-2", "soutput": "3", "sdescription": "减法运算"},
]

# 配置一个提示模板,用来一个示例格式化
examples_prompt_tmplt_txt = "算式: {sinput} 值: {soutput} 类型: {sdescription} "

# 这是一个提示模板的实例,用于设置每个示例的格式
# prompt_sample = PromptTemplate.from_template(examples_prompt_tmplt_txt)
prompt_sample = PromptTemplate(template=examples_prompt_tmplt_txt)

# 创建少样本示例的对象
prompt = FewShotPromptTemplate(
    examples=examples, # 示例样本
    example_prompt=prompt_sample, # 示例的提示模板
    prefix="你是一个数学专家, 能够准确说出算式的类型,", #前缀
    suffix="现在给你算式: {input} , 值: {output} ,告诉我类型:", #后缀
    input_variables=["input", "output"]
)
print(prompt.format(input="2*5", output="10"))  # 你是一个数学专家,算式: 2*5  值: 10

print('-' * 50)

result = client.invoke(prompt.format(input="2*5", output="10"))
print(result.content)  # 使用: 乘法运算
#少样本提示模版的使用
# "hljs-keyword">from langchain.prompts "hljs-keyword">import PromptTemplate
# "hljs-keyword">from langchain.prompts.few_shot "hljs-keyword">import FewShotPromptTemplate
"hljs-keyword">from langchain_community.chat_models "hljs-keyword">import ChatTongyi
"hljs-keyword">from langchain_core.prompts "hljs-keyword">import PromptTemplate, FewShotPromptTemplate

"hljs-keyword">from models "hljs-keyword">import get_lc_model_client

#获得访问大模型客户端
client = ChatTongyi()

# 创建示例,模型学习用户给的参照样本,安装样本进行回答
examples = [
    {"input": "如何重置密码?", "output": "密码重置可以通过绑定邮箱重置密码,也可以通过手机号重置密码"},
    {"input": "我的设备无法开机怎么办?", "output": "故障排除步骤:1.可能是遥控器电池没电,2.确认电源状态,3.确认设备是否被锁屏"},
    {"input": "这款产品是否有夜间模式?", "output": "这款不提供夜间模式,请选择xx款式的产品"},
]

# 配置一个提示模板,用来一个示例格式化
examples_prompt_tmplt_txt = "用户问题: {input} 对应回答: {output}"

# 这是一个提示模板的实例,用于设置每个示例的格式
prompt_sample = PromptTemplate.from_template(examples_prompt_tmplt_txt)

# 创建少样本示例的对象
prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=prompt_sample,
    prefix="你是一个智能客服, 能够根据用户问题给出答案,",
    suffix="现在给你用户提问: {input} ,请告诉我对应的结果:",
    input_variables=["input"]
)
print(prompt.format(input="这款产品有防水模式?"))

print('-' * 50)

result = client.invoke(prompt.format(input="这款产品有防水模式?"))
print(result.content)
"hljs-keyword">from langchain_community.chat_models "hljs-keyword">import ChatTongyi
"hljs-keyword">from langchain_core.prompts "hljs-keyword">import PromptTemplate
"hljs-keyword">from dotenv "hljs-keyword">import load_dotenv
load_dotenv()
# 作用这是参数,提前先设置一个参数,后续在设置其他参数,分开给不同参数赋值
# 比如:实现学习助手,在提问前先设置学科,在输入内容问题

# 1.创建模型客户端
model = ChatTongyi()
#2.构建提示词,访问模型
prompt_txt = "讲一个关于{date}的小故事:{text}"

prompt = PromptTemplate(template=prompt_txt, input_variables=["date", "text"])

# 输入参数内容,构建真正的提示词
half_prompt = prompt.partial(date="2008-08-08")

print(half_prompt)


result = model.invoke(half_prompt.format(text="一个幸福的爱情故事"))
#3.获取打印结果
print(result.content)

result = model.invoke(half_prompt.format(text="一个悲伤的爱情故事"))
#3.获取打印结果
print(result.content)

字符串解析器&链

如何将前面的提示词模版、模型包装器和输出解析器串起来,这时可以使用链。

链可以将模型输入输出整合在一个链中操作。

它利用提示模板格式化输入,将格式化后的字符串传递给LLM模型,并返回LLM

的输出。这样使得整个处理过程更加高效和便捷。

image\.png
python
"hljs-keyword">from langchain_community.chat_models "hljs-keyword">import ChatTongyi
"hljs-keyword">from langchain_core.output_parsers "hljs-keyword">import StrOutputParser
"hljs-keyword">from langchain_core.prompts "hljs-keyword">import PromptTemplate
"hljs-keyword">from dotenv "hljs-keyword">import load_dotenv
load_dotenv()
# 1.创建模型客户端
model = ChatTongyi()

prompt = PromptTemplate(template="你是一个翻译助手,请讲以下内容翻译成{language}:{text}")

# 输入参数内容,构建真正的提示词
# fact_prompt = prompt.format(language="中文", text="I am a programmer")
# print(fact_prompt)
parser = StrOutputParser()

#
# result = model.invoke(fact_prompt)
# #3.获取打印结果
# # print(result.content)
# # 4.字符串结果解析器,解析:作用 将大模型返回的内容,获取到字符串内容返回

# str = parser.invoke( result) # 字符串解析
# print(str)
# 链的调用   在langchain中  "|" 是一个链的调用符
chain = prompt | model | parser
result = chain.invoke({"language": "中文", "text": "I am a programmer"})
print(result)

输出解析器

输出解析器负责获取 LLM 的输出并将其转换为更合适的格式。

有许多不同类型的输出解析器:StrOutputParser

  • CSV解析器:CommaSeparatedListOutputParser,模型的输出以逗号分隔,以

列表形式返回输出

  • 日期时间解析器:PatetimeOutputParser,可用于将 LLM 输出解析为日期时间

  • JSON解析器:JsonOutputParser,确保输出符合特定JSON对象格式。

CSV

python
"hljs-keyword">from langchain_community.chat_models "hljs-keyword">import ChatTongyi
"hljs-keyword">from langchain_core.prompts "hljs-keyword">import ChatPromptTemplate
"hljs-keyword">from langchain_core.output_parsers "hljs-keyword">import CommaSeparatedListOutputParser, StrOutputParser
"hljs-keyword">from models "hljs-keyword">import get_lc_model_client

# 获得访问大模型客户端
# client = ChatTongyi();
client = get_lc_model_client()

# 创建解析器
# output_parser = StrOutputParser()
# 将返回结果列表返回,多个值用逗号分隔
output_parser = CommaSeparatedListOutputParser()

# 提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的程序员"),
    ("user", "{input}")
])

# 将提示和模型合并以进行调用
chain = prompt | client | output_parser

# 示例调用
#明确告诉大模型用用逗号分隔返回,我们可以用CommaSeparatedListOutputParser获得内容后以
# 列表的形式获得以进行后续处理,否则返回一个字符串
print(chain.invoke({"input": "列出Python的三个主要版本, 用逗号分隔"}))
print(chain.invoke({"input": "列举三个常见的机器学习框架, 用逗号分隔"}))

日期

python
"hljs-keyword">from langchain_community.chat_models "hljs-keyword">import ChatTongyi
"hljs-keyword">from langchain_core.prompts "hljs-keyword">import ChatPromptTemplate
"hljs-keyword">from langchain_core.output_parsers "hljs-keyword">import CommaSeparatedListOutputParser, StrOutputParser
"hljs-keyword">from models "hljs-keyword">import get_lc_model_client

# 获得访问大模型客户端
# client = ChatTongyi();
client = get_lc_model_client()

# 创建解析器
# output_parser = StrOutputParser()
# 将返回结果列表返回,多个值用逗号分隔
output_parser = CommaSeparatedListOutputParser()

# 提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的程序员"),
    ("user", "{input}")
])

# 将提示和模型合并以进行调用
chain = prompt | client | output_parser

# 示例调用
#明确告诉大模型用用逗号分隔返回,我们可以用CommaSeparatedListOutputParser获得内容后以
# 列表的形式获得以进行后续处理,否则返回一个字符串
print(chain.invoke({"input": "列出Python的三个主要版本, 用逗号分隔"}))
print(chain.invoke({"input": "列举三个常见的机器学习框架, 用逗号分隔"}))

自定义时间日期

python
"hljs-keyword">from datetime "hljs-keyword">import datetime
"hljs-keyword">from langchain_core.output_parsers "hljs-keyword">import BaseOutputParser
"hljs-keyword">from models "hljs-keyword">import get_lc_model_client
"hljs-keyword">from langchain_core.prompts "hljs-keyword">import PromptTemplate


client = get_lc_model_client()

# --- 自定义日期字符串解析器 ---
#  1.要求通过提示词,规范大模型的返回结果:字符串类型的结果
#  2.将大模型返回的字符串结果,进行解析,解析成指定的格式
"hljs-keyword">class DateStringParser(BaseOutputParser[str]):
    # 定义模型应该输出的字符串格式,也是默认返回的格式
    target_format: str = "%Y-%m-%d"

    # 解析:将大模型返回结果,按照要求解析成想要的格式
    def parse(self, text: str) -> str:
        *"""*
*        接收模型的原始输出字符串,将其解析、验证并返回格式化后的字符串。*
*        """*
*        *stripped_text = text.strip()

        "hljs-keyword">try:
            # 使用 datetime.strptime 尝试解析字符串。
            # 如果字符串不符合 self.target_format,将抛出 ValueError
            print("尝试解析字符串:", stripped_text)

            dt_object = datetime.strptime(stripped_text, self.target_format)
            "hljs-keyword">return dt_object.strftime(self.target_format)

        except ValueError as e:
            # 如果解析失败,抛出 LangChain 异常以便链可以处理错误
            "hljs-keyword">from langchain_core.exceptions "hljs-keyword">import OutputParserException
            raise OutputParserException(
                f"模型输出的日期格式不正确。期望格式为 '{self.target_format}',但收到了: '{stripped_text}'. 错误: {e}"
            )

    # 规范大模型的输出的格式,返回的是提示词
    def get_format_instructions(self) -> str:
        *"""返回给 LLM 的指令,要求它输出特定的日期格式。"""*
*        *# 使用当前日期作为示例,指导模型输出正确的格式
        example_date = datetime.now().strftime(self.target_format)
        print("当前期望格式:", self.target_format)
        "hljs-keyword">return (
            f"请严格按照以下格式输出日期:'{self.target_format}'.\n"
            f"例如: {example_date}\n"
            f"只返回日期字符串,不要包含任何其他文本、空格或标点符号!"
        )


# --- 3. 组装 LCEL 链,测试自定义结果解析器效果 ---

# 实例化自定义解析器 可以在这里指定不同的日期格式
# date_parser = DateStringParser(target_format="%Y-%m-%d")
date_parser = DateStringParser(target_format="%m/%d/%Y %H:%M:%S")
# date_parser = DateStringParser(target_format="%d/%m/%Y")

# 定义模板
template = """
回答用户的问题:{question}

{format_instructions}  
"""

prompt = PromptTemplate.from_template(
    template,
    partial_variables={"format_instructions": date_parser.get_format_instructions()},
)

# 链式调用:使用自定义解析器作为最后一个组件
chain = prompt | client | date_parser

# --- 4. 执行并打印输出 ---
# question = "新中国是什么时候成立的?"
question = "北京夏季奥运会的开幕时间是?"

output = chain.invoke({"question": question})
print(output)

JSON

python
"hljs-keyword">from langchain_core.prompts "hljs-keyword">import ChatPromptTemplate
# 创建解析器
"hljs-keyword">from langchain_core.output_parsers "hljs-keyword">import JsonOutputParser, StrOutputParser

"hljs-keyword">from models "hljs-keyword">import get_lc_model_client

#获得访问大模型客户端
client = get_lc_model_client()
# output_parser = StrOutputParser()
output_parser = JsonOutputParser()

# 提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的程序员"),
    ("user", "{input}")
])

# 将提示和模型合并以进行调用
chain = prompt | client | output_parser


#明确告诉大模型用JSON格式返回,我们可以用JSONOutputParser获得JSON格式的内容以进行后续处理,否则返回一个字符串
result = chain.invoke({"input": "langchain是什么? 问题用question 回答用ans 返回一个JSON格式"})
print(type(result))
print(result)
# print(chain.invoke({"input": "大模型中的langchain是什么?"}))

部署阶段

python
#学会利用LangChain部署我们的应用成为WEB服务


"hljs-keyword">from fastapi "hljs-keyword">import FastAPI
"hljs-keyword">from langchain_community.chat_models "hljs-keyword">import ChatTongyi
"hljs-keyword">from langchain_core.globals "hljs-keyword">import set_debug

"hljs-keyword">from langchain_core.output_parsers "hljs-keyword">import StrOutputParser
"hljs-keyword">from langchain_core.prompts "hljs-keyword">import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
"hljs-keyword">from langserve "hljs-keyword">import add_routes

"hljs-keyword">from models "hljs-keyword">import get_lc_model_client
# 开启调试
set_debug(True)

#获得访问大模型客户端
# client = ChatTongyi()
client = get_lc_model_client()

#解析返回结果
parser = StrOutputParser()

#定义提示模版
prompt_template = ChatPromptTemplate.from_messages(
    [
        #改为 ('system','请将以下的内容翻译成{language}') 也可以
        SystemMessagePromptTemplate.from_template("请将以下的内容翻译成{language}"),
        # 改为 HumanMessagePromptTemplate.from_template("{text}") 也可以
        ('human', '{text}')
    ]
)

# 以链的形式调用
chain = prompt_template | client | parser

# 本地调用  chain.invoke({language:'',text:''}})
# print(chain.invoke({"language": '中文', "text": "hello"}))


#部署为服务  部署成web应用的框架
app = FastAPI(title="基于LangChain的服务",version="V1.5",description="翻译服务")
# 函数和访问路径一一对应
add_routes(app, chain,path="/lanchainServer")

"hljs-keyword">if __name__ == "__main__":
    "hljs-keyword">import uvicorn
    uvicorn.run(app, host="localhost", port=8000)
#使用LangChain编写客户端访问我们基于LangServer的WEB服务
#对于其他编程语言来说,可以使用RESTful API来调用我们的服务
*'''比如在postman或者apifox中访问http://localhost:8000/tslServer/invoke*
*在body中选择json,然后输入*
*{*
*    "input":*
*    {*
*        "language":"意大利文",*
*        "text":"为了部落!"*
*    }*
*}'''*
"hljs-keyword">from langserve "hljs-keyword">import RemoteRunnable

"hljs-keyword">if __name__ == "__main__":
    client = RemoteRunnable("http://localhost:8000/lanchainServer")
    print(client.invoke({'language': '意大利文', 'text': '我喜欢编程'}))

版权声明

1 本文章标题: LangChain1

2 本文章地址: https://www.yf2029.com/articles/langchain1

3 本站文章内容仅供学习、交流与界面验证参考,如有版权或引用问题,请联系站点维护者处理。

4 本站不对文中外部链接、第三方资源或读者据此操作产生的结果承担保证责任。

上一篇

LangChain2

TypeScript

下一篇

表情包

API设计

评论

登录后即可发表评论和回复。

1 条
评分
0/1000
admin2026/07/12 17:17
测试

AI Knowledge Blog

记录代码与设计实践

分享开发经验、项目思考与持续成长的过程

站点反馈

如果你在浏览或使用过程中有建议,欢迎告诉我们。