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

news/2025/2/23 14:32:59

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.niftyadmin.cn/n/5863478.html

相关文章

如何保存爬虫获取商品评论的数据?

保存爬取的评论数据是爬虫项目中的一个重要环节。根据需求,你可以选择将数据保存为本地文件(如CSV、JSON、TXT),或者存储到数据库(如MySQL、MongoDB等)。以下是几种常见的数据保存方式及其示例代码。 1. 保…

ChatGPT平替自由!DeepSeek-R1私有化部署全景攻略

一、DeepSeek-R1本地部署配置要求 (一)轻量级模型 ▌DeepSeek-R1-1.5B 内存容量:≥8GB 显卡需求:支持CPU推理(无需独立GPU) 适用场景:本地环境验证测试/Ollama集成调试 (二&a…

python: 并发编程 (Concurrent Programming) Simple example

# encoding: utf-8 # 版权所有 2025 ©涂聚文有限公司™ # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:并发编程 (Concurrent Programming) pip install mysql.connector # Author : geovindu,Geovin Du 涂…

力扣每日一题【算法学习day.132】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!! 习题 1.统计相似字符串对的数目 题目链…

Cannot deserialize instance of java.lang.String out of START_ARRAY token

这个错误 Cannot deserialize instance of java.lang.String out of START_ARRAY token 表示 Jackson 正在尝试将一个 JSON 数组反序列化成一个 String 类型的字段,但是 JSON 中传递的是一个数组而不是单一的字符串。 具体来说,这段堆栈信息&#xff1a…

Spring Boot3+Vue2极速整合:10分钟搭建DeepSeek AI对话系统

前言 在生成式AI技术蓬勃发展的今天,大语言模型已成为企业智能化转型和个人效率提升的核心驱动力。作为国产大模型的优秀代表,DeepSeek凭借其卓越的中文语义理解能力和开发者友好的API生态,正在成为构建本土化AI应用的首选平台。 本文将以S…

Vue 2全屏滚动动画实战:结合fullpage-vue与animate.css打造炫酷H5页面

引言 在移动端H5开发中,全屏滚动效果因其沉浸式体验而广受欢迎。如何快速实现带有动态加载动画的全屏滚动页面?本文将手把手教你使用 Vue 2、全屏滚动插件 fullpage-vue 和动画库 animate.css 3.5.1,打造一个高效且视觉冲击力强的H5页面。通…

DeepSeekMath论文中后训练统一视角(Unified Paradigm)解析

以下是一篇简单的博客,用来介绍论文 DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models(特别是其第 5.2.1 节 “Towards to a Unified Paradigm”)中提到的统一强化学习范式。希望能帮助大家更系统地理解…