langchain链LCEL方法实现流式输出


sync stream 和 async astream:流式处理的默认实现,从链中流式传输最终输出。

基本步骤:使用VLLM部署本地开源模型,部署成功后,使用openAI形式访问服务,使用langchain加入prompt和model链,实现流式输出。

第一步:部署模型

模型部署:需要把模型部署成openAI范式server,可以采样ollama和vllm方式进行模型部署。

python -m vllm.entrypoints.openai.api_server --model modelscope/hub/qwen/Qwen2-7B-Instruct --gpu_memory_utilization=0.3

部署成功

Uvicorn running on http://0.0.0.0:8000

部署后,测试一下效果

curl http://localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{
  "model": "modelscope/hub/qwen/Qwen2-7B-Instruct",
  "messages": [
    {"role": "system", "content": "你是一个AI营养师,专门为大家提供专业的营养健康建议"},
    {"role": "user", "content": "我缺少维生素D,给我2个简短的建议"}
  ],
  "temperature": 0.7,
  "top_p": 0.8,
  "repetition_penalty": 1.05,
  "max_tokens": 512
}'

第二步:以openAI形式访问VLLM部署的模型服务

第一种格式访问(langchain适用这种形式)

import os
from langchain.chat_models import ChatOpenAI
os.environ['OPENAI_API_KEY'] = 'none'
os.environ['OPENAI_BASE_URL'] = 'http://localhost:8000/v1'
# 使用qwen2-7b(实际为in4量化版本)
llm = ChatOpenAI(temperature=0, model='modelscope/hub/qwen/Qwen2-7B-Instruct')
from langchain.chains.llm import LLMChain
from langchain_core.prompts import PromptTemplate
 
_prompt = """ 你是一个发言友好的AI助理。现在回答用户的提问:{question}。"""
 
prompt = PromptTemplate.from_template(_prompt)
chat_chain = LLMChain(llm=llm, prompt=prompt, verbose=True)
q = "你好,你有什么功能?"
response = chat_chain.run(question=q,verbose=True)  # 终端用户的提问字符串
print(response)

第二种形式

from openai import OpenAI
# Set OpenAI's API key and API base to use vLLM's API server.
openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"

client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)

chat_response = client.chat.completions.create(
    model="Qwen/Qwen2.5-7B-Instruct",
    messages=[
        {"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},
        {"role": "user", "content": "Tell me something about large language models."},
    ],
    temperature=0.7,
    top_p=0.8,
    max_tokens=512,
    extra_body={
        "repetition_penalty": 1.05,
    },
)
print("Chat response:", chat_response)

第三步:加载模型后,添加chain,应用流式输出

prompt = ChatPromptTemplate.from_template("讲一个关于 {topic}的笑话")
output_parser = StrOutputParser()

chain = prompt | model | output_parser

import asyncio

# 定义一个异步函数来处理异步生成器
async def main():
    async for chunk in chain.astream("冰淇淋"):
        print(chunk, end="|", flush=True)

# 运行异步主函数
asyncio.run(main())

或者

prompt = ChatPromptTemplate.from_template("讲一个关于 {topic}的笑话")
output_parser = StrOutputParser()

chain = prompt | model | output_parser
 for chunk in chain.stream("冰淇淋"):
     print(chunk, end="|", flush=True)

完整的代码如下:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

from langchain_community.chat_models import ChatOpenAI

import os
from langchain.chat_models import ChatOpenAI

os.environ['OPENAI_API_KEY'] = 'none'
os.environ['OPENAI_BASE_URL'] = 'http://localhost:8000/v1'
model = ChatOpenAI(temperature=0, model='modelscope/hub/qwen/Qwen2-7B-Instruct')

prompt = ChatPromptTemplate.from_template("讲一个关于 {topic}的笑话")
output_parser = StrOutputParser()

chain = prompt | model | output_parser

import asyncio

# # 定义一个异步函数来处理异步生成器
# async def main():
#     async for chunk in chain.astream("冰淇淋"):
#         print(chunk, end="|", flush=True)
# # 运行异步主函数
# asyncio.run(main())
# 
for chunk in chain.stream("冰淇淋"):
    print(chunk, end="|", flush=True)
### 使用 LangChain 和 Ollama 实现流式输出 为了实现使用 LangChain 和 Ollama 的流式输出功能,可以利用 `LangChain` 提供的工具以及其表达式语言(LCEL)。以下是具体方法: #### 1. 安装必要的依赖项 首先需要安装支持 LangChain 和 Ollama 的 Python 库。可以通过以下命令完成安装: ```bash pip install langchain ollama ``` #### 2. 初始化 Ollama 模型并配置流式传输 Ollama 支持通过 HTTP API 进行交互,并允许设置参数以启用流式响应。下面是一个简单的代码示例展示如何初始化模型并与之通信。 ```python from langchain.llms import Ollama from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler # 创建 Ollama LLM 对象 ollama_model = Ollama( model="llama2", # 替换为你想要使用的特定模型名称 callbacks=[StreamingStdOutCallbackHandler()], # 添加回调处理器用于处理流数据 ) # 测试查询 response = ollama_model("解释一下量子计算的概念是什么?") print(response) ``` 上述代码片段展示了如何创建一个基于 Ollama 的大语言模型实例,并启用了标准输出流式的回调机制[^1]。 #### 3. 利用 LangChain 工具增强功能性 除了基础的 LLM 调用外,还可以借助于 LangChain 中的各种实用函数和模块进一步扩展应用能力。例如,可引入 `langchain.utils` 来辅助预处理输入或后处理输出结果[^2]。 另外,如果希望构建更复杂的对话流程或者多步推理逻辑,则应该考虑采用 LangChain 提供的 Chains 或 Agents 架构[^3]。这些高级特性能够帮助开发者快速搭建具备动态行为的应用程序。 #### 注意事项 - 确认本地已正确部署好 Ollama 并运行服务端口监听。 - 根据实际需求调整超参比如温度值、最大长度等影响生成质量的因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值