AI大模型学习(三): LangChain(二)

news2025/2/24 11:38:25

Langchain构建聊天机器人

安装依赖

pip install langchain_community

Chat History:它允许聊天机器人"记住"过去的互动,并在回应后续问题时考虑他们

代码

# 创建模型
from langchain_core.messages import HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain_community.chat_message_histories import ChatMessageHistory
import os
key = ''
os.environ["OPENAI_API_KEY"] = key
model = ChatOpenAI(model='gpt-4')

# 定义提示模版
prompt_template = ChatPromptTemplate.from_messages(
    [('system', '你是一个乐于助人的助手,用{language}尽你所能回答问题'),
     MessagesPlaceholder(variable_name='my_mes')]  # 没有这个每次会话就会变成单独的
)

# 得到链
chain = prompt_template | model

# 保存聊天的历史记录
store = {}  # 所有用户的聊天记录都保存到store key:session_id,value:聊天记录


# 从聊天记录中获取当前用户的聊天内容
def get_session_history(session_id):
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    else:
        return store[session_id]


do_message = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key='my_mes'  # 每次聊天时候发送消息得key
)
config = {'configurable': {'session_id': "xxx"}}  # 给当前会话定义session_id
# 第一轮聊天,发送的信息
response = do_message.invoke(
    {
        'key': [HumanMessage(content='你好,我是XXX')],
        'language': '中文'
    },
    config=config
)
# 第一轮结果
print(response.content)

# 第二轮
response = do_message.invoke(
    {
        'key': [HumanMessage(content='请问我的名字是什么')],
        'language': '中文'
    },
    config=config
)
print(response.content)

 流式返回

# 创建模型
from langchain_core.messages import HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain_community.chat_message_histories import ChatMessageHistory

import os
key = ''
os.environ["OPENAI_API_KEY"] = key
model = ChatOpenAI(model='gpt-4')

# 定义提示模版
prompt_template = ChatPromptTemplate.from_messages(
    [('system', '你是一个乐于助人的助手,用{language}尽你所能回答问题'),
     MessagesPlaceholder(variable_name='my_mes')]  # 没有这个每次会话就会变成单独的
)

# 得到链
chain = prompt_template | model

# 保存聊天的历史记录
store = {}  # 所有用户的聊天记录都保存到store key:session_id,value:聊天记录


# 从聊天记录中获取当前用户的聊天内容
def get_session_history(session_id):
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    else:
        return store[session_id]


do_message = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key='my_mes'  # 每次聊天时候发送消息得key
)
config = {'configurable': {'session_id': "xxx"}}  # 给当前会话定义session_id
# 第一轮聊天,发送的信息
response = do_message.stream(
    {
        'key': [HumanMessage(content='你好,我是XXX')],
        'language': '中文'
    },
    config=config
)
# 第一轮结果,使用stream 就是流式输出,就是要一个生成器,我们可以通过for循环取值或者next取值
for res in response:
    # 每一次res 都是一个token
    print(res.content)

# 第二轮
response = do_message.stream(
    {
        'key': [HumanMessage(content='请问我的名字是什么')],
        'language': '中文'
    },
    config=config
)
for res in response:
    print(res.content)

Langchain构建向量数据库和检索器

支持从向量数据库和其他来源检索数据,以便与LLM工作流程集成,她们对于应用程序来说非常重要,这些应用程序需要获取数据以作为模型推理的一部分进行推理

安装

pip install langchain-chroma   langchain内置的一个向量数据库

构建向量空间

from langchain_chroma import Chroma
from langchain_core.documents import Document
from langchain_core.runnables import RunnableLambda
from langchain_openai import OpenAIEmbeddings
from langchain_openai import ChatOpenAI
import os
key = ''
os.environ["OPENAI_API_KEY"] = key
model = ChatOpenAI(model='gpt-4')
# 测试数据,假设文档数据如下
documents = [
    Document(
        page_content='狗是伟大的伴侣,以其忠诚和友好而闻名',  # 文本内容
        metadata={'source': '哺乳动物宠物文档'}  # 文档摘要/作者/来源
    ),
    Document(
        page_content='猫是独立的宠物,通常喜欢自己的空间',
        metadata={'source': '哺乳动物宠物文档'}
    )
]

# 向量化,存储向量数据库
"""
 def from_documents(
        cls: Type[Chroma],
        documents: List[Document],
        embedding: Optional[Embeddings] = None,
        ids: Optional[List[str]] = None,
        collection_name: str = _LANGCHAIN_DEFAULT_COLLECTION_NAME,
        persist_directory: Optional[str] = None,
        client_settings: Optional[chromadb.config.Settings] = None,
        client: Optional[chromadb.ClientAPI] = None,  # Add this line
        collection_metadata: Optional[Dict] = None,
        **kwargs: Any,
    ) -> Chroma:
"""
vector_store = Chroma.from_documents(documents, embedding=OpenAIEmbeddings())
# 相似度查询:返回相似的分数:分数越低相似度越高
# 不看分值直接调用similarity_search
print(vector_store.similarity_search_with_score('咖啡猫'))

# 检索器 k=1 返回相似度最高的第一个
retriever = RunnableLambda(vector_store.similarity_search).bind(k=1)

print(retriever.batch(['咖啡猫']))

结合大模型

from langchain_chroma import Chroma
from langchain_core.documents import Document
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
from langchain_openai import OpenAIEmbeddings
from langchain_openai import ChatOpenAI

"""
Chroma:用于创建和管理向量数据库。
Document:用于表示文档对象,包含文本内容和元数据。
ChatPromptTemplate:用于定义聊天提示模板。
RunnableLambda 和 RunnablePassthrough:用于构建可运行的组件。
OpenAIEmbeddings:用于将文本转换为向量表示。
ChatOpenAI:用于调用 OpenAI 的聊天模型
"""
import os

key = ''
os.environ["OPENAI_API_KEY"] = key
model = ChatOpenAI(model='gpt-4')
# 测试数据,假设文档数据如下
documents = [
    Document(
        page_content='狗是伟大的伴侣,以其忠诚和友好而闻名',  # 文本内容
        metadata={'source': '哺乳动物宠物文档'}  # 文档摘要/作者/来源
    ),
    Document(
        page_content='猫是独立的宠物,通常喜欢自己的空间',
        metadata={'source': '哺乳动物宠物文档'}
    )
]

# 向量化,存储向量数据库
"""
OPENAI_API_KEY
 def from_documents(
        cls: Type[Chroma],
        documents: List[Document],
        embedding: Optional[Embeddings] = None,
        ids: Optional[List[str]] = None,
        collection_name: str = _LANGCHAIN_DEFAULT_COLLECTION_NAME,
        persist_directory: Optional[str] = None,
        client_settings: Optional[chromadb.config.Settings] = None,
        client: Optional[chromadb.ClientAPI] = None,  # Add this line
        collection_metadata: Optional[Dict] = None,
        **kwargs: Any,
    ) -> Chroma:
"""
vector_store = Chroma.from_documents(documents, embedding=OpenAIEmbeddings())
"""
使用 OpenAIEmbeddings 将文档文本转换为向量表示。
使用 Chroma.from_documents 方法将文档及其向量表示存储到 Chroma 向量数据库中
"""
# 相似度查询:返回相似的分数:分数越低相似度越高
# 不看分值直接调用similarity_search
# print(vector_store.similarity_search_with_score('咖啡猫'))

# 检索器 bind(k=1) 表示在调用 similarity_search 时,只返回相似度最高的一个文档
retriever = RunnableLambda(vector_store.similarity_search).bind(k=1)

# 提示模版
message = """
使用提供的上下文仅回答这个问题:{question}
上下文{context}
"""
prompt_template = ChatPromptTemplate.from_messages(
    [('human', message)]
)
# RunnablePassthrough允许我们将用户的问题之后传递给prompt和model
chain = {'question': RunnablePassthrough(), 'context': retriever} | prompt_template | model
"""
RunnablePassthrough() 用于直接传递用户的问题。
{'question': RunnablePassthrough(), 'context': retriever} 表示将用户的问题直接传递给 question 键,同时通过 retriever 检索与问题相关的上下文,并将其传递给 context 键。
| 操作符用于将多个可运行的组件连接起来,形成一个链式调用。
最终的 chain 表示先将用户的问题和检索到的上下文传递给提示模板,然后将填充好的提示传递给 OpenAI 模型进行推理
"""
result = chain.invoke('请介绍一下猫')
print(result)
print(result.content)
"""
print(result):content='猫是一种独立的宠物,它们通常喜欢有自己的空间。' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 33, 'prompt_tokens': 113, 'total_tokens': 146, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4-0613', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-09fe2406-aca6-49df-aebc-289784e3c164-0' usage_metadata={'input_tokens': 113, 'output_tokens': 33, 'total_tokens': 146, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}
print(result.content):猫是一种独立的宠物,它们通常喜欢有自己的空间。
"""
# 下面是流式输出
result = chain.stream('请介绍一下猫')
for i in result:
    print(i.content,end='')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2304373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文解读】TransMLA: Multi-Head Latent Attention Is All You Need

论文链接 1. 论文背景与问题动机 现代大规模语言模型(LLM)在推理时往往遇到通信瓶颈,主要原因在于自注意力机制中需要缓存大量的 Key-Value(KV)对。例如,对于 LLaMA‑65B 这种模型,即使采用 8…

登录-06.JWT令牌-生成和校验

一.JWT令牌的生成和校验 JWT令牌生成 想要生成JWT令牌&#xff0c;那么就要首先引入JWT令牌的相关依赖&#xff0c; <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version>…

【Git】多人协作

文章目录 完成准备工作多人协作场景一场景二远程分支删除后&#xff0c;本地 git branch -a 依然能看到的解决办法 完成准备工作 在之前&#xff0c;我们所完成的工作如下&#xff1a; 基本完成 Git 的所有本地库的相关操作&#xff0c;git基本操作&#xff0c;分支理解&#…

邮件安全之发件人伪造

电子邮件工作原理 电子邮件传输过程中主要涉及到SMTP、IMAP、POP3三种协议&#xff0c;具体功能如下&#xff1a; SMTP:全称Simple Mail Transfer Protocol&#xff0c;即简单邮件传输协议&#xff0c;主要用于发送邮件&#xff0c;使用端口号25。 IMAP:全称Internet Mail Acce…

使用 AIStor 和 OpenSearch 增强搜索功能

在这篇文章中&#xff0c;我们将探讨搜索&#xff0c;特别是 OpenSearch 如何帮助我们识别模式或查看不断增长的数据中的趋势。例如&#xff0c;如果您正在查看运营数据&#xff0c;如果您的服务似乎是随机的&#xff0c;那么您需要尽可能回溯以识别模式并找出原因。这不仅适用…

【LLM】R1复现项目(SimpleRL、OpenR1、LogitRL、TinyZero)持续更新

note &#xff08;1&#xff09;未来的工作需亟待解决&#xff1a; 支持大规模 RL 训练&#xff08;PPO、GRPO 等&#xff09;的开源基础框架用于稳定训练的 GRPO 训练超参的自动化调优RL 训练数据的配比&#xff08;难度、领域、任务等&#xff09;基于 Instruct 模型训练 R…

买股票的最佳时机 - 2

买卖股票的最佳时机 III 题目描述&#xff1a; 提示&#xff1a; 1 < prices.length < 1050 < prices[i] < 105 分析过程&#xff1a; 写动态规划&#xff0c;我们需要考虑一下问题&#xff1a; 定义状态状态转移方程初始条件 遍历顺序 4种状态&#xff1a; …

Python基于flask的智慧交通可视化,大数据智慧交通数据可视化系统

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…

【Unity】鱼群效果模拟

鱼群效果模拟 文章目录 鱼群效果模拟Boid算法实现方式version1_CPUversion2_GPUversion3_Multilaterationversion4_Bitonic_Sorting &#xff08;GPU友好&#xff09;version5_Skinning &#xff08;TODO&#xff09; 细节项优化项参考链接 Boid算法 Boid算法是一种模拟群体行…

云图库平台(五)——后端图片模块开发

目录 一、需求分析二、库表设计三、图片的处理如何实现图片的上传和下载创建图片的业务流程如何对图片进行解析 四、创建并使用对象存储五、后端操作对象存储初始化客户端通用能力类文档上传文件下载 一、需求分析 管理员功能&#xff1a; 图片的上传和创建&#xff1a;仅管理…

postman调用ollama的api

按照如下设置&#xff0c;不需要设置key 保持长会话的方法 # 首次请求 curl http://localhost:11434/api/generate -d {"model": "deepseek-r1:32b","prompt": "请永久记住&#xff1a;110&#xff0c;1-12&#xff0c;之后所有数学计算必…

十、OSG学习笔记-多线程(OpenThreads)

上一节内容&#xff1a; 九、OSG学习笔记-NodeVisitor节点遍历器-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145742756?spm1001.2014.3001.5501 本章节代码&#xff1a; OsgStudy/Openthreads CuiQingCheng/OsgStudy - 码云 - 开源中国https://gite…

DeepSeek 助力 Vue 开发:打造丝滑的单选按钮(Radio Button)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

【行业解决方案篇十八】【DeepSeek航空航天:故障诊断专家系统 】

引言:为什么说这是“航天故障终结者”? 2025年春节刚过,航天宏图突然官宣"DeepSeek已在天权智能体上线",这个搭载在卫星和空间站上的神秘系统,号称能提前48小时预判99.97%的航天器故障。这不禁让人想起年初NASA禁用DeepSeek引发的轩然大波,更让人好奇:这套系…

谷歌浏览器更新后导致的刷新数据无法显示

这几天突然出现的问题&#xff0c;就是我做了一个网站&#xff0c;一直用Google展示&#xff0c;前两天突然就是刷新会丢失数据&#xff0c;然后再刷新几次吧又有了&#xff0c;之前一直好好的&#xff0c;后端也做了一些配置添加了CrossOrigin注解&#xff0c;然而换了edge浏览…

游戏设计模式阅读 - 游戏循环

游戏与普通程序最大的不同点在于&#xff1a; 游戏不像其他大多数软件&#xff0c;游戏即使在没有玩家输入时也继续运行。 如果你站在那里看着屏幕&#xff0c;游戏也不会冻结。动画会持续播放。视觉效果继续闪烁。 如果运气不好的话&#xff0c;怪物会继续暴揍你的角色。 那么…

(五)趣学设计模式 之 建造者模式!

目录 一、 啥是建造者模式&#xff1f;二、 为什么要用建造者模式&#xff1f;三、 建造者模式怎么实现&#xff1f;四、 建造者模式的应用场景五、 建造者模式的优点和缺点六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方…

github 怎么创建一个私有repository 并从另外一台电脑拉取下来更新

1.github上新建一个repository 设置为private tips删除在这 点setting 然后往下拖动 会有个这里是用来删项目的 2.另外 一台电脑拉取这个repository的时候 需要配置 一个ssh key 这个key的内容生成参考本地电脑的生成 然后在这配置 2.1 生成 SSH 密钥&#xff08;如果还没有…

DeepSeek-R1本地化部署的硬件要求

DeepSeek-R1本地化部署的硬件要求全解析 引言 DeepSeek-R1作为一款高效的AI推理模型&#xff0c;凭借其卓越的推理性能和灵活的训练机制&#xff0c;成为了春节期间的热议话题。 然而&#xff0c;要在本地成功部署DeepSeek-R1&#xff0c;尤其是其满载的 671B 参数版本&#…

AGI觉醒假说的科学反驳:从数学根基到现实约束的深度解析

文章目录 引言:AGI觉醒论的核心迷思一、信息论视角:意识产生的熵约束1.1 香农熵的物理极限1.2 量子退相干的时间屏障二、数学根基:形式系统的自指困境2.1 哥德尔不完备定理的现代诠释三、概念解构:AGI觉醒假说的认知陷阱3.1 术语混淆的迷雾3.2 拟人化谬误的认知根源四、意识…