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

news/2025/2/23 10:07:49/

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 ChatMessageHistorymodel = ChatOpenAI(model='gpt-4-turbo', api_key='your_api_key')# 定义提示模版
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 ChatMessageHistorymodel = ChatOpenAI(model='gpt-4-turbo', api_key='your_api_key')# 定义提示模版
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 ChatOpenAImodel = ChatOpenAI(model='gpt-4-turbo', api_key='your_api_key')
# 测试数据,假设文档数据如下
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 的聊天模型
"""model = ChatOpenAI(model='gpt-4-turbo', api_key='your_api_key')
# 测试数据,假设文档数据如下
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())
"""
使用 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('请介绍一下猫')


http://www.ppmy.cn/news/1574406.html

相关文章

el-table表格滚动条默认最右

我的需求描述: 首先我使用el-table表格,数据是轮询获取的, 需求是:希望表格的滚动条在初始时默认最右, 并且当有新数据进来时,滚动条依然默认最右 我的解决方案: 页面中表格的滚动条默认最右&am…

vue 判断一个属性值,如果是null或者空字符串或者是空格没有值的情况下,赋值为--

在 Vue 中,可以通过多种方式来判断一个属性值是否为 null、空字符串或者仅包含空格,如果满足这些条件则将其赋值为 --。下面分别介绍在模板和计算属性、方法中实现的具体做法。 1. 在模板中直接判断 如果只需要在模板中对属性值进行显示处理&#xff0c…

uniapp 九宫格抽奖

抽奖 样式就自己写吧 实现思路:因为是九宫格,里面商品只会有九个,他们的index是固定的,然后根据后端返回的中奖商品id找出他的index,设置抽奖动画固定跑三遍然后加上你中奖id的index即可 代码: // 点击后…

python实现实时字幕与翻译

项目地址:https://github.com/Cheng0829/Real-Time-Subtitles-Translation 实时字幕与翻译 概述 这是我做的一个根据系统声音实时显示英文字幕与中文翻译的软件,功能如下: 打开软件后默认暂停状态,需要点击按钮进入开始状态&am…

AI 编程工具—Cursor 进阶篇 数据分析

AI 编程工具—Cursor 进阶篇 数据分析 上一节课我们使用Cursor 生成了北京房产的销售数据,这一节我们使用Cursor对这些数据进行分析,也是我们尝试使用Cursor 去帮我们做数据分析,从而进一步发挥Cursor的能力,来帮助我们完成更多的事情 案例一 房产销售数据分析 @北京202…

Oracle 10g数据库资源下载分享

简介:Oracle 10g是Oracle公司推出的一款数据库管理系统版本,本教程将向读者详细说明如何在不同的操作系统平台上安装、配置Oracle 10g,包括系统需求、安装步骤、数据库启动关闭、用户和表空间管理、网络配置及性能调优。同时,还介…

2025年能源会议要点

2025年全国能源工作会议于2024年12月15日在北京召开,这次会议是国家能源局在新的一年里对全国能源工作的规划与部署的重要会议。 会议特别强调了加快构建新型能源体系、推动能源高质量发展的重要性,并明确提出了2025年要初步建成全国统一电力市场的目标。…

使用 FFmpeg 剪辑视频指南

FFmpeg 是一个功能强大的多媒体处理工具,可以进行视频和音频的剪辑、合并、转码等操作。本文将详细介绍如何使用 FFmpeg 进行视频剪辑,并通过实例帮助你快速掌握剪辑技巧。我们会从最基础的剪切功能讲起,再延伸到一些高级操作,如指…