AI大模型学习(三): LangChain(二)
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 ChatMessageHistoryimport 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 都是一个tokenprint(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 linecollection_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 oskey = ''
os.environ["OPENAI_API_KEY"] = key
model = ChatOpenAI(model='gpt-4')
# 测试数据,假设文档数据如下
documents = [Document(page_content='狗是伟大的伴侣,以其忠诚和友好而闻名', # 文本内容metadata={'source': '哺乳动物宠物文档'} # 文档摘要/作者/来源),Document(page_content='猫是独立的宠物,通常喜欢自己的空间',metadata={'source': '哺乳动物宠物文档'})
]# 向量化,存储向量数据库
"""
OPENAI_API_KEYdef 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 linecollection_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='')
相关文章:
AI大模型学习(三): LangChain(二)
Langchain构建聊天机器人 安装依赖 pip install langchain_community Chat History:它允许聊天机器人"记住"过去的互动,并在回应后续问题时考虑他们 代码 # 创建模型 from langchain_core.messages import HumanMessage from langchain_core.prompts import ChatP…...
apply的用法
apply 是一个在编程语言中常见的函数,它在不同的上下文和语言中有不同的用途。以下是 apply 在常见编程语言中的几种常见用法: 1. Python 中的 apply 方法 在 Python 中,apply 主要用于 pandas 库中的 DataFrame 或 Series 对象,…...
【论文解读】TransMLA: Multi-Head Latent Attention Is All You Need
论文链接 1. 论文背景与问题动机 现代大规模语言模型(LLM)在推理时往往遇到通信瓶颈,主要原因在于自注意力机制中需要缓存大量的 Key-Value(KV)对。例如,对于 LLaMA‑65B 这种模型,即使采用 8…...
CentOS 下安装和配置 HTTPD 服务的详细指南
CentOS 下安装和配置 HTTPD 服务的详细指南 CentOS 下安装和配置 HTTPD 服务的详细指南1. 环境准备2. 安装 HTTPD 服务2.1 更新系统2.2 安装 HTTPD2.3 启动 HTTPD 服务2.4 检查 HTTPD 服务状态 3. 配置防火墙3.1 开放 HTTP 和 HTTPS 端口3.2 验证防火墙规则 4. 配置 HTTPD4.1 主…...
VUE3中子组件改变父组件传过来的值(props)的方法和使用场景详解
在 Vue 3 中,子组件改变父组件传过来的值(props)的方法主要有以下几种:通过事件发射、使用 v-model、模拟 .sync 修饰符的功能(Vue 3 中已移除),以及使用 ref 或 reactive。下面我将结合代码示例…...
登录-06.JWT令牌-生成和校验
一.JWT令牌的生成和校验 JWT令牌生成 想要生成JWT令牌,那么就要首先引入JWT令牌的相关依赖, <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version>…...
【Git】多人协作
文章目录 完成准备工作多人协作场景一场景二远程分支删除后,本地 git branch -a 依然能看到的解决办法 完成准备工作 在之前,我们所完成的工作如下: 基本完成 Git 的所有本地库的相关操作,git基本操作,分支理解&#…...
Python爬虫-破解字体加密技术
前言 本文是该专栏的第77篇,后面会持续分享python爬虫干货知识,记得关注。 字体加密是一种常见的反爬虫技术,通过自定义字体文件和字符映射来保护网页内容,防止爬虫直接获取文本信息。 在文章《Python爬虫-猫眼电影的影院数据》中,笔者有详细介绍过猫眼的相关数据采集。…...
邮件安全之发件人伪造
电子邮件工作原理 电子邮件传输过程中主要涉及到SMTP、IMAP、POP3三种协议,具体功能如下: SMTP:全称Simple Mail Transfer Protocol,即简单邮件传输协议,主要用于发送邮件,使用端口号25。 IMAP:全称Internet Mail Acce…...
git 常用功能
以下是 Git 的常用功能及其命令: 初始化仓库 git init在当前目录初始化一个新的 Git 仓库。 克隆仓库 git clone <仓库地址>将远程仓库克隆到本地。 查看状态 git status查看工作区和暂存区的状态。 添加文件到暂存区 git add <文件名>将文件添…...
【llm落地】从零到一,用DeepSeek打造智能BI工具:自然语言驱动数据洞察
在数据驱动的时代,商业智能 (BI) 工具已经成为企业决策的关键。然而,传统的 BI 工具往往操作复杂,需要专业技能才能驾驭。想象一下,如果用户只需要用 自然语言 就能轻松查询数据、获取分析结果甚至生成可视化图表,那将会多么高效和便捷! 本文将带你踏上从零到一构建智能…...
请谈谈 Vue 中的 key 属性的重要性,如何确保列表项的唯一标识?
1. Key属性的核心作用(附代码对比) // 错误示例:未使用key的列表渲染 <template><ul><li v-for"item in items">{{ item.text }}</li></ul> </template>// 正确示例:使用唯一key的…...
使用 AIStor 和 OpenSearch 增强搜索功能
在这篇文章中,我们将探讨搜索,特别是 OpenSearch 如何帮助我们识别模式或查看不断增长的数据中的趋势。例如,如果您正在查看运营数据,如果您的服务似乎是随机的,那么您需要尽可能回溯以识别模式并找出原因。这不仅适用…...
Node.js中如何修改全局变量的几种方式
Node.js中如何修改全局变量。我需要先理解他们的需求。可能他们是在开发过程中遇到了需要跨模块共享数据的情况,或者想要配置一些全局可访问的设置。不过,使用全局变量可能存在一些问题,比如命名冲突、难以维护和测试困难,所以我得…...
基于Python和Neo4j开发的医疗辅助诊断系统的详细实现步骤和代码示例
以下是一个基于Python和Neo4j开发的医疗辅助诊断系统的详细实现步骤和代码示例。 1. 环境准备 首先,确保你已经安装了必要的库。可以使用以下命令进行安装: pip install py2neo2. Neo4j数据库初始化 在Neo4j中创建一个新的数据库,并启动N…...
第9章:LangChain结构化输出-示例2(数字提取服务)
如何使用LangChain4j框架创建和使用多种AI服务。它通过定义接口和注解,将自然语言处理任务(如情感分析、数字提取、日期提取、POJO提取等)封装为服务,并通过LangChain4j的AiServices动态生成这些服务的实现。 本章主要讲述基于Lan…...
【LLM】R1复现项目(SimpleRL、OpenR1、LogitRL、TinyZero)持续更新
note (1)未来的工作需亟待解决: 支持大规模 RL 训练(PPO、GRPO 等)的开源基础框架用于稳定训练的 GRPO 训练超参的自动化调优RL 训练数据的配比(难度、领域、任务等)基于 Instruct 模型训练 R…...
买股票的最佳时机 - 2
买卖股票的最佳时机 III 题目描述: 提示: 1 < prices.length < 1050 < prices[i] < 105 分析过程: 写动态规划,我们需要考虑一下问题: 定义状态状态转移方程初始条件 遍历顺序 4种状态: …...
Python基于flask的智慧交通可视化,大数据智慧交通数据可视化系统
博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
【Unity】鱼群效果模拟
鱼群效果模拟 文章目录 鱼群效果模拟Boid算法实现方式version1_CPUversion2_GPUversion3_Multilaterationversion4_Bitonic_Sorting (GPU友好)version5_Skinning (TODO) 细节项优化项参考链接 Boid算法 Boid算法是一种模拟群体行…...
Unity使用IL2CPP打包时,我们应该注意什么?如何避免(可以举例说明)
这一篇部分内容在Unity之中如何处理C#底层代码那篇博客之中有提及,接下来对这部分进行补充说明。(请先阅读--Unity之中如何处理C#底层代码) 目录 1 注意点 2 如何避免 1 注意点 IL2CPP 在编译过程中会将 IL(中间语言…...
Wireshark使用介绍
文章目录 Wireshark介绍Wireshark使用工作模式介绍1. 混杂模式(Promiscuous Mode)2. 普通模式(Normal Mode)3. 监视模式(Monitor Mode) 界面分区捕获过滤器语法基本语法逻辑运算符高级语法使用示例捕获过滤…...
云图库平台(五)——后端图片模块开发
目录 一、需求分析二、库表设计三、图片的处理如何实现图片的上传和下载创建图片的业务流程如何对图片进行解析 四、创建并使用对象存储五、后端操作对象存储初始化客户端通用能力类文档上传文件下载 一、需求分析 管理员功能: 图片的上传和创建:仅管理…...
postman调用ollama的api
按照如下设置,不需要设置key 保持长会话的方法 # 首次请求 curl http://localhost:11434/api/generate -d {"model": "deepseek-r1:32b","prompt": "请永久记住:110,1-12,之后所有数学计算必…...
十、OSG学习笔记-多线程(OpenThreads)
上一节内容: 九、OSG学习笔记-NodeVisitor节点遍历器-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145742756?spm1001.2014.3001.5501 本章节代码: OsgStudy/Openthreads CuiQingCheng/OsgStudy - 码云 - 开源中国https://gite…...
Gemma 2 的滑动窗口注意力(Sliding Window Attention)解析:源代码
Gemma 2 的滑动窗口注意力(Sliding Window Attention)解析 在 Transformer 结构 中,自注意力(Self-Attention)是核心机制之一。然而,标准的自注意力计算复杂度为 ( O ( n 2 ) O(n^2) O(n2) ),随…...
机器学习数学通关指南——链式法则
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一、定义与公式 链式法则&a…...
Python爬虫实战:从零到一构建数据采集系统
文章目录 前言一、准备工作1.1 环境配置1.2 选择目标网站 二、爬虫实现步骤2.1 获取网页内容2.2 解析HTML2.3 数据保存 三、完整代码示例四、优化与扩展4.1 反爬应对策略4.2 动态页面处理4.3 数据可视化扩展 五、注意事项六、总结互动环节 前言 在大数据时代,数据采…...
DeepSeek 助力 Vue 开发:打造丝滑的单选按钮(Radio Button)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
【行业解决方案篇十八】【DeepSeek航空航天:故障诊断专家系统 】
引言:为什么说这是“航天故障终结者”? 2025年春节刚过,航天宏图突然官宣"DeepSeek已在天权智能体上线",这个搭载在卫星和空间站上的神秘系统,号称能提前48小时预判99.97%的航天器故障。这不禁让人想起年初NASA禁用DeepSeek引发的轩然大波,更让人好奇:这套系…...
