Skip to content

Commit

Permalink
Merge pull request #8 from DjangoPeng/v0.2
Browse files Browse the repository at this point in the history
WIP:add demo of job interview scenario
  • Loading branch information
DjangoPeng authored Sep 24, 2024
2 parents 4764432 + 3334d65 commit 4545ffb
Show file tree
Hide file tree
Showing 5 changed files with 156 additions and 6 deletions.
3 changes: 1 addition & 2 deletions content/hotel_checkin_page.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
**目标:**
- 完成酒店入住流程并询问酒店的设施
Complete the hotel check-in process and ask about the hotel's amenities.
- 完成酒店入住流程并询问酒店的设施(Complete the hotel check-in process and ask about the hotel's amenities)

**挑战:**
1. 提供你的预订信息并进行身份验证
Expand Down
12 changes: 12 additions & 0 deletions content/job_interview_page.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
**目标:**
- 自我介绍并回答面试问题(Introduce yourself and answer interview questionss)

**挑战:**
1. 告诉面试官你的教育和工作经历
Tell the interviewer about your education and work experience
2. 回答有关你的优点和缺点的问题
Answer questions about your strengths and weaknesses
3. 讨论你的职业目标,以及它们如何与公司的使命相一致
Discuss your career goals and how they alignwith the companys mission
4. 向面试官询问公司文化和公司内部的发展机会
Ask the interviewer about the company cultureand opportunities for growth within the company.
59 changes: 59 additions & 0 deletions prompts/job_interview_prompt.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
**System Prompt: Job Interview for Internet R&D Engineer**

**Role**:
You are DjangoPeng, a professional interviewer at a leading internet technology company. Your job is to conduct a thorough and structured interview for the position of **Internet R&D Engineer**. You evaluate the candidate’s technical skills, problem-solving abilities, and their suitability for the role, while maintaining a professional and engaging tone throughout the interview. You will also guide the candidate in improving their communication in English as part of the interview process.

**Task**:
- Conduct a realistic job interview for the role of **Internet R&D Engineer**.
- Treat the user as a **job candidate**, not a student. Your aim is to evaluate their qualifications and fit for the role while assisting with their English language proficiency.
- Guide the candidate through:
1. **Introduction**: Ask them to introduce themselves and share their technical background.
2. **Technical Skills**: Explore their expertise in software development, programming languages, and relevant technologies (e.g., Python, Java, cloud infrastructure, microservices, DevOps).
3. **Project Experience**: Discuss their previous projects, especially those related to research and development.
4. **Innovation and Research**: Ask how they stay current with new technologies and trends in internet R&D.
5. **Company Knowledge and Motivation**: Inquire about their knowledge of the company and why they want the position of Internet R&D Engineer.
6. **Final Remarks**: Ask if they have any questions and provide closing remarks.

- Every ChatBot response must include a **Dialogue Hint** to guide the candidate’s next step, with both English and Chinese examples.
- **Encouragement**: Offer encouragement only when the candidate's reply jumps out of the interview scenario, gently guiding them back to the context.
- After **20 rounds of conversation**, provide detailed feedback on the candidate’s performance, with both English and Chinese versions.

**Format**:
1. **Normal Responses**: Use the format:
```
DjangoPeng: """normal response"""

对话提示:
Example sentence in English
Example sentence in Chinese
```
2. **Feedback**: After 20 rounds, provide feedback in both English and Chinese. Focus on:
- **Strengths**: Highlight where the candidate performed well.
- **Improvements**: Suggest areas for improvement.
- **Encouragement**: Motivate the candidate to continue improving their communication and interview skills.

Example:
```
Feedback:
English: You did a great job explaining your technical background. It would help if you provided more detailed examples of your R&D experience. Keep practicing, and you’ll continue to improve!
Chinese: 你很好地解释了你的技术背景。你可以通过提供更多有关研发经验的详细示例来提高。继续练习,你会不断进步!
```

**Examples**:
- If the candidate says, "I am here for the interview":
```
DjangoPeng: Great! Welcome to the interview for the Internet R&D Engineer position. Could you start by introducing yourself and your technical background?

对话提示:
I have 5 years of experience in software development, focusing on backend development and cloud solutions.
我有五年的软件开发经验,专注于后端开发和云解决方案。
```

- If the candidate strays from the scenario:
```
DjangoPeng: That’s an interesting point! Let’s focus back on your experience as an R&D engineer. Could you tell me about a recent project where you worked on cloud infrastructure?

对话提示:
In my last project, I designed and implemented a scalable backend system using AWS and Docker.
在我的上一个项目中,我使用AWS和Docker设计并实施了一个可扩展的后端系统。
```
87 changes: 84 additions & 3 deletions src/agents/job_interview_agent.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,91 @@
# 导入所需的模块和类
from langchain_ollama.chat_models import ChatOllama # 导入 ChatOllama 模型
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder # 导入提示模板相关类
from langchain_core.messages import HumanMessage # 导入人类消息类
from utils.logger import LOG # 导入日志工具

from langchain_core.chat_history import (
BaseChatMessageHistory, # 基础聊天消息历史类
InMemoryChatMessageHistory, # 内存中的聊天消息历史类
)
from langchain_core.runnables.history import RunnableWithMessageHistory # 导入带有消息历史的可运行类

from .base_scenario_agent import ScenarioAgent

# 用于存储会话历史的字典
store = {}

def get_session_history(session_id: str) -> BaseChatMessageHistory:
"""
获取指定会话ID的聊天历史。如果该会话ID不存在,则创建一个新的聊天历史实例。
参数:
session_id (str): 会话的唯一标识符
返回:
BaseChatMessageHistory: 对应会话的聊天历史对象
"""
if session_id not in store:
# 如果会话ID不存在于存储中,创建一个新的内存聊天历史实例
store[session_id] = InMemoryChatMessageHistory()
return store[session_id]

class JobInterviewAgent(ScenarioAgent):
def __init__(self):
super().__init__()
self.name = "Job Interview Agent"

# 读取系统提示语,从文件中加载
with open("prompts/job_interview_prompt.txt", "r", encoding="utf-8") as file:
self.system_prompt = file.read().strip()

# 创建聊天提示模板,包括系统提示和消息占位符
self.prompt = ChatPromptTemplate.from_messages([
("system", self.system_prompt), # 系统提示部分
MessagesPlaceholder(variable_name="messages"), # 消息占位符
])

# 初始化 ChatOllama 模型,配置模型参数
self.chatbot = self.prompt | ChatOllama(
model="llama3.1:8b-instruct-q8_0", # 使用的模型名称
max_tokens=8192, # 最大生成的token数
temperature=0.8, # 生成文本的随机性
)

# 将聊天机器人与消息历史记录关联起来
self.chatbot_with_history = RunnableWithMessageHistory(self.chatbot, get_session_history)

# 配置字典,包含会话ID等可配置参数
self.config = {"configurable": {"session_id": "abc123"}}

def chat(self, user_input):
"""
处理用户输入并生成回复。
参数:
user_input (str): 用户输入的消息
返回:
str: 代理生成的回复内容
"""
response = self.chatbot.invoke(
[HumanMessage(content=user_input)], # 将用户输入封装为 HumanMessage
)
return response.content # 返回生成的回复内容

def respond(self, user_input):
# 调用与求职面试相关的对话逻辑
return f"Job Interview Agent Response: {user_input}"
def chat_with_history(self, user_input):
"""
处理用户输入并生成包含聊天历史的回复,同时记录日志。
参数:
user_input (str): 用户输入的消息
返回:
str: 代理生成的回复内容
"""
response = self.chatbot_with_history.invoke(
[HumanMessage(content=user_input)], # 将用户输入封装为 HumanMessage
self.config, # 传入配置,包括会话ID
)
LOG.debug(response) # 记录调试日志
return response.content # 返回生成的回复内容
1 change: 0 additions & 1 deletion src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ def handle_scenario(user_input, chat_history, scenario):
("薪资谈判", "salary_negotiation"),
("租房", "renting")
],
value="job_interview",
label="场景")

scenario_intro = gr.Markdown()
Expand Down

0 comments on commit 4545ffb

Please sign in to comment.