Langchain / app.py
罗峰
app commit
6aaffa2
import os
import gradio as gr
from langchain.agents import initialize_agent,AgentType
from langchain.chat_models import AzureChatOpenAI
from langchain.chains.conversation.memory import ConversationBufferWindowMemory
import torch
from transformers import BlipProcessor,BlipForConditionalGeneration
import requests
from PIL import Image
from langchain.tools import BaseTool
from langchain.chains import LLMChain
from langchain import PromptTemplate, FewShotPromptTemplate
OPENAI_API_KEY=os.getenv("OPENAI_API_KEY")
OPENAI_API_BASE=os.getenv("OPENAI_API_BASE")
DEP_NAME=os.getenv("deployment_name")
llm=AzureChatOpenAI(deployment_name=DEP_NAME,openai_api_base=OPENAI_API_BASE,openai_api_key=OPENAI_API_KEY,openai_api_version="2023-03-15-preview",model_name="gpt-3.5-turbo")
image_to_text_model="Salesforce/blip-image-captioning-large"
device= 'cuda' if torch.cuda.is_available() else 'cpu'
processor=BlipProcessor.from_pretrained(image_to_text_model)
model=BlipForConditionalGeneration.from_pretrained(image_to_text_model).to(device)
def descImage(image_url):
image_obj=Image.open(image_url).convert('RGB')
inputs=processor(image_obj,return_tensors='pt').to(device)
outputs=model.generate(**inputs)
return processor.decode(outputs[0],skip_special_tokens=True)
def toChinese(en:str):
pp="翻译下面语句到中文\n{en}"
prompt = PromptTemplate(
input_variables=["en"],
template=pp
)
llchain=LLMChain(llm=llm,prompt=prompt)
return llchain.run(en)
class DescTool(BaseTool):
name="Describe Image Tool"
description="use this tool to describe an image"
def _run(self,url:str):
description=descImage(url)
return description
def _arun(
self,query:str):
raise NotImplementedError('未实现')
tools=[DescTool()]
memory=ConversationBufferWindowMemory(
memory_key='chat_history',
k=5,
return_messages=True
)
agent=initialize_agent(
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
tools=tools,
llm=llm,
verbose=False,
max_iterations=3,
early_stopping_method='generate',
memory=memory
)
def reset_user_input():
return gr.update(value='')
def reset_state():
return [], []
def predict(file,input):
input1=f""+input+"\n"+file
out=agent(input1)
anws = toChinese(out['output'])
# chatbot.append(input)
# chatbot[-1] = (input, anws)
# yield chatbot, history
return anws
# with gr.Blocks(css=".chat-blocks{height:calc(100vh - 332px);} .mychat{flex:1} .mychat .block{min-height:100%} .mychat .block .wrap{max-height: calc(100vh - 330px);} .myinput{flex:initial !important;min-height:180px}") as demo:
# title = '图像识别'
# demo.title=title
# with gr.Column(elem_classes="chat-blocks"):
# with gr.Row(elem_classes="mychat"):
# file = gr.Image(type="filepath")
# chatbot = gr.Chatbot(label="图像识别", show_label=False)
# with gr.Column(elem_classes="myinput"):
# user_input = gr.Textbox(show_label=False, placeholder="请描述您的问题", lines=1).style(
# container=False)
# submitBtn = gr.Button("提交", variant="primary", elem_classes="btn1")
# emptyBtn = gr.Button("清除历史").style(container=False)
#
# history = gr.State([])
# submitBtn.click(predict, [file,user_input, chatbot,history], [chatbot, history],
# show_progress=True)
# submitBtn.click(reset_user_input, [], [user_input])
# emptyBtn.click(reset_state, outputs=[chatbot, history], show_progress=True)
with gr.Blocks() as demo:
image_url = gr.Image(type="filepath",label="请选择一张图片")
input = gr.Textbox(label='请描述您的问题', placeholder="", lines=1)
output = gr.Textbox(label='答案', placeholder="", lines=2,interactive=False)
submit = gr.Button('提问',variant="primary")
submit.click(predict,inputs=[image_url,input],outputs=output)
demo.launch()