当前位置: 代码网 > it编程>前端脚本>Python > Python—使用LangChain调用千帆大模型

Python—使用LangChain调用千帆大模型

2024年07月28日 Python 我要评论
LangChain就是一个 LLM 编程框架,你想开发一个基于 LLM 应用,需要什么组件它都有,直接使用就行;甚至针对常规的应用流程,它利用链(LangChain中Chain的由来)这个概念已经内置标准化方案了。LangChain是一个用于开发由语言模型提供支持的应用程序的框架。数据感知:将语言模型连接到其他数据源具有代理性质:允许语言模型与其环境交互

文章目录

  • 前言
  • 一、安装langchain
  • 二、获取千帆api key、secret key
  • 三、简单对话案例实现
  • 四、构建语言模型应用程序:llm
    • 1.初始化模型
    • 2.llm初始化和调用
  • 五、提示词模板(prompttemplate): 管理 llm 的提示
    • 1.定义提示模板
    • 2.组合 llm 和提示词
    • 3.组合输出解析器
  • 六、信息检索链(retrieval chain)
    • 1.加载索引数据
    • 2.存储向量数据
    • 3.创建检索链传入问题
    • 4.使用检索器动态选择最相关的文档并将其传递
    • 5.完整代码及调用
  • 七、实现简单的聊天机器人
    • 1.聊天模型将使用消息进行响应。
    • 2.传入一个消息列表:
    • 3.使用conversationchain记住过去的用户输入和模型输出
    • 4.对话
    • 5.聊天检索
      • 1)加载博客文章。
      • 2)将其拆分并存储在向量中
      • 3)创建会话记忆
      • 4)整体代码示例
  • 总结


前言

langchain就是一个 llm 编程框架,你想开发一个基于 llm 应用,需要什么组件它都有,直接使用就行;甚至针对常规的应用流程,它利用链(langchain中chain的由来)这个概念已经内置标准化方案了。

langchain是一个用于开发由语言模型提供支持的应用程序的框架。它使应用程序能够:

  • 数据感知:将语言模型连接到其他数据源
  • 具有代理性质:允许语言模型与其环境交互
名称网址
langchain中文网https://www.langchain.com.cn/
langchain官网https://www.langchain.com/
langchain api文档地址https://api.python.langchain.com/en/latest/langchain_api_reference.html#

环境:

名称版本
python3.9
langchain0.1.0

一、安装langchain

此次我安装的最新版为:0.1.0

pip install langchain
#安装qianfan
pip install qianfan

二、获取千帆api key、secret key

  • 登录百度云搜索进入千帆大模型控制台
  • 没有应用则创建应用
  • 获取apikey、secretkey
    在这里插入图片描述

三、简单对话案例实现

"""for basic init and call"""
import os

from langchain_community.chat_models import qianfanchatendpoint
from langchain_core.messages import humanmessage

os.environ["qianfan_ak"] = "api_key"
os.environ["qianfan_sk"] = "secret_key"

chat = qianfanchatendpoint(
    streaming=true,
)
res = chat([humanmessage(content="讲一个故事")])
print(res.content)

输出结果如下:
在这里插入图片描述
到此最简单的案例就已经实现了。

四、构建语言模型应用程序:llm

langchain 最基本的构建块是对某些输入调用 llm。

让我们来看一个简单的例子。

我们假设我们正在构建一个基于公司产品生成公司名称的服务。

1.初始化模型

from langchain_community.llms import qianfanllmendpoint
os.environ["qianfan_ak"] = "api_key"
os.environ["qianfan_sk"] = "secret_key"
llm = qianfanllmendpoint(temperature=0.9)

2.llm初始化和调用

import os
from langchain_community.llms import qianfanllmendpoint

os.environ["qianfan_ak"] = "api_key"
os.environ["qianfan_sk"] = "secret_key"

llm = qianfanllmendpoint(temperature=0.9)

text = "对于一家生产彩色袜子的公司来说,什么是一个好的公司名称?"
print(llm.invoke(text))

五、提示词模板(prompttemplate): 管理 llm 的提示

调用 llm 是很好的第一步,但这仅仅是个开始。

通常在应用程序中使用 llm 时,不会将用户输入直接发送到 llm。

相反,您可能接受用户输入并构造一个提示符,然后将其发送给 llm。

例如,在前一个示例中,我们传入的文本被硬编码为询问一家生产彩色袜子的公司的名称。在这个虚构的服务中,我们希望只获取描述公司业务的用户输入,然后用这些信息格式化提示符。

1.定义提示模板

from langchain_core.prompts import chatprompttemplate

prompt = chatprompttemplate.from_messages(
    [
        ("user","我想去{location}旅游,能帮我简单介绍一下吗?")
    ]
)

2.组合 llm 和提示词

import os
from langchain_community.llms import qianfanllmendpoint
from langchain_core.prompts import chatprompttemplate

os.environ["qianfan_ak"] = "api_key"
os.environ["qianfan_sk"] = "secret_key"

llm = qianfanllmendpoint(temperature=0.9)


prompt = chatprompttemplate.from_messages(
    [
        ("user","我想去{location}旅游,能帮我简单介绍一下吗?")
    ]
)

chat = prompt | llm
result = chat.invoke({"location": "海南"})
print(result)

3.组合输出解析器

chatmodel(因此,此链)的输出是一条消息。但是,使用字符串通常要方便得多。让我们添加一个简单的输出解析器,将聊天消息转换为字符串。

from langchain_core.output_parsers import stroutputparser

output_parser = stroutputparser()

我们现在可以将其添加到上一个链中:

chain = prompt | llm | output_parser

我们现在可以调用它并提出相同的问题。答案现在将是一个字符串(而不是 chatmessage)。

六、信息检索链(retrieval chain)

实现目标:

我们将从检索器中查找相关文档,然后将它们传递到提示中。 retriever 可以由任何东西支持——sql 表、互联网等——但在本例中,我们将填充一个向量存储并将其用作检索器。

1.加载索引数据

首先,我们需要加载要索引的数据:

from langchain_community.document_loaders import webbaseloader
web_url = "https://zhuanlan.zhihu.com/p/85289282"
# 使用webbaseloader加载html
loader = webbaseloader(web_url)
docs = loader.load()

2.存储向量数据

接下来,我们需要将其索引到向量存储中。

下载向量数据库chroma

pip install chromadb

根据版本问题可能出现的问题:

然后我们可以构建我们的索引:

from langchain_community.vectorstores import chroma
from langchain_community.embeddings import qianfanembeddingsendpoint
from langchain.text_splitter import recursivecharactertextsplitter
# 导入千帆向量模型
embeddings = qianfanembeddingsendpoint()
# 导入递归字符文本分割器
text_splitter = recursivecharactertextsplitter(chunk_size = 384, chunk_overlap = 0, separators=["\n\n", "\n", " ", "", "。", ","])
# 导入文本
documents = text_splitter.split_documents(docs)
# 存入向量数据库
vector = chroma.from_documents(documents, embeddings)

3.创建检索链传入问题

我们设置一个链,该链接受一个问题和检索到的文档并生成一个答案。

from langchain.chains.combine_documents import create_stuff_documents_chain
# 创建提示词模板
prompt = chatprompttemplate.from_template("""使用下面的语料来回答本模板最末尾的问题。如果你不知道问题的答案,直接回答 "我不知道",禁止随意编造答案。
        为了保证答案尽可能简洁,你的回答必须不超过三句话,你的回答中不可以带有星号。
        请注意!在每次回答结束之后,你都必须接上 "感谢你的提问" 作为结束语
        以下是一对问题和答案的样例:
            请问:秦始皇的原名是什么
            秦始皇原名嬴政。感谢你的提问。
        
        以下是语料:
<context>
{context}
</context>

question: {input}""")
#创建千帆llm模型
llm = qianfanllmendpoint()
#创建检索链
document_chain = create_stuff_documents_chain(llm, prompt)

4.使用检索器动态选择最相关的文档并将其传递

from langchain.chains import create_retrieval_chain

retriever = vector.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)

5.完整代码及调用

import os
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_community.document_loaders import webbaseloader
from langchain_community.embeddings import qianfanembeddingsendpoint
from langchain_community.vectorstores import chroma
from langchain.text_splitter import recursivecharactertextsplitter
from langchain_core.prompts import chatprompttemplate
from langchain_community.llms import qianfanllmendpoint

os.environ["qianfan_ak"] = "api_key"
os.environ["qianfan_sk"] = "secret_key"

# 定义url
web_url = "https://zhuanlan.zhihu.com/p/85289282"
# 使用webbaseloader加载html
loader = webbaseloader(web_url)
docs = loader.load()
# 导入千帆向量模型
embeddings = qianfanembeddingsendpoint()
# 导入递归字符文本分割器
text_splitter = recursivecharactertextsplitter(chunk_size = 384, chunk_overlap = 0, separators=["\n\n", "\n", " ", "", "。", ","])
# 导入文本
documents = text_splitter.split_documents(docs)
# 存入向量数据库
vector = chroma.from_documents(documents, embeddings)

# 创建提示词模板
prompt = chatprompttemplate.from_template("""使用下面的语料来回答本模板最末尾的问题。如果你不知道问题的答案,直接回答 "我不知道",禁止随意编造答案。
        为了保证答案尽可能简洁,你的回答必须不超过三句话,你的回答中不可以带有星号。
        请注意!在每次回答结束之后,你都必须接上 "感谢你的提问" 作为结束语
        以下是一对问题和答案的样例:
            请问:秦始皇的原名是什么
            秦始皇原名嬴政。感谢你的提问。
        
        以下是语料:
<context>
{context}
</context>

question: {input}""")
#创建千帆llm模型
llm = qianfanllmendpoint()
#我们设置一个链,该链接受一个问题和检索到的文档并生成一个答案。
document_chain = create_stuff_documents_chain(llm, prompt)
#使用检索器动态选择最相关的文档并将其传递。
retriever = vector.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)
#调用这个链了。这将返回一个字典 - 来自 llm 的响应在键中answer
response = retrieval_chain.invoke({
    "input": "朱元璋时期中国多少人口?"
})
print(response["answer"])

结果示例:

七、实现简单的聊天机器人

使用普通聊天模型,我们可以通过传递一个消息或使用chatmodel发送更多消息。

1.聊天模型将使用消息进行响应。

import os
from langchain.schema import humanmessage, systemmessage
from langchain_community.chat_models import qianfanchatendpoint

os.environ["qianfan_ak"] = "api_key"
os.environ["qianfan_sk"] = "secret_key"

chat = qianfanchatendpoint()
res = chat.invoke([
    humanmessage(
        content="把这句话从中文翻译成英语:我喜欢编程。"
    )
])
print(res.content)

2.传入一个消息列表:

import os
from langchain.schema import humanmessage, systemmessage
from langchain_community.chat_models import qianfanchatendpoint

os.environ["qianfan_ak"] = "api_key"
os.environ["qianfan_sk"] = "secret_key"

#使用默认的模型回答不正确,所以切换至模型:ernie-bot-4
chat = qianfanchatendpoint(model='ernie-bot-4',temperature=0.8)
res = chat.invoke([
    systemmessage(
        content="你是把中文翻译成英文的得力助手。"
    ),
    humanmessage(content="我喜欢编程。"),
])
print(res.content)

3.使用conversationchain记住过去的用户输入和模型输出

然后,我们可以将聊天模型包装在conversationchain中,它有内置内存,用于记住过去的用户输入和模型输出。

import os
from langchain.schema import humanmessage, systemmessage
from langchain_community.chat_models import qianfanchatendpoint
from langchain.chains import conversationchain
 
os.environ["qianfan_ak"] = "api_key"
os.environ["qianfan_sk"] = "secret_key"

chat = qianfanchatendpoint(model='ernie-bot-4',temperature=0.8)
conversation = conversationchain(llm=chat)
res = conversation.invoke({"input":"你是把中文翻译成英文的得力助手:我喜欢编程"})

print(res['response'])
#结果为: to english. your sentence "我喜欢编程" translates to "i enjoy programming."

res2=conversation.invoke({"input":"把他翻译成德语"})
print(res2)
#结果为:将其翻译成德语为 "ich genieße das programmieren.

4.对话

我们通过conversationbuffermemory可以指定我们的对话记录

此案例是指定对话记录,继续进行对话。

import os
from langchain_community.chat_models import qianfanchatendpoint
from langchain.chains import llmchain
from langchain.memory import conversationbuffermemory
from langchain_core.prompts import chatprompttemplate, systemmessageprompttemplate, messagesplaceholder, \
    humanmessageprompttemplate

os.environ["qianfan_ak"] = "api_key"
os.environ["qianfan_sk"] = "secret_key"

chat = qianfanchatendpoint(model='ernie-bot-4', temperature=0.8)
prompt = chatprompttemplate.from_messages(
    [
        systemmessageprompttemplate.from_template(
            "你是一个聊天机器人"
        ),
        messagesplaceholder(variable_name="chat_history"),
        humanmessageprompttemplate.from_template("{question}")
    ]
)
memory = conversationbuffermemory(memory_key="chat_history", return_messages=true)
memory.save_context({"input": "你好"}, {"output": "你好,请问有什么我可以帮助你的吗?"})
memory.save_context({"input": "把这句话从中文翻译成英语:我喜欢编程。"}, {"output": " i enjoy programming."})
conversation = llmchain(llm=chat, prompt=prompt, verbose=true, memory=memory)

# 注意,我们只是传入了“question”变量——“chat_history”由内存填充
res = conversation.invoke({"question": "现在把这个句子译成德语。"})
print(res)

输出结果如下:
在这里插入图片描述

5.聊天检索

现在,假设我们想要与文档或其他知识来源聊天。

这是一个流行的用例,结合了聊天和文档检索。

它允许我们与模型没有训练过的特定信息进行聊天。

1)加载博客文章。

from langchain_community.document_loaders import webbaseloader
# 加载博客文章。
loader = webbaseloader("https://zhuanlan.zhihu.com/p/85289282")
data = loader.load()

2)将其拆分并存储在向量中

from langchain.text_splitter import recursivecharactertextsplitter

text_splitter = recursivecharactertextsplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)

from langchain_community.vectorstores import chroma
from langchain_openai import openaiembeddings

vectorstore = chroma.from_documents(documents=all_splits, embedding=openaiembeddings())

3)创建会话记忆

memory = conversationsummarymemory(
    llm=llm, memory_key="chat_history", return_messages=true
)
from langchain.chains import conversationalretrievalchain
from langchain_openai import chatopenai

llm = chatopenai()
retriever = vectorstore.as_retriever()
qa = conversationalretrievalchain.from_llm(llm, retriever=retriever, memory=memory)

4)整体代码示例

# 聊天检索
import os
from langchain_community.chat_models import qianfanchatendpoint
from langchain.chains import conversationchain, llmchain, conversationalretrievalchain
from langchain.memory import conversationbuffermemory, conversationsummarymemory
from langchain_community.embeddings import qianfanembeddingsendpoint
from langchain_community.vectorstores import chroma
from langchain_community.document_loaders import webbaseloader
from langchain.text_splitter import recursivecharactertextsplitter

os.environ["qianfan_ak"] = "api_key"
os.environ["qianfan_sk"] = "secret_key"

# 加载博客文章。
loader = webbaseloader("https://zhuanlan.zhihu.com/p/85289282")
data = loader.load()
# 将其拆分并存储在向量中。
text_splitter = recursivecharactertextsplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)
# 存储在向量中。
vectorstore = chroma.from_documents(documents=all_splits, embedding=qianfanembeddingsendpoint())
# 像以前一样创建我们的记忆,但是让我们使用 conversationsummarymemory
retriever = vectorstore.as_retriever()

chat = qianfanchatendpoint(model='ernie-bot-4', temperature=0.8)
memory = conversationsummarymemory(
    llm=chat, memory_key="chat_history", return_messages=true
)
qa = conversationalretrievalchain.from_llm(llm=chat, retriever=retriever, memory=memory)

res = qa.invoke(
    {"question": "请帮我出3个明朝的题目并给出答案"}
)
print(res["answer"])

结果:
在这里插入图片描述

总结

langcahin框架功能非常强大,但是要注意版本问题。在langchain0.1.0版本之后很多写法就变了。英文官网上也是只有部分更新的新的写法,老写法也依然支持但是已经不推荐使用了。后续还会持续学习,会继续更新更多用法。

存疑:由于是新手python选手,安装python环境直接使用最新的3.12版本装不上langchain也换电脑试了还是不行被迫改为3.8或3.9。有懂的大佬可以评论讲解一下。

本文很多文案和代码示例都来源于官网(略有修改),有一些文案翻译的不对凑活看吧。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com