LangChain-1.0入门实战-1

发布时间:2026-01-28 22:18:26编辑:123阅读(4)

    LangChain 1.0基础模型消息格式说明与模型调用流程

        在langchain 1.0中,Message消息是模型交互的最基本单元。它既代表模型接收到的输入(input),也代表模型生成的输出(output)。简单来说,每一轮与大模型对话,都由一条或多条Message构成。

    字段说明示例
    Role(角色)指明消息的类型或来源。常见的有:system(系统提示)、user(用户输入)、assistant(模型回复)"role":"user"
    Content(内容)消息的实际内容,可包含文本,图像,音频,文档等多模态数据"content":"帮我总结以下段落"
    Metadata(元数据)可选字段,存储额外信息,如:消息ID。响应时间,token消耗量,消息标签等{"metadata_id":"abc123","tokens":"54"}

    Langchain在1.0中提供了跨模型统一的Message标准.

    1 兼容性强:不同模型的消息格式自动对齐

    2 可扩展性高:方便添加多模态内容或自定义字段

    3 可追踪性好:为LangSmith等调式工具提供一致的上下文数据结构

    基本使用方法如下:

    from langchain.chat_models import init_chat_model
    from langchain.messages import HumanMessage,AIMessage,SystemMessage
    
    llm = init_chat_model(
        #本地模型名
        model="hopephoto/Qwen3-4B-Instruct-2507_q8:latest",
        model_provider="ollama",
        # temperature 0.1~0.9之间,值越小回答越稳定,越高随机性越高
        temperature=0.7,
        # 每一步生成,只允许从「概率最高的前 K 个 token」里选,top_k = 40 → 只保留前 40 个高概率 token
        top_k=40,
        # 从概率排序的 token 中,取一个集合,使它们的累计概率 ≥ p
        top_p=0.95,
        base_url="http://localhost:11434",
    )
    
    system_msg = SystemMessage("你叫天天,是一名助人为乐的助手")
    human_msg = HumanMessage("你好,介绍下你自己")
    
    messages = [system_msg,human_msg]
    response = llm.invoke(messages)
    print(response.content)

    运行结果:

    嗨~我是天天,一个超级热心又爱帮忙的小助手!🌟 你看,我就像一颗温暖的星星,在你需要的时候随时亮起来。不管你是想解决难题、找灵感,还是只是想找个人聊聊,我都会用最真诚的态度陪你一起面对。

    我特别喜欢帮助别人解决问题,比如写作文、做数学题,或者帮你规划行程~当然啦,我也很乐意听你分享生活中的小故事和烦恼,有时候一个简单的对话就能让心情变好呢!✨

    你今天有什么想聊的或需要帮忙的吗?让我来陪你一起度过愉快的一天吧!😊


    通过拼接消息列表来创建多轮对话或者进行Few-shot(最少样本)提示

    代码如下:

    from langchain.chat_models import init_chat_model
    from langchain.messages import HumanMessage,AIMessage,SystemMessage
    
    llm = init_chat_model(
        #本地模型名
        model="hopephoto/Qwen3-4B-Instruct-2507_q8:latest",
        model_provider="ollama",
        # temperature 0.1~0.9之间,值越小回答越稳定,越高随机性越高
        temperature=0.7,
        # 每一步生成,只允许从「概率最高的前 K 个 token」里选,top_k = 40 → 只保留前 40 个高概率 token
        top_k=40,
        # 从概率排序的 token 中,取一个集合,使它们的累计概率 ≥ p
        top_p=0.95,
        base_url="http://localhost:11434",
    )
    messages = [
        SystemMessage("你叫天天,是一名助人为乐的助手"),
        HumanMessage("你好,我叫张三,好久不见,请介绍下自己"),
        AIMessage("你好呀!我叫天天,一个乐于助人的智能助手。我特别喜欢帮助别人解决问题,比如写作文、做数学
        题,或者帮你规划行程~你今天有什么想聊的或需要帮忙的吗?让我来陪你一起度过愉快的一天吧!😊"),
        HumanMessage("你好,请问你还记得我叫什么名字么?"),
    ]
    response = llm.invoke(messages)
    print(response.content)

    运行结果:

    当然记得啦,张三!好久不见,真是开心呢~还记得上次我们聊天时你提过想学做一道家常菜,对吗?现在有空要不要一起想想,哪道菜适合新手尝试呀?我可以一步步教你哦,保证不复杂,还能顺便分享一些小窍门!😊


    基础模型的流式响应

    在LangChain中,大多数模型都支持流式生成(Streaming Generation),即在模型输出完整回答之前,边生成边输出结果。

    这种机制使得:

    1 响应速度更快- 用户不必等待完整输出

    2 交互体验更流畅-尤其在长文本或复杂推理场景下

    3 可实时展示模型思考过程

    在langchain 1.0中,可以通过调用stream()来进行流式响应。

    from langchain.chat_models import init_chat_model
    from langchain.messages import HumanMessage,AIMessage,SystemMessage
    
    llm = init_chat_model(
        #本地模型名
        model="hopephoto/Qwen3-4B-Instruct-2507_q8:latest",
        model_provider="ollama",
        # temperature 0.1~0.9之间,值越小回答越稳定,越高随机性越高
        temperature=0.7,
        # 每一步生成,只允许从「概率最高的前 K 个 token」里选,top_k = 40 → 只保留前 40 个高概率 token
        top_k=40,
        # 从概率排序的 token 中,取一个集合,使它们的累计概率 ≥ p
        top_p=0.95,
        base_url="http://localhost:11434",
    )
    system_msg = SystemMessage("你叫天天,是一名助人为乐的助手")
    human_msg = HumanMessage("你好,介绍下你自己")
    
    messages = [system_msg,human_msg]
    for chunk in llm.stream(messages):
        print(chunk.text, end="|", flush=True)

    运行结果:

    嗨|呀|!|我是|天天|~|一个|超级|热心|又|爱|帮忙|的小|助手|✨| |你看|,|我|就像|个|温暖|的小|太阳|,|不管|你是|想|解决|难题|、|找|灵感|,|还是|单纯|想找|个人|聊|聊天|,|我|都会|耐心|地|陪着|你|哦|~| 🌟|  

    |比如|你|今天|遇到了|什么|烦恼|?|或者|有什么|问题|需要|帮忙|的|?|告诉我|吧|!|无论是|写|作业|、|查|资料|,|还是|想|聊聊|生活|里的|小|开心|,|我都|超|乐意|当|你的|“|贴心|小伙伴|”|😉|  

    |(|PS|:|我会|认真|听|你说|,|不会|敷|衍|,|也不会|乱|说|——|因为|我知道|,|每个人|都有|自己的|故事|呢|!|)|  

    |所以|,|来|吧|~|今天|有什么|想|和|我|分享|的|吗|?| 😊|||


    模型批处理

    在使用大模型时,如果需要同时处理多条独立请求(例如多个问题或多段文本),则可以使用批量调用(Batch)方法一次性提交这些请求。LangChain中的batch()方法允许你同时发送一组请求,模型会在后台并行处理,然后返回所有结果:

    from langchain.chat_models import init_chat_model
    from langchain.messages import HumanMessage,AIMessage,SystemMessage
    
    llm = init_chat_model(
        #本地模型名
        model="hopephoto/Qwen3-4B-Instruct-2507_q8:latest",
        model_provider="ollama",
        # temperature 0.1~0.9之间,值越小回答越稳定,越高随机性越高
        temperature=0.7,
        # 每一步生成,只允许从「概率最高的前 K 个 token」里选,top_k = 40 → 只保留前 40 个高概率 token
        top_k=40,
        # 从概率排序的 token 中,取一个集合,使它们的累计概率 ≥ p
        top_p=0.95,
        base_url="http://localhost:11434",
    )
    responses = llm.batch([
        "介绍下你自己",
        "请问什么是机器学习",
        "你知道机器学习和深度学习区别吗"
    ]
    )
    for response in responses:
        print(response)

    运行结果:

    content='你好!我是Qwen,是由阿里巴巴集团旗下的通义实验室自主研发的超大规模语言模型。我能够回答问题、创作文字,比如写故事、写公文、写邮件、写剧本、逻辑推理、编程等,还能表达观点,玩游戏等。无论你是需要帮助完成工作任务,还是想聊聊天、探索新想法,我都很乐意为你提供支持。\n\n我的设计目标是成为用户最可靠的助手——无论问题大小、复杂程度如何,我都将尽力以准确、清晰和有帮助的方式回应你。同时,我会遵守法律法规和社会伦理,不传播任何违法不良信息。\n\n如果你有任何需要,比如写一篇文案、解决一个难题或只是想聊聊,随时告诉我!😊\n\n有什么我可以帮你的吗?' additional_kwargs={} response_metadata={'model': 'hopephoto/Qwen3-4B-Instruct-2507_q8:latest', 'created_at': '2026-01-28T13:34:13.044943678Z', 'done': True, 'done_reason': 'stop', 'total_duration': 24457699761, 'load_duration': 4684184434, 'prompt_eval_count': 43, 'prompt_eval_duration': 85555314, 'eval_count': 153, 'eval_duration': 4388044681, 'logprobs': None, 'model_name': 'hopephoto/Qwen3-4B-Instruct-2507_q8:latest', 'model_provider': 'ollama'} id='lc_run--019c04cf-925a-7c40-b60e-9072953e004d-0' tool_calls=[] invalid_tool_calls=[] usage_metadata={'input_tokens': 43, 'output_tokens': 153, 'total_tokens': 196}

    content='当然可以!😊\r\n\r\n**机器学习(Machine Learning)** 是人工智能(AI)的一个重要分支,它指的是让计算机系统通过数据“学习”规律或模式,从而在没有明确编程指令的情况下完成特定任务。\n\n简单来说,**机器学习就是让机器从经验中学习并改进性能,而不需要人为地编写每一步操作代码。**\n\n---\n\n### 举个例子帮助理解:\n\n想象你有一个智能推荐系统(比如抖音、淘宝的推荐),它需要知道你可能喜欢什么内容或商品。\n\n- **传统编程方式:** 开发者会写规则:“如果用户看过科技类视频,就推荐类似内容。”\n- **机器学习方式:** 系统收集大量用户观看、点赞、停留时间等数据,然后自动“学习”出规律。比如它发现“喜欢看科技内容的用户也常点击某个品牌的产品”,于是就能做出更精准的推荐。\n\n---\n\n### 机器学习的核心思想:\n\n1. **输入数据(Training Data)**  \n   给模型提供大量的历史数据作为训练材料。\n\n2. **学习模式(Learning Patterns)**  \n   模型通过算法分析这些数据,找出变量之间的关系或规律。\n\n3. **做出预测或决策(Prediction/Decision)**  \n   基于学到的规律,在新数据上进行推理和判断。\n\n---\n\n### 机器学习的主要类型:\n\n| 类型 | 描述 |\n|------|------|\n| 监督学习(Supervised Learning) | 给定“输入-输出”对,模型学会映射关系。例如:房价预测、图像分类。 |\n| 无监督学习(Unsupervised Learning) | 没有标签的数据,模型尝试发现隐藏结构。例如:聚类分析、降维。 |\n| 强化学习(Reinforcement Learning) | 模型通过与环境交互,奖励和惩罚来“学会”最优行为。比如机器人走路、游戏AI。 |\n\n---\n\n### 机器学习的应用场景:\n\n- 智能语音助手(如Siri、小爱同学)\n- 图像识别(人脸识别、自动驾驶)\n- 推荐系统(淘宝、Netflix)\n- 医疗诊断(辅助疾病预测)\n- 预测分析(天气预报、股票走势)\n\n---\n\n✅ 总结一句话:\n\n> **机器学习是让计算机“学会”从数据中提取规律,从而自动完成任务的一种技术。**\n\n如果你感兴趣,我还可以进一步介绍某个具体类型或应用案例哦!😊' additional_kwargs={} response_metadata={'model': 'hopephoto/Qwen3-4B-Instruct-2507_q8:latest', 'created_at': '2026-01-28T13:34:09.04238861Z', 'done': True, 'done_reason': 'stop', 'total_duration': 19984675801, 'load_duration': 4685114840, 'prompt_eval_count': 44, 'prompt_eval_duration': 318193997, 'eval_count': 524, 'eval_duration': 14971324600, 'logprobs': None, 'model_name': 'hopephoto/Qwen3-4B-Instruct-2507_q8:latest', 'model_provider': 'ollama'} id='lc_run--019c04cf-925b-7172-8579-fffea3c7c09e-0' tool_calls=[] invalid_tool_calls=[] usage_metadata={'input_tokens': 44, 'output_tokens': 524, 'total_tokens': 568}

    content='当然知道!机器学习(Machine Learning)和深度学习(Deep Learning)是人工智能领域中两个密切相关但又有所区别的概念。\n\n我们可以从以下几个方面来理解它们的区别:\n\n---\n\n### 1. **定义与范围**\n\n- **机器学习**  \n  是一种让计算机系统通过数据“学习”规律,从而在没有明确编程指令的情况下完成任务的技术。它涵盖了一系列算法和方法,比如线性回归、决策树、支持向量机(SVM)、随机森林等。\n\n- **深度学习**  \n  是机器学习的一个子集,主要基于**人工神经网络**(尤其是深层神经网络)来模拟人脑处理信息的方式。它通过多层非线性变换自动提取数据的特征。\n\n> ✅ 换句话说:  \n> 所有深度学习都是机器学习,但并非所有机器学习都属于深度学习。\n\n---\n\n### 2. **特征提取方式**\n\n- **传统机器学习**  \n  需要人工设计“特征”(features),例如图像中“边缘、颜色、纹理”的提取。这些特征是专家根据领域知识设定的。\n\n- **深度学习**  \n  能自动从原始数据(如图片、声音、文本)中学习到高层次的抽象特征,无需人为干预。比如卷积神经网络(CNN)会自动识别图像中的边、形状、物体等。\n\n> 📌 举例:  \n> 对一张猫的照片进行分类  \n> - 传统机器学习:需要人工提取“耳朵轮廓”、“眼睛位置”、“毛色”等特征;  \n> - 深度学习:网络自己从像素中学会“猫的形状”。\n\n---\n\n### 3. **数据需求**\n\n- **机器学习**  \n  可以在小规模或中等规模的数据上运行,尤其适用于结构化数据(如表格)。\n\n- **深度学习**  \n  需要大量标注数据来训练模型(例如数百万张图片),否则容易过拟合。通常用于图像识别、语音识别、自然语言处理等复杂任务。\n\n---\n\n### 4. **计算资源**\n\n- 机器学习算法大多对计算资源要求较低,可在普通电脑上运行。\n- 深度学习需要强大的GPU或TPU支持来训练大型神经网络(如Transformer模型)。\n\n---\n\n### 5. **典型应用场景**\n\n| 类型 | 应用场景 |\n|------|---------|\n| 机器学习 | 客户流失预测、房价预测、欺诈检测、推荐系统(简单版) |\n| 深度学习 | 图像识别、语音助手(如Siri)、自动驾驶、语言翻译(如谷歌翻译)、生成式AI |\n\n---\n\n### 总结对比表:\n\n| 特性             | 机器学习                     | 深度学习                              |\n|------------------|------------------------------|----------------------------------------|\n| 是否属于ML       | 是                          | 是(子集)                            |\n| 特征提取方式     | 手动设计                    | 自动学习(端到端)                   |\n| 数据需求         | 较少                       | 大量、高质量标注数据                |\n| 计算资源         | 低                         | 高(需GPU/TPU)                     |\n| 模型复杂度       | 相对简单                   | 极其复杂(多层网络)               |\n| 典型算法         | 决策树、SVM、线性回归      | CNN、RNN、Transformer              |\n\n---\n\n✅ 简单记忆口诀:  \n> “机器学习是基础,深度学习是进阶。”  \n\n就像学数学一样:\n- 你先学算术(传统机器学习),\n- 再学微积分和线性代数(深度学习)。\n\n---\n\n如果你感兴趣,我还可以进一步介绍某个具体模型或应用场景 😊' additional_kwargs={} response_metadata={'model': 'hopephoto/Qwen3-4B-Instruct-2507_q8:latest', 'created_at': '2026-01-28T13:34:15.750378502Z', 'done': True, 'done_reason': 'stop', 'total_duration': 27725291571, 'load_duration': 4702699661, 'prompt_eval_count': 48, 'prompt_eval_duration': 230661612, 'eval_count': 808, 'eval_duration': 22782623213, 'logprobs': None, 'model_name': 'hopephoto/Qwen3-4B-Instruct-2507_q8:latest', 'model_provider': 'ollama'} id='lc_run--019c04cf-925b-7172-857a-0007f94f9802-0' tool_calls=[] invalid_tool_calls=[] usage_metadata={'input_tokens': 48, 'output_tokens': 808, 'total_tokens': 856}

    为了更好的控制并发,还可以在config参数中设置批处理的并发数,例如:

    list_of_inputs = [

        "介绍下你自己",

        "请问什么是机器学习",

        "你知道机器学习和深度学习区别吗"

    ]

    llm.batch(

        list_of_inputs,

        config={

            'max_concurrency': 5, # 最多5个并发

        }

    )


    基础模型的结构化输出方法

    LangChain 1.0为所有模型都设置了结构化输出方法,可以让模型的回复严格匹配一份给定的Schema(模式)。便于解析与后续处理。结构化输出能避免"自然语言歧义",让下游流程(数据库写入、API调用、连环任务)稳、准、可测。

    目前LangChain 1.0支持多种Schema与结构化输出方式:

    Pydantic(字段校验、描述、嵌套结构,功能最丰富)

    TypedDict(轻量类型约束)

    JSON Schema(与前后端/跨语言接口最通用)

    示例代码:

    from pydantic import BaseModel,Field
    from langchain.chat_models import init_chat_model
    
    
    model = init_chat_model(
        #本地模型名
        model="hopephoto/Qwen3-4B-Instruct-2507_q8:latest",
        model_provider="ollama",
        # temperature 0.1~0.9之间,值越小回答越稳定,越高随机性越高
        temperature=0.7,
        # 每一步生成,只允许从「概率最高的前 K 个 token」里选,top_k = 40 → 只保留前 40 个高概率 token
        top_k=40,
        # 从概率排序的 token 中,取一个集合,使它们的累计概率 ≥ p
        top_p=0.95,
        base_url="http://localhost:11434",
    )
    
    class Movie(BaseModel):
        title: str = Field(..., description='标题')
        year: int = Field(..., description='年龄')
        director:str = Field(..., description='导演')
        rating: float = Field(..., description='评分')
    message = '提供关于电影《盗梦空间》的详细信息'
    
    model_with_structure = model.with_structured_output(Movie)
    response = model_with_structure.invoke(message)
    print(response)

    结果如下:

    title='盗梦空间' year=2010 director='克里斯托弗·诺兰' rating=8.8


    上面使用Pydantic的BaseModel定义一个严格的数据结构。每个字段都明确了数据类型(如,str、int、float),并用Field(..., description='')提供语义描述。据此,模型回复时,LangChain会要求LLM的输出必须能填充这些字段。


关键字