Spaces:
Sleeping
Sleeping
| from langchain_huggingface import HuggingFacePipeline as HF, ChatHuggingFace as Ch | |
| from subprocess import Popen, PIPE as P | |
| from langchain_experimental.tools.python.tool import PythonREPLTool as PYT | |
| from langchain.agents import load_tools, create_structured_chat_agent as Agent,AgentExecutor as Ex, AgentType as Type | |
| from langchain.agents.agent_toolkits import create_retriever_tool as crt | |
| from langchain_community.agent_toolkits import FileManagementToolkit as FMT | |
| from langchain.tools import Tool | |
| from langchain.memory import ConversationBufferMemory as MEM,RedisChatMessageHistory as HIS | |
| from langchain.schema import SystemMessage as SM,HumanMessage as HM, AIMessage as AM | |
| from langchain import hub | |
| import os | |
| from langchain_core.prompts.chat import ChatPromptTemplate, MessagesPlaceholder | |
| system = '''Respond to the human as helpfully and accurately as possible. You have access to the following tools: | |
| {tools} | |
| Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input). | |
| Valid "action" values: "Final Answer" or {tool_names} | |
| Provide only ONE action per $JSON_BLOB, as shown: | |
| ``` | |
| {{ | |
| "action": $TOOL_NAME, | |
| "action_input": $INPUT | |
| }} | |
| ``` | |
| Follow this format: | |
| Question: input question to answer | |
| Thought: consider previous and subsequent steps | |
| Action: | |
| ``` | |
| $JSON_BLOB | |
| ``` | |
| Observation: action result | |
| (repeat Thought/Action/Observation N times) | |
| Thought: I know what to respond | |
| Action: | |
| ``` | |
| {{ | |
| "action": "Final Answer", | |
| "action_input": "Final response to human" | |
| }} | |
| Begin! Reminder to ALWAYS respond with a valid json blob of a single action. Use tools if necessary. Respond directly if appropriate. Format is Action:```$JSON_BLOB```then Observation''' | |
| human = ''' | |
| {input} | |
| {agent_scratchpad} | |
| (reminder to respond in a JSON blob no matter what)''' | |
| prompt = ChatPromptTemplate.from_messages( | |
| [ | |
| ("system", system), | |
| MessagesPlaceholder("chat_history", optional=True), | |
| ("human", human), | |
| ] | |
| ) | |
| from typing import Any, Dict, List, Optional | |
| from langchain_core.language_models import BaseChatModel | |
| from langchain_core.messages import AIMessage, BaseMessage, HumanMessage | |
| from langchain_core.outputs import ChatResult, ChatGeneration | |
| from langchain_core.callbacks.manager import CallbackManagerForLLMRun | |
| from langchain_core.callbacks.manager import AsyncCallbackManagerForLLMRun | |
| from langchain_core.runnables import run_in_executor | |
| from transformers import AutoTokenizer, AutoModelForCausalLM | |
| import torch | |
| class Chatchat(BaseChatModel): | |
| model_name: str = "peterpeter8585/deepseek_1" | |
| tokenizer : AutoTokenizer = None | |
| model: AutoModelForCausalLM = None | |
| model_path: str = None | |
| def __init__(self, model_path, **kwargs: Any) -> None: | |
| super().__init__(**kwargs) | |
| if model_path is not None: | |
| self.model_name = model_path | |
| self.tokenizer = AutoTokenizer.from_pretrained(self.model_name, trust_remote_code=True) | |
| self.model = AutoModelForCausalLM.from_pretrained( | |
| self.model_name, trust_remote_code=True) | |
| def _call( | |
| self, | |
| prompt: str, | |
| stop: Optional[List[str]] = None, | |
| run_manager: Optional[CallbackManagerForLLMRun] = None, | |
| **kwargs: Any, | |
| ) -> str: | |
| # Load and preprocess the image | |
| messages = [ | |
| {"role": "system", "content": "You are Chatchat.A helpful assistant at code."}, | |
| {"role": "user", "content": prompt} | |
| ] | |
| text = self.tokenizer.apply_chat_template( | |
| messages, | |
| tokenize=False, | |
| add_generation_prompt=True | |
| ) | |
| model_inputs = self.tokenizer([text], return_tensors="pt").to(self.model.device) | |
| generated_ids = self.model.generate( | |
| **model_inputs, | |
| max_new_tokens=512 | |
| ) | |
| generated_ids = [ | |
| output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids) | |
| ] | |
| response = self.tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0] | |
| return response | |
| async def _acall( | |
| self, | |
| prompt: str, | |
| stop: Optional[List[str]] = None, | |
| run_manager: Optional[AsyncCallbackManagerForLLMRun] = None, | |
| **kwargs: Any, | |
| ) -> str: | |
| # Implement the async logic to generate a response from the model | |
| return await run_in_executor( | |
| None, | |
| self._call, | |
| prompt, | |
| stop, | |
| run_manager.get_sync() if run_manager else None, | |
| **kwargs, | |
| ) | |
| def _llm_type(self) -> str: | |
| return "custom-llm-chat" | |
| def _identifying_params(self) -> Dict[str, Any]: | |
| return {"model_name": self.model_name} | |
| def _generate( | |
| self, | |
| messages: List[BaseMessage], | |
| stop: Optional[List[str]] = None, | |
| run_manager: Optional[CallbackManagerForLLMRun] = None, | |
| **kwargs: Any, | |
| ) -> ChatResult: | |
| # Assumes the first message contains the prompt and the image path is in metadata | |
| prompt = messages[0].content | |
| response_text = self._call(prompt, stop, run_manager, **kwargs) | |
| # Create AIMessage with the response | |
| ai_message = AIMessage(content=response_text) | |
| return ChatResult(generations=[ChatGeneration(message=ai_message)]) | |
| llm=Chatchat(model_path=None) | |
| #from transformers import pipeline,AutoModelForCausalLM as M,AutoTokenizer as T | |
| #m=M.from_pretrained("peterpeter8585/syai4.3") | |
| #t=T.from_pretrained("peterpeter8585/syai4.3") | |
| #pipe=pipeline(model=m,tokenizer=t,task="text-generation") | |
| #llm=HF.from_model_id(model_id="peterpeter8585/syai4.6",task="text-generation") | |
| from langchain.retrievers import WikipediaRetriever as Wiki | |
| import gradio as gr | |
| chatbot = gr.Chatbot( | |
| label="SYAI4.1", | |
| show_copy_button=True, | |
| layout="panel" | |
| ) | |
| def terminal(c): | |
| a=Popen(c,shell=True,stdin=P,stdout=P,stderr=P) | |
| return a.stdout.read()+a.stderr.read() | |
| tools=FMT().get_tools() | |
| tools.append(PYT()) | |
| tools.extend(load_tools(["requests_all"],allow_dangerous_tools=True)) | |
| tools.extend(load_tools(["llm-math","ddg-search"],llm=llm)) | |
| tools.append(Tool.from_function(func=terminal,name="terminal",description="터미널 명령어실행에 적합함")) | |
| tools.append(crt(name="wiki",description="위키 백과를 검색하여 정보를 가져온다",retriever=Wiki(lang="ko",top_k_results=1))) | |
| def chat(message, | |
| history: list[tuple[str, str]], | |
| system_message, | |
| max_tokens, | |
| temperature, | |
| top_p, chat_session): | |
| messages=[SM(content=system_message+"And, Your name is Chatchat")] | |
| for val in history: | |
| if val[0]: | |
| messages.append(HM(content=val[0])) | |
| if val[1]: | |
| messages.append(AM(content=val[1])) | |
| messages.append(HM(content=message)) | |
| memory=MEM(memory_key="history") | |
| agent=Ex(agent=Agent(llm,tools,prompt),tools=tools,verbose=True,handle_parsing_errors=True,memory=memory) | |
| return agent.invoke({"input":messages,"chat_history":memory.buffer_as_messages}) | |
| ai1=gr.ChatInterface( | |
| chat, | |
| chatbot=chatbot, | |
| additional_inputs=[ | |
| gr.Textbox(value="You are a helpful assistant.", label="System message", interactive=True), | |
| gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"), | |
| gr.Slider(minimum=0.1, maximum=4.0, value=0.1, step=0.1, label="Temperature"), | |
| gr.Slider( | |
| minimum=0.1, | |
| maximum=1.0, | |
| value=0.1, | |
| step=0.05, | |
| label="Top-p (nucleus sampling)", | |
| ), | |
| gr.Textbox(label="chat_id(please enter the chat id!)") | |
| ], | |
| ) | |
| ai1.launch() |